2013-02-08 39 views
2

Я использую Zend2 Crypt module для шифрования данных. Вот мой код.Как расшифровать зашифрованные данные Zend2?

$cipher = BlockCipher::factory('mcrypt', array(
    'algorithm' => 'aes', 
)); 
$cipher->setKey('mypassphrase'); 
$encrypted = $cipher->encrypt('Hey, I am the secret data'); 

Прохладный, он работает хорошо! Теперь мне нужно расшифровать данные $encrypted (Эй, я секретные данные) в Python.

Я использую pycrypto для этого. Какие шаги для дешифрования данных за пределами моей PHP-среды?

from Crypto.Cipher import AES 
    import base64 
    import hashlib 

    password = 'mypassphrase' 
    key = hashlib.sha256(password).digest() 

    decoded = base64.standard_b64decode(encrypted) 
    cipher = AES.new(key, AES.MODE_CBC) 
    data = cipher.decrypt(decoded) 

мне нужно указать IV, потому что Zend использует MODE_CBC по умолчанию. Как я могу указать его в моем коде Python?

Вот документация Zend2:

Выход шифрования является строкой, закодированной в Base64 (по умолчанию), который содержит значение HMAC, вектор IV, и зашифрованный текст. Используемый режим шифрования - это CBC (со случайным IV по умолчанию) и SHA256 как хэш-алгоритм по умолчанию HMAC. Адаптер Mcrypt шифрует с использованием механизма заполнения PKCS # 7 по умолчанию. Вы можете указать другой метод заполнения, используя специальный адаптер для этого (Zend \ Crypt \ Symmetric \ Padding). Ключи шифрования и аутентификации, используемые блочным кодом, генерируются с помощью алгоритма PBKDF2, который используется как функция деривации ключа из ключа пользователя, указанного с помощью метода setKey().

Может ли кто-нибудь помочь мне адаптировать мой код на Python для дешифрования данных? Thanks

+1

Извините, но просто создавая любой код AES, который использует 'mypassphrase', не сокращает его для меня. Где PBKDF2 и HMAC ушли? –

ответ

3

Я нашел способ расшифровать данные, зашифрованные Zend2. Вот мой код:

from base64 import b64decode 
from Crypto import Random 
from Crypto.Cipher import AES 
from Crypto.Hash import SHA256, HMAC 
from Crypto.Protocol.KDF import PBKDF2 

# The hmac starts from 0 to 64 (length). 
hmac_size = 64 
hmac = data[:hmac_size] 

# The cipher text starts after the hmac to the end. 
# The cipher text is base64 encoded, so I decoded it. 
ciphertext = data[hmac_size:] 
ciphertext = b64decode(ciphertext) 

# The IV starts from 0 to 16 (length) of the ciphertext. 
iv = ciphertext[:16] 

# The key size is 256 bits -> 32 bytes. 
key_size = 32 

# The passphrase of the key. 
password = 'mypassphrase' 

# The key is generated using PBKDF2 Key Derivation Function. 
# In the case of Zend2 Crypt module, the iteration number is 5000, 
# the result length is the key_size * 2 (64) and the HMAC is computed 
# using the SHA256 algorithm 
the_hash = PBKDF2(password, iv, count=5000, dkLen=64, prf=lambda p, s: 
        HMAC.new(p, s, SHA256).digest()) 

# The key starts from 0 to key_size (32). 
key = the_hash[:key_size] 

# The hmac key starts after the key to the end. 
key_hmac = the_hash[key_size:] 

# HMAC verification 
hmac_new = HMAC.new(key_hmac, 'aes%s' % ciphertext, SHA256).hexdigest() 
if hmac_new != hmac: 
    raise Exception('HMAC verification failed.') 

# Instanciate the cipher (AES CBC). 
cipher = AES.new(key, AES.MODE_CBC, iv) 

# It's time to decrypt the data! The ciphertext starts after the IV (so, 16 after). 
data = cipher.decrypt(ciphertext[16:]) 

Миссия удалось!

+0

Быстрый вопрос: я знаю, что это старый вопрос, но как вы узнали, что вам нужно добавить какой-то текст в зашифрованный текст для проверки hmac ('aes% s'% ciphertext)? Я посмотрел документацию ZF2, но я не мог найти никакой ссылки на это. спасибо за помощь. – ErezSO

+0

В настоящее время я боюсь этой же проблемы (кроме того, что я дешифруюсь на Java). Класс BlockCipher в Zend Crypt показывает, что при вычислении хэша он добавляет имя алгоритма к зашифрованному тексту. https://github.com/zendframework/zend-crypt/blob/757e4fcfa321585833aebca688d319c2c52d319e/src/BlockCipher.php Посмотрите на строку 438 –

Смежные вопросы