OpenSSL解密(DES)在PHP中返回false

时间:2019-03-26 14:16:23

标签: php encryption

我正在尝试使用DES-ECB加密解密数据,但响应始终为假。

当我通过https://www.tools4noobs.com/online_tools/decrypt/解密字符串时,响应是正确的。该网站正在PHP中使用函数“ mcrypt_encrypt()”,但该功能在我的服务器上不可用。

我正在处理的代码应该可以在PHP 7.1+版本上使用,因此mcrypt_encrypt()在我的系统中不再可用。

$password         = 'password'; // Example
$decryptedString  = 'ThisShouldBeAnTestToCheckIfTheStringIsCorrectDecryptedThroughDES-ECB'; 

// Encrypted the string through the online tool.
$encryptedString  = 'zOToWEkYOoDnNWZ/sWEgOQQAX97NTZami/3V18yeKmoKiuam3DL0+Pu/LIuvjJ52zbfEx/+6WR4JcCjIBojv0H1eYCDUwY3o';

$opensslDecrypt   = openssl_decrypt(base64_decode($encryptedString),'DES-ECB', $password);

var_dump($opensslDecrypt); // Returns false.

我也尝试了不使用base64_decode函数进行解密,但是它仍然返回false。

任何人都知道为什么它没有按原样解密吗?

1 个答案:

答案 0 :(得分:1)

您必须在方法调用中精确调整null

只需在密码后添加以下参数:$options

OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING , ''

输出:<?php $password = 'password'; $decryptedString = 'ThisShouldBeAnTestToCheckIfTheStringIsCorrectDecryptedThroughDES-ECB'; // Encrypted the string through the online tool. $encryptedString = 'zOToWEkYOoDnNWZ/sWEgOQQAX97NTZami/3V18yeKmoKiuam3DL0+Pu/LIuvjJ52zbfEx/+6WR4JcCjIBojv0H1eYCDUwY3o'; $opensslDecrypt = openssl_decrypt(base64_decode($encryptedString),'DES-ECB', $password, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING , ''); var_dump(trim($opensslDecrypt));

有关此选项的更多信息:

What does OPENSSL_RAW_DATA do?

  

$ options作为(与2016年一样)两个可能的值OPENSSL_RAW_DATA和OPENSSL_ZERO_PADDING。可以通过OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING设置两者。如果未指定OPENSSL_ZERO_PADDING,则将执行PKCS#7的默认填充,因为[openssl at mailismagic dot com]在openssl_encrypt()

中的注释中已对此进行了观察。

https://www.php.net/manual/en/function.openssl-decrypt.php