4

在这种情况下,我有一个使用 aes256 的 php 脚本,CBC 的密钥和 IV 大小都是 32 字节长

data= '123456789abcdef' 
from Crypto.Cipher import AES
a = AES.new('oqufXQ(?bc=6_hR2I3sMZChDpb6dDlw4',2,'fOaiIOkD8*9Xeu_s4_bb87Ox_UG+D9GA')
print a.encrypt(data)

和我得到的错误

<type 'exceptions.ValueError'>: IV must be 16 bytes long
Traceback (most recent call last):
  File "/base/data/home/apps/s~xxxxxxx/1.155074369696961822/main.py", line 4, in <module>

有效的php代码

 echo base64_encode(encrypt('0123456789abcdef'))  ;


 function encrypt($data)
  {
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_256 ,'oqufXQ(?bc=6_hR2I3sMZChDpb6dDlw4', $data , MCRYPT_MODE_CBC, utf8_encode('fOaiIOkD8*9Xeu_s4_bb87Ox_UG+D9GA') );
  }

我无法更改 IV 大小

请注意,我对 Python 不是很熟悉,只需要一种加密数据的方法,因为它将是一个 appengine 。

4

1 回答 1

11

啊哈!

“256”指的是什么存在意见分歧。

AES 具有 128 位的固定块大小,因此“AES 256”表示 128 位块、256 位密钥、14 轮。

但是,Rijndael 允许密钥大小和块大小发生变化。MCRYPT_RIJNDAEL_256块大小设置为 256 的 Rijndael(我不知道有多少轮)。所以它确实需要一个 32 字节的 IV。您的 PHP 脚本使用 AES 256。

这在https://bugs.php.net/bug.php?id=47125中得到了证实——记者认为这是 PHP mcrypt 中的错误,PHP 认为这是 libmcrypt 中的错误,但这不是错误,因为 libmcrypt 确实如此记录什么MCRYPT_RIJNDAEL_256意思(至少 mcrypt 的 linux 手册页确实如此,我的 Google-fu 未能找到任何有关 libmcrypt 的实际文档)。那件事恰好与 AES 256 的含义不同。

因此,您正在使用虽然相关但可能完全不同的密码进行加密和解密。

坏消息是 PyCrypto 中似乎没有 a Crypto.Cipher.RIJNDAEL。如果您可以在 PHP 脚本中将 256 位密钥传递给 MCRYPT_RIJNDAEL_128,那么这将是 AES 256(感谢 Paŭlo)。

于 2011-12-02T11:09:36.643 回答