首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用DES-CBC方法通过openSLL进行加密

如何使用DES-CBC方法通过openSLL进行加密
EN

Stack Overflow用户
提问于 2020-08-14 18:02:44
回答 1查看 187关注 0票数 2

实际上,我使用的是Mcrypt,但我要迁移到OpenSSL,我需要能够以与Mcrypt完全相同的方式使用它。

这就是我加密的方法

代码语言:javascript
运行
复制
mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_cbc, "\0\0\0\0\0\0\0\0");

对于解密,我已经设法用OpenSSL完成了,两者的工作方式完全相同

代码语言:javascript
运行
复制
//Using Mcrypt
mcrypt_decrypt(MCRYPT_DES, $key, $enc, MCRYPT_MODE_cbc, "\0\0\0\0\0\0\0\0");

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

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

代码语言:javascript
运行
复制
$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($text, "des-cbc", $key, 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));

这是输出:

代码语言:javascript
运行
复制
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD OpenSsl :

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

我知道Openssl声明DES很弱,但我仍然需要在我的情况下使用它。

如何使用OpenSSL在DES-CBC中进行加密,并使其行为与Mcrypt函数相同?

编辑:

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

代码:

代码语言:javascript
运行
复制
openssl_encrypt($text, "des-cbc", $key, OPENSSL_RAW_DATA , "\0\0\0\0\0\0\0\0");

输出:

代码语言:javascript
运行
复制
Mcrypt  : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl : f0tF0ERITdKiI2SxrttYANpJ%2BZaEiIFr

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-14 20:09:11

多亏了@Topaco,我成功地让它工作了

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

代码语言:javascript
运行
复制
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", $key, 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;

输出:

代码语言:javascript
运行
复制
Mcrypt : f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
OpenSsl: f0tF0ERITdKiI2SxrttYAJBVNBtoGR%2BD
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63410685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档