【发布时间】:2015-02-04 16:44:42
【问题描述】:
我的数据在 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 字节的块大小? 或者,我可以使用其他库来解密数据吗?
【问题讨论】:
-
您不能将 AES 设置为 32 字节块大小,因为 AES 仅针对 16 字节块大小定义。你必须为 python 找到一个 Rijndael 256/256(假设你的密钥也是 32 字节长)实现。
-
Python equivalent of PHP's MCRYPT_RIJNDAEL_256 CBC 的可能副本。在 Google 搜索中看到自己的答案总是很有趣。
-
谢谢。这似乎实现了分组密码,但没有实现 CBC 加密模式。是否有可以与我的 32 字节初始化向量一起使用的 CBC 实现?
-
实现 CBC 并不难,因为它主要是 XORing,因此模式上的侧通道攻击风险很小。 PHP 填充模式是添加 0..15 个零,直到达到块大小。
标签: python-3.x aes pycrypto rijndael cbc-mode