这是我真正关心的问题:与使用python 2.7中的Crypto.cipher AES进行加密相比,使用mcrypt_encrypt使用相同的密钥,iv,模式和填充进行加密的结果产生了不同的密码,但仅当使用OFB模式时才如此。这是我的示例:
$key = 'SUPER_SECRET_KEY';
$iv = '0000000000000000';
$data = "this is a test";
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_OFB, $iv));
结果是: k8Ss4ytOUNvcG96tr+rHdA==
现在是python示例:
from Crypto.Cipher import AES
from base64 import b64encode
key = 'SUPER_SECRET_KEY'
iv = '0'*16
data = "this is a test"
padding = 16 - (len(data) % 16)
data += chr(padding)*padding
print(b64encode(AES.new(key, AES.MODE_OFB, iv).encrypt(data)))
结果是: kzFpEHCJB+2k2498DhyAMw==
它仅在OFB模式下发生。如果我将模式更改为CBC(并且不进行其他更改),则两个结果将是相同的。知道发生了什么吗?
编辑:在PHP中使用openssl_encrypt给我与python代码相同的结果。这使我相信mcrypt_encrypt中存在错误。
$key = "SUPER_SECRET_KEY";
$iv = "0000000000000000";
$data = "this is a test";
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
$cipher = openssl_encrypt($data, "aes-128-ofb", $key, $options=OPENSSL_RAW_DATA, $iv);
echo base64_encode($cipher) ."\n";
DIEA