我的数据是用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字节的块大小? 或者,我可以使用不同的库来解密数据吗?
答案 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位。