首页 >后端开发 >php教程 >为什么 Mcrypt 和 OpenSSL 对 Blowfish-ECB 产生不同的加密结果?

为什么 Mcrypt 和 OpenSSL 对 Blowfish-ECB 产生不同的加密结果?

Barbara Streisand
Barbara Streisand原创
2024-11-20 19:10:16782浏览

Why Do Mcrypt and OpenSSL Produce Different Encryption Results for Blowfish-ECB?

用 OpenSSL 替换 Mcrypt

问题: 将应用程序从使用 Mcrypt 迁移到 OpenSSL 进行数据加密。加密密码为Blowfish,模式为电子密码本(ECB)。然而,尽管具有相同的参数,Openssl_encrypt 和 Openssl_decrypt 函数的输出与 MCrypt 对应函数的输出不同。

原因:

差异是由 MCrypt 使用的不同填充算法引起的。 Mcrypt 和 OpenSSL。 Mcrypt 使用 PKCS#5 填充,而 OpenSSL 使用 PKCS#7 填充。 PKCS#7 填充需要至少 1 个字节的填充,而 PKCS#5 填充允许 0 个字节的填充长度。此外,Mcrypt 需要 ECB 模式的初始化向量 (IV),即使 ECB 模式不需要 IV。

解决方案:

要解决此问题,请执行以下任一操作:在使用 MCrypt 函数之前使用 PKCS#7 样式填充手动填充输入数据,或使用正确的填充重新加密数据

这是问题中提供的代码的修改版本,它使用 PKCS#7 填充进行 MCrypt:

$key = "anotherpassword1";
$str = "does it work 12";

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str."", MCRYPT_MODE_ECB);
$dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB);
echo(bin2hex($enc).PHP_EOL);
var_dump($dec);

$enc = openssl_encrypt($str, 'bf-ecb', $key, true);
$dec = openssl_decrypt($enc, 'bf-ecb', $key, true);
echo(bin2hex($enc).PHP_EOL);
var_dump($dec);

通过在 MCrypt 之前向输入数据添加 1 个字节的填充加密时,Mcrypt 和 OpenSSL 函数的输出将匹配。注意ECB模式不需要IV,也没有必要提供。

以上是为什么 Mcrypt 和 OpenSSL 对 Blowfish-ECB 产生不同的加密结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn