首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在节点js中使用DES-EDE3 3加密

在节点js中使用DES-EDE3 3加密
EN

Stack Overflow用户
提问于 2020-11-02 19:21:47
回答 1查看 926关注 0票数 1

我需要使用DES 3算法和密钥加密字符串。php中的工作代码如下所示:

代码语言:javascript
复制
$encrypted = OpenSSL_encrypt($plain, "DES-EDE3", $key, OPENSSL_RAW_DATA);

但是我想把它用于节点js项目。因此,我重写了如下代码:

代码语言:javascript
复制
let cipher = crypto.createCipheriv("des-ede3", "the key", null);
let encryptedData = cipher.update("the data", "utf8", "base64") + cipher.final("base64");
let decodedData= Buffer.from(encryptedData , "base64").toString(); //cause i want it raw

但是它给了我invalid key length错误。我尝试了其他方法,比如使用md5对密钥进行散列,但在这种情况下,它不会给出与php代码相同的字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-02 21:57:00

Base64编码的密钥9GxTN6pRqOGNJTfDwG4Q6HGD5d2m6keR对应于Base64解码的24字节密钥,因此是三重所期望的密钥。三重DES基于DES,对应于DES的三次执行(加密/解密/加密),每次执行都使用一个密钥。

发布的PHP代码为纯文本返回以下结果:快速的棕狐跳过懒惰的狗和发布的键:

代码语言:javascript
复制
$encrypted = openssl_encrypt('The quick brown fox jumps over the lazy dog', 'des-ede3', base64_decode('9GxTN6pRqOGNJTfDwG4Q6HGD5d2m6keR'), OPENSSL_RAW_DATA);
print(base64_encode($encrypted)); // +sEO1gYe1Jk1+cslkLHDlSPwEOeFUBqKS7giqBnishiAcC9YfPxYiIJssg2Xu+e6

为了显示数据,需要适当的编码,例如Base64。或者,可以省略Base64标志(即可以使用0 ),而不是使用base64_encode的显式Base64编码,这意味着Base64编码。

NodeJS代码提供了与以下更改相同的结果:

代码语言:javascript
复制
var crypto = require('crypto');
let cipher = crypto.createCipheriv("des-ede3", Buffer.from('9GxTN6pRqOGNJTfDwG4Q6HGD5d2m6keR','base64'), null);
let encryptedData = cipher.update("The quick brown fox jumps over the lazy dog", "utf8", "base64") + cipher.final("base64");
//let decodedData= Buffer.from(encryptedData , "base64").toString(); //cause i want it raw
console.log(encryptedData); // +sEO1gYe1Jk1+cslkLHDlSPwEOeFUBqKS7giqBnishiAcC9YfPxYiIJssg2Xu+e6

请注意,行let decodedData=...已被注释掉,因为它对密码进行了解码,从而破坏了密文。

如果您想拥有原始数据,这将与缓冲区中的数据最接近:

代码语言:javascript
复制
let encryptedData = Buffer.concat([cipher.update("The quick brown fox jumps over the lazy dog", "utf8"), cipher.final()]);
console.log(encryptedData.toString('base64')); // +sEO1gYe1Jk1+cslkLHDlSPwEOeFUBqKS7giqBnishiAcC9YfPxYiIJssg2Xu+e6

这同样是Base64在这里编码的输出。

des-ede3 (等价于des-ede3-ecb)表示欧洲央行模式下的三重DES.三重DES是一种过时的密码,应该用高性能的AES来代替。还请注意,欧央行模式通常是不安全的。更好的选择是使用GCM模式的CBC或身份验证加密。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64651982

复制
相关文章

相似问题

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