这是我有一个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)
和我得到的错误
<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,只需要一种加密数据的方法,因为它将是一个引擎。
答案 0 :(得分:11)
啊哈!
“256”指的是意见分歧。
AES的固定块大小为128位,因此“AES 256”表示128位块,256位键,14轮。
但是,Rijndael允许密钥大小和块大小不同。 MCRYPT_RIJNDAEL_256
指的是Rijndael,块大小设置为256(我不知道有多少轮)。所以确实需要一个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中似乎没有Crypto.Cipher.RIJNDAEL
。如果您可以在PHP脚本中将256位密钥传递给MCRYPT_RIJNDAEL_128,那么这将是AES 256(感谢Paŭlo)。