openssl_encrypt VS mcrypt_encrypt
openssl_encrypt VS mcrypt_encrypt
我必须在 CBC 模式下进行 AES 128 加密,并将其与 coldfusion 中的相同 AES 加密相匹配。
这是我在 PHP 中的代码:
function pkcs5_pad($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
$key = "vRJ6XSUi7OGebUK+n1vKkA==";
$iv = "AF9iPTpJC+zEa2auUxuloQ==";
$data = $this->pkcs5_pad("Message to encrypt", 16);
echo openssl_encrypt($data, 'aes-128-cbc', $key, 0, base64_decode($iv));
echo "<br>";
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, base64_decode($iv)));
mcrypt_encrypt 已折旧,但给我的结果与 coldfusion 相同:qLz13+xk19lZjSbfs92Ze5akuDbWOsNF2rYZN7aaEHc=
但 openssl_encrypt 给了我一个不同的值:dnEcUy2tmvLZhZclnEwRpYHEbHajzmkpwbPorfNw5eN4d37MadEiPGLPvNAZmW4Q
如何让 openssl_encrypt 的值与 mcrypt_encrypt 的值相同?不应该是它的替代品吗?
两个问题:
您没有对密钥进行 Base64 解码,因此您将 24 字节(= 192 位)密钥传递给 openssl_encrypt
和 mcrypt_encrypt
。显然,这些函数以不同的方式解释这样的键! base64_decode
获得一致结果的关键。
或者,如果您真的想使用 Base64 编码的字符串作为 192 位密钥,请将 'aes-192-cbc'
作为方法传递给 openssl_encrypt()
。这就是 mcrypt 在这里所做的。 (这与将 MCRYPT_RIJNDAEL_192
作为密码传递时发生的情况不同——这会更改 块 大小,而不是密钥大小!)
openssl_encrypt
自动使用 PKCS5 填充。在将数据传递给此函数之前填充数据最终会使数据被填充两次,使其比预期长一个块。
解决了这些问题后,两个函数现在给出相同的结果。
我必须在 CBC 模式下进行 AES 128 加密,并将其与 coldfusion 中的相同 AES 加密相匹配。
这是我在 PHP 中的代码:
function pkcs5_pad($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
$key = "vRJ6XSUi7OGebUK+n1vKkA==";
$iv = "AF9iPTpJC+zEa2auUxuloQ==";
$data = $this->pkcs5_pad("Message to encrypt", 16);
echo openssl_encrypt($data, 'aes-128-cbc', $key, 0, base64_decode($iv));
echo "<br>";
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, base64_decode($iv)));
mcrypt_encrypt 已折旧,但给我的结果与 coldfusion 相同:qLz13+xk19lZjSbfs92Ze5akuDbWOsNF2rYZN7aaEHc=
但 openssl_encrypt 给了我一个不同的值:dnEcUy2tmvLZhZclnEwRpYHEbHajzmkpwbPorfNw5eN4d37MadEiPGLPvNAZmW4Q
如何让 openssl_encrypt 的值与 mcrypt_encrypt 的值相同?不应该是它的替代品吗?
两个问题:
您没有对密钥进行 Base64 解码,因此您将 24 字节(= 192 位)密钥传递给
openssl_encrypt
和mcrypt_encrypt
。显然,这些函数以不同的方式解释这样的键!base64_decode
获得一致结果的关键。或者,如果您真的想使用 Base64 编码的字符串作为 192 位密钥,请将
'aes-192-cbc'
作为方法传递给openssl_encrypt()
。这就是 mcrypt 在这里所做的。 (这与将MCRYPT_RIJNDAEL_192
作为密码传递时发生的情况不同——这会更改 块 大小,而不是密钥大小!)openssl_encrypt
自动使用 PKCS5 填充。在将数据传递给此函数之前填充数据最终会使数据被填充两次,使其比预期长一个块。
解决了这些问题后,两个函数现在给出相同的结果。