Python 3.x 使用PyCrypto使用32字节初始化向量解密MCRYPT_RIJNDAEL_256

Python 3.x 使用PyCrypto使用32字节初始化向量解密MCRYPT_RIJNDAEL_256,python-3.x,aes,pycrypto,rijndael,cbc-mode,Python 3.x,Aes,Pycrypto,Rijndael,Cbc Mode,我有用PHP加密的数据,如下所示: mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECRET, $data, MCRYPT_MODE_CBC, $iv) 我需要在Python3应用程序中解密这些数据。我正在尝试使用PyCrypto,但我对其他库开放。我希望以下措施能够奏效: decryptor = AES.new(key, mode, IV=IV) plain = decryptor.decrypt(ciphertext) 我的初始化向量是32字节,并引发以下异常

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

mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECRET, $data, MCRYPT_MODE_CBC, $iv)
我需要在Python3应用程序中解密这些数据。我正在尝试使用PyCrypto,但我对其他库开放。我希望以下措施能够奏效:

decryptor = AES.new(key, mode, IV=IV)
plain = decryptor.decrypt(ciphertext)
我的初始化向量是32字节,并引发以下异常:

ValueError: IV must be 16 bytes long
如何将PyCrypto设置为使用32字节的初始化向量和32字节的块大小?
或者,是否有其他库可用于解密数据?

多亏了这些评论,我实现了一个合适的解决方案。我在链接的重复问题中修改了
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位。

您不能将AES设置为32字节块大小,因为AES仅为16字节块大小定义。您必须找到python的Rijndael 256/256(假设您的密钥也是32字节长)实现。的可能重复。在谷歌搜索中看到自己的答案总是很有趣的。谢谢。这似乎实现了分组密码,但不是CBC加密模式。是否有一个CBC实现可以与我的32字节初始化向量一起使用?实现CBC并不是那么难,因为它主要是XORing,所以在该模式上发生侧通道攻击的风险很小。PHP填充模式是添加0..15个零,直到达到块大小。是的,AES是Rijndael,块大小为128位,密钥大小为128、192或256位(具有正常的轮数和常量)。我不确定解密例程是否正确,它似乎只适用于单个块。我会尝试更正它,并在另一个答案中发布一个解决方案。完成后,看一看,别忘了对另一个答案进行投票!没错,这个答案只适用于单个块。感谢您提供的完整解决方案。@gavinmh很想知道您所做的“接受字节而不是字符串”的修改。