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 的值相同?不应该是它的替代品吗?

两个问题:

  1. 您没有对密钥进行 Base64 解码,因此您将 24 字节(= 192 位)密钥传递给 openssl_encryptmcrypt_encrypt。显然,这些函数以不同的方式解释这样的键! base64_decode 获得一致结果的关键。

    或者,如果您真的想使用 Base64 编码的字符串作为 192 位密钥,请将 'aes-192-cbc' 作为方法传递给 openssl_encrypt()。这就是 mcrypt 在这里所做的。 (这与将 MCRYPT_RIJNDAEL_192 作为密码传递时发生的情况不同——这会更改 大小,而不是密钥大小!)

  2. openssl_encrypt 自动使用 PKCS5 填充。在将数据传递给此函数之前填充数据最终会使数据被填充两次,使其比预期长一个块。

解决了这些问题后,两个函数现在给出相同的结果。