用 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中文网其他相关文章!