我需要使用DES 3算法和密钥加密字符串。php中的工作代码如下所示:
$encrypted = OpenSSL_encrypt($plain, "DES-EDE3", $key, OPENSSL_RAW_DATA);但是我想把它用于节点js项目。因此,我重写了如下代码:
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代码相同的字符串。
发布于 2020-11-02 21:57:00
Base64编码的密钥9GxTN6pRqOGNJTfDwG4Q6HGD5d2m6keR对应于Base64解码的24字节密钥,因此是三重所期望的密钥。三重DES基于DES,对应于DES的三次执行(加密/解密/加密),每次执行都使用一个密钥。
发布的PHP代码为纯文本返回以下结果:快速的棕狐跳过懒惰的狗和发布的键:
$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代码提供了与以下更改相同的结果:
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=...已被注释掉,因为它对密码进行了解码,从而破坏了密文。
如果您想拥有原始数据,这将与缓冲区中的数据最接近:
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或身份验证加密。
https://stackoverflow.com/questions/64651982
复制相似问题