Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中OpenSSL和Mcrypt的输出不同-为什么?_Php_Encryption_Openssl_Mcrypt - Fatal编程技术网

PHP中OpenSSL和Mcrypt的输出不同-为什么?

PHP中OpenSSL和Mcrypt的输出不同-为什么?,php,encryption,openssl,mcrypt,Php,Encryption,Openssl,Mcrypt,我目前正在开发一个大型应用程序,其中Windows软件需要解密PHP脚本生成的字节流。在花了大量时间调整Windows应用程序和PHP脚本之后,我们终于成功地解密了一个使用Blowfish算法加密的简单字符串 在我们的测试中,我们使用了Mcrypt和OpenSSL,但只有Mcrypt提供了正确的输出(至少是Windows客户端可以理解的输出) 我们目前正在试图理解为什么这两个库的行为不同,以确保我们做了正确的事情。此外,正如我们所读到的,OpenSSL现在被高度推荐,并且提供了比MCrypt更多

我目前正在开发一个大型应用程序,其中Windows软件需要解密PHP脚本生成的字节流。在花了大量时间调整Windows应用程序和PHP脚本之后,我们终于成功地解密了一个使用Blowfish算法加密的简单字符串

在我们的测试中,我们使用了Mcrypt和OpenSSL,但只有Mcrypt提供了正确的输出(至少是Windows客户端可以理解的输出)

我们目前正在试图理解为什么这两个库的行为不同,以确保我们做了正确的事情。此外,正如我们所读到的,OpenSSL现在被高度推荐,并且提供了比MCrypt更多的功能,我们更希望现在就使用OpenSSL

为了定位错误,我们使用MCrypt和OpenSSL做了一个非常简单的测试,它使用相同的输入,但产生不同的输出。请注意,我们使用空IV仅用于测试目的,我们知道这样做不安全。我们在CBC模式下使用Blowfish,带有256位二进制密钥

MCrypt代码:

输出(Windows客户端正确理解):
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);