openssl_encrypt VS mcrypt_encrypt

时间:2017-08-18 19:31:49

标签: php mcrypt php-openssl

我必须在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 个答案:

答案 0 :(得分:3)

两个问题:

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

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

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

  3. 修复这些问题后,这两个函数现在都会产生相同的结果。