我想从mcrypt_encrypt()转移到openssl_encrypt()进行AES 256加密
但是加密的数据是不同的!
例如,mcrypt_encrypt()输出:
Od2i8FHmWvMeXt+HwCy7k93koPVClK1erHsZwoB6sUE=和openssl_encrypt()输出:
Od2i8FHmWvMeXt+HwCy7kyCt0nvHTaO4IdjdiF15LAc= 我的代码:
<?php
$encryption_key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(16);
$data = "Here's some data to encrypt!";
$encrypted = openssl_encrypt($data, "aes-256-cbc", $encryption_key, 0, $iv);
echo "encrypted: $encrypted\n\n";
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryption_key, $data, MCRYPT_MODE_CBC, $iv));
echo "encrypted: $encrypted\n\n";
?>有什么问题吗?谢谢
发布于 2018-03-09 21:29:36
最有可能是填充物。注意,第一个块对于每个块都是相同的,最后一个块是不同的。
正在加密的文本是28个字节,所以最后一个块将有4个字节的填充: 16-( 28 %16) = 4。
PHP不支持标准PKCS#7 (née PKCS#5)填充,只支持非标准的空填充。
因此,PHP mcrypt将指定4字节的0x00和openssl 4字节的0x04。见PKCS#7填充。
因此,如果您想用openssl_encrypt创建相同的加密输出,您也需要指定零填充选项(OPENSSL_ZERO_PADDING) 和自己添加空填充。注意:空填充不健壮,因为它不能正确处理所有二进制数据。
示例:openssl_encrypt($data, "aes-256-cbc", $encryption_key, OPENSSL_ZERO_PADDING, $iv);
mcrypt_encrypt():
Base64:Od2i8FHmWvMeXt+HwCy7k93koPVClK1erHsZwoB6sUE=
十六进制:39DDA2F051E65AF31E5EDF87C02CBB93 DDE4A0F54294AD5EAC7B19C2807AB141
openssl_encrypt:
Base64:Od2i8FHmWvMeXt+HwCy7kyCt0nvHTaO4IdjdiF15LAc=
十六进制:39DDA2F051E65AF31E5EDF87C02CBB93 20ADD27BC74DA3B821D8DD885D792C07
https://stackoverflow.com/questions/49202056
复制相似问题