Pycrypto aes 256初始化矢量大小

use*_*287 4 python google-app-engine aes pycrypto

这里的情况我有一个PHP脚本使用aes256,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)
Run Code Online (Sandbox Code Playgroud)

和我得到的错误

<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>
Run Code Online (Sandbox Code Playgroud)

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') );
  }
Run Code Online (Sandbox Code Playgroud)

我不能改变IV大小

请注意,我不太熟悉Python,只需要一种加密数据的方法,因为它将是一个引擎.

Ste*_*sop 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的含义不一样.

因此,您使用密码加密和解密,虽然相关,但可能完全不同.

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

  • @ user80287,Steve:实际上,MCRYPT_RIJNDAEL_128("具有128位块大小的Rijndael")是AES的所有三个版本 - 只需传递正确大小的密钥,它将选择正确的算法(AES-128,AES-192, AES-256).(但是,如果您无法更改PHP脚本,这将无济于事.) (2认同)