【问题标题】:use DES-EDE3 encryption in node js using crypto使用加密在节点 js 中使用 DES-EDE3 加密
【发布时间】:2020-11-02 19:21:47
【问题描述】:

我需要使用 DES-EDE3 算法和一个密钥来加密一个字符串。在 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 代码相同的字符串。

【问题讨论】:

  • 您能否发布一些格式相似但与您的实际密钥不同的示例密钥?
  • @ArtjomB。关键是这样的:�lS7�Q��%7��n�q��ݦ�G� 这是一个 base64 解码的字符串,如下所示:9GxTN6pRqOGNJTfDwG4Q6HGD5d2m6keR 从 api 给我。数据本身是价格和支付网关令牌以及使用; 字符分隔的因子编号的组合。
  • @Artjom B. 要求密钥的原因是 OpenSsl 有时会使用密钥派生方法,而有时它会将太短(或太长)的密钥带到正确的长度。如果我们看不到 (sample) 键,我们就无法真正帮助您解决问题。如果您想得到一个好的和可靠的答案,请编辑您的问题并发布您的 PHP 加密代码的最小运行示例(简化明文,使用与真实密钥长度相同的密钥并将密文作为 hexstring 或 base64编码输出。谢谢

标签: php node.js encryption openssl cryptojs


【解决方案1】:

Base64 编码密钥 9GxTN6pRqOGNJTfDwG4Q6HGD5d2m6keR 对应于 Base64 解码为 24 字节密钥,因此是 Triple-DES 期望的密钥。 Triple-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。或者,可以省略OPENSSL_RAW_DATA 标志而不是使用base64_encode 的显式Base64 编码(即可以使用0),它隐式地进行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=... 行已被注释掉,因为它是 UTF8 解码的,因此损坏密文。

如果你想要原始数据,这将最接近缓冲区中的数据:

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)表示ECB模式下的Triple-DES。 Triple-DES 是一种过时的密码,应替换为例如更高性能的 AES。另请注意,ECB 模式通常是不安全的。更好的选择是 CBC 或使用 GCM 模式的身份验证加密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多