如何使用DES-CBC方法使用openSLL加密

问题描述

实际上,我正在使用Mcrypt,但现在我正在使用OpenSSL,我需要能够使用与Mcrypt完全相同的方法。

这就是我加密的方式

mcrypt_encrypt(MCRYPT_DES,$key,$text,MCRYPT_MODE_cbc,"\0\0\0\0\0\0\0\0");

对于解密,我已经设法在OpenSSL中进行解密,两者都以完全相同的方式工作

//Using Mcrypt
mcrypt_decrypt(MCRYPT_DES,$enc,"\0\0\0\0\0\0\0\0");

//Using Openssl
openssl_decrypt($enc,'des-cbc',OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); 

对于使用OpenSSL进行加密,这是我的测试代码

$key = "123456SO";
$text = "name=louis&cp=75013";

$encMcrypt = mcrypt_encrypt(MCRYPT_DES,"\0\0\0\0\0\0\0\0");
$encOpenssl = openssl_encrypt($text,"des-cbc",OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,"\0\0\0\0\0\0\0\0");

echo "Mcrypt : " . urlencode(base64_encode($encMcrypt));
echo " OpenSsl : " . urlencode(base64_encode($encOpenssl));

这是输出:

Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD OpenSsl :

这是official list of method,但我找不到DES方法。

我知道Openssl宣布DES弱,但是我仍然需要使用它。

如何使用OpenSSL在DES-CBC中加密,使其行为与Mcrypt功能相同?

编辑:

如果我删除了OPENSSL_ZERO_PADDING选项,结果几乎是预期的结果

代码:

openssl_encrypt($text,OPENSSL_RAW_DATA,"\0\0\0\0\0\0\0\0");

输出:

Mcrypt  : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl : f0tF0ERITdKiI2SxrttYANpJ%2BZaEiIFr

字符串的第一部分是正确的,但最后与Mcrypt加密字符串的输出不同。

解决方法

感谢@Topaco我设法使它工作了

我添加了OPENSSL_ZERO_PADDING选项以禁用PKCS7填充,然后创建了一个函数,以0x00手动填充我的字符串

function zero_padding($text)
{
    if (strlen($text) % 8)
        $text = str_pad($text,strlen($text) + 8 - strlen($text) % 8,"\0");
    
    return $text;
}

$key = "123456SO";
$text = "name=louis&cp=75013";

$encMcrypt = mcrypt_encrypt(MCRYPT_DES,$key,$text,MCRYPT_MODE_cbc,"\0\0\0\0\0\0\0\0");
$encOpenssl = openssl_encrypt(zero_padding($text),"des-cbc",OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,"\0\0\0\0\0\0\0\0");

$encMcrypt = urlencode(base64_encode($encMcrypt));
$encOpenssl = urlencode(base64_encode($encOpenssl));

echo "Mcrypt :" . $encMcrypt;
echo "OpenSsl:" . $encOpenssl;

输出:

Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl: f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...