使用PyCrypto解密MCRYPT_RIJNDAEL_256和32字节初始化向量

时间:2014-12-06 16:59:12

标签: python-3.x aes pycrypto rijndael cbc-mode

我的数据是用PHP加密的,如下所示:

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 个答案:

答案 0 :(得分: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错误地将数据块大小设置为初始向量大小,因此等于密钥大小。据我所知,AES-Rijndael的数据块大小应始终为128位。