【发布时间】:2011-12-01 17:37:25
【问题描述】:
这是我有一个使用 aes256 ,CBC 的 php 脚本的情况 密钥和 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 。
【问题讨论】:
-
您不能不更改 IV 大小。 AES 256 是块大小为 16 的块密码,因此当用于任何使用 IV 的标准密码模式时,IV 是一个块大,即 16 个字节。
-
我的 php 脚本使用 32 字节的随机字符串作为 IV,我做错了什么吗? mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);返回 32
-
对不起,我不知道。我希望 CBC 模式下的 AES256 使用一个 IV 块,在加密该明文之前与第一个明文块进行异或。如果 mcrypt 做了一些不同的事情,涉及另外 16 个字节的 IV,那么它不会像 I 所理解的那样使用 CBC 密码模式,这意味着它不会与按我的方式工作的实现互操作明白它。我并没有声称我的理解有什么大不了的,但它与您从 pycrypto 获得的错误消息相匹配,所以我认为密码模式在某种程度上不匹配。
-
哦,我想要检查的一件事是 mcrypt 是否使用 pbkdf2 或其他东西来操纵你给它的所谓的 IV,并将其结果的一部分用作真正的 IV。跨度>
-
添加了加密的php代码,我不认为它使用pbkdf2来派生新的IV,不确定php是否默认这样做
标签: python google-app-engine aes pycrypto