2014-12-06 6 views
3

У меня есть данные, которые были зашифрованы в PHP следующим образом:Расшифровать MCRYPT_RIJNDAEL_256 с векторами инициализации 32-байтных с PyCrypto

mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECRET, $data, MCRYPT_MODE_CBC, $iv) 

Мне нужно, чтобы расшифровать эти данные в приложении Python 3. Я пытаюсь использовать PyCrypto, но я открыт для других библиотек. Я ожидаю, что следующие работы:

decryptor = AES.new(key, mode, IV=IV) 
plain = decryptor.decrypt(ciphertext) 

Мой вектор инициализации 32 байт, а следующее исключение:

ValueError: IV must be 16 bytes long 

Как я могу установить PyCrypto использовать вектор инициализации 32 байт и 32 байт размер блока? В качестве альтернативы, есть ли другая библиотека, которую я могу использовать для дешифрования данных?

+1

Вы не можете установить размер блока AES размером 32 байта, поскольку AES определен только для размера блока по 16 байтов. Вы должны найти Rijndael 256/256 (предполагая, что ваш ключ также имеет длину 32 байта) для python. –

+1

Возможный дубликат [эквивалент Python PHP MCRYPT \ _RIJNDAEL \ _256 CBC] (http://stackoverflow.com/questions/8356689/python-equivalent-of-phps-mcrypt-rijndael-256-cbc). Всегда интересно видеть свои собственные ответы в поиске Google. –

+0

Спасибо. Это похоже на реализацию блочного шифрования, но не на режим шифрования CBC. Есть ли реализация CBC, которую я могу использовать с моими 32-байтными векторами инициализации? – gavinmh

ответ

0

Благодаря комментариям я внедрил подходящее решение. Я изменил rijndael.py в связанном дублированном вопросе, чтобы принимать байты, а не строки. Затем я использую его следующим образом, чтобы дешифровать 32-байтные блоки с 32-байтовыми векторами инициализации.

from rijndael import rijndael 

iv = b'myInitializationVectorfoobarfoob' 
key = b'myKeyfoobarfoobarfoobarfoobarfoo' 
text = b'myCipherTextFoobarfoobarfoobarfo' 

r = rijndael(key, block_size=32) 
plaintext = r.decrypt(text) 
l = ''.join([chr(a^b) for a, b in zip(plaintext.encode('latin-1'), iv)]) 
print(l) 

Обратите внимание, что с помощью этого, а не PyCrypto необходимо только потому, что libmcrypt неправильно устанавливает размер блока данных, и таким образом вектор инициализации размеров, равное ключевых размеры. Насколько я понимаю, размеры блоков данных всегда должны быть 128 бит для AES-Rijndael.

+0

Yep, AES - Rijndael с размером блока 128 бит и размером ключа 128, 192 или 256 бит (с обычным количеством раундов и констант). –

+0

Я не уверен, что процедура дешифрования правильная, она работает только для одного блока. Я попытаюсь исправить это и отправить решение в другом ответе. –

+0

Сделано, взгляните и не забудьте перенести другой ответ! –

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

  • Нет связанных вопросов^_^