3

我有在 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 字节块大小?或者,是否有其他库可用于解密数据?

4

1 回答 1

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)

请注意,使用 this 而不是 PyCrypto 只是必要的,因为 libmcrypt 错误地设置了数据块大小,因此初始化向量大小等于密钥大小。据我了解,AES-Rijndael 的数据块大小应始终为 128 位。

于 2014-12-07T03:15:27.973 回答