PHP中OpenSSL和Mcrypt的输出不同-为什么?
我目前正在开发一个大型应用程序,其中Windows软件需要解密PHP脚本生成的字节流。在花了大量时间调整Windows应用程序和PHP脚本之后,我们终于成功地解密了一个使用Blowfish算法加密的简单字符串 在我们的测试中,我们使用了Mcrypt和OpenSSL,但只有Mcrypt提供了正确的输出(至少是Windows客户端可以理解的输出) 我们目前正在试图理解为什么这两个库的行为不同,以确保我们做了正确的事情。此外,正如我们所读到的,OpenSSL现在被高度推荐,并且提供了比MCrypt更多的功能,我们更希望现在就使用OpenSSL 为了定位错误,我们使用MCrypt和OpenSSL做了一个非常简单的测试,它使用相同的输入,但产生不同的输出。请注意,我们使用空IV仅用于测试目的,我们知道这样做不安全。我们在CBC模式下使用Blowfish,带有256位二进制密钥 MCrypt代码: 输出(Windows客户端正确理解):PHP中OpenSSL和Mcrypt的输出不同-为什么?,php,encryption,openssl,mcrypt,Php,Encryption,Openssl,Mcrypt,我目前正在开发一个大型应用程序,其中Windows软件需要解密PHP脚本生成的字节流。在花了大量时间调整Windows应用程序和PHP脚本之后,我们终于成功地解密了一个使用Blowfish算法加密的简单字符串 在我们的测试中,我们使用了Mcrypt和OpenSSL,但只有Mcrypt提供了正确的输出(至少是Windows客户端可以理解的输出) 我们目前正在试图理解为什么这两个库的行为不同,以确保我们做了正确的事情。此外,正如我们所读到的,OpenSSL现在被高度推荐,并且提供了比MCrypt更多
kc7bO7jTWF8=
OpenSSL代码:
输出:
kc7bO7jTWF/+NdPlZPBxMw==
正如您看到的,这两个输出以相同的值开始,但OpenSSL输出稍大(16字节)。为什么?如果我们不手动填充输入,我们会得到一个不同的输出,它似乎有一个有效的大小,但与MCrypt不同:
输出:
iCug+W0s2lc=
我们怀疑存在填充问题,但目前无法找到解决方案
任何暗示都感谢 经过一些研究,似乎MCrypt使用零字节填充输入,而OpenSSL使用PKCS#7填充,这解释了不相同的输出。通过删除PHP端的手动填充,并在Windows端实现PKCS#7填充,我们获得了相同的结果。另请参见和
$key = hash ("sha256", "toto", true);
$alg = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_CBC;
$data = "tata";
$encrypted = mcrypt_encrypt($alg, $key, $data, $mode, "\0\0\0\0\0\0\0\0");
$encrypted = base64_encode($encrypted);
$key = hash ("sha256", "toto", true);
$method = "BF-CBC";
$data = "tata\0\0\0\0"; //Completely different results if we don’t pad the input ourself
$encrypted = openssl_encrypt($data, $method, $key, true, "\0\0\0\0\0\0\0\0");
$encrypted = base64_encode($encrypted);