【问题标题】:How to properly encode strings so to decrypt with CryptoJs in NodeJS?如何正确编码字符串以便在 NodeJS 中使用 CryptoJs 解密?
【发布时间】:2022-01-31 16:43:37
【问题描述】:

我正在开发一个自定义混合加密系统。我已经在服务器端处理了对称加密和非对称加密和解密。我现在需要做的就是对称解密。

我遇到了一些麻烦,因为我的客户端以字符串格式(在非对称解密之后)发送对称密钥、iv 和数据,但 CryptoJS 的编码非常敏感。就文档而言,它也非常令人困惑和模糊——至少对于一个相对较新的开发人员来说。我只是无法弄清楚 CryptoJS 对每个参数想要什么编码。我想我现在应该已经猜到了,但没有。

Docs
Some help I've gotten previously

我请求帮助以正确编码,以便我可以使用以下内容进行解密。非常感谢您的帮助。

非对称解密后的数据示例如下(丢弃密钥):

symmetricKey: bDKJVr5wFtQZaPrs4ZoMkP2RjtaYpXo5HHKbzrNELs8=,
symmetricNonce: Z8q66bFkbEqQiVbrUrts+A==,
dataToReceive: "hX/BFO7b+6eYV1zt3+hu3o5g61PFB4V3myyU8tI3W7I="
exports.transportSecurityDecryption = async function mmTransportSecurityDecryption(dataToReceive, keys) {
  const JSEncrypt = require('node-jsencrypt');
  const CryptoJS = require("crypto-js");

  // Asymmetrically decrypt symmetric cypher data with server private key
  const privateKeyQuery = new Parse.Query("ServerPrivateKey");
  const keyQueryResult = await privateKeyQuery.find({useMasterKey: true});
  const object = keyQueryResult[0];
  const serverPrivateKey = object.get("key");
  const crypt = new JSEncrypt();
  crypt.setPrivateKey(serverPrivateKey);
  let decryptedDataString = crypt.decrypt(keys);
  let decryptedData = JSON.parse(decryptedDataString);

  // Symmetrically decrypt transit data
  let symmetricKey = decryptedData.symmetricKey;
  let symmetricNonce = decryptedData.symmetricNonce;
                                                        // Works perfectly till here <---
  var decrypted = CryptoJS.AES.decrypt(
    CryptoJS.enc.Hex.parse(dataToReceive),
    CryptoJS.enc.Utf8.parse(symmetricKey),
    {iv: CryptoJS.enc.Hex.parse(symmetricNonce)}
    );
  return decrypted.toString(CryptoJS.enc.Utf8);
}

【问题讨论】:

    标签: node.js encryption encoding character-encoding cryptojs


    【解决方案1】:
    • 您为数据、密钥和 IV 使用了错误的编码器。这三个都是 Base64 编码的(而不是十六进制或 Utf8)。所以应用 Base64 编码器。
    • 密文必须作为CipherParams 对象传递给CryptoJS.AES.decrypt(),或者采用Base64 编码,隐式转换为CipherParams 对象。

    当两者都固定时,纯文本为:"[\"001\",\"001\"]"

    var symmetricKey =  "bDKJVr5wFtQZaPrs4ZoMkP2RjtaYpXo5HHKbzrNELs8="
    var symmetricNonce = "Z8q66bFkbEqQiVbrUrts+A=="
    var dataToReceive = "hX/BFO7b+6eYV1zt3+hu3o5g61PFB4V3myyU8tI3W7I="
    
    var decrypted = CryptoJS.AES.decrypt(
        dataToReceive, // pass Base64 encoded
        //{ciphertext: CryptoJS.enc.Base64.parse(dataToReceive)}, // pass as CipherParams object, works also
        CryptoJS.enc.Base64.parse(symmetricKey),
        {iv: CryptoJS.enc.Base64.parse(symmetricNonce)}
    );
    
    console.log(decrypted.toString(CryptoJS.enc.Utf8));
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 再次感谢托帕科!请问你是怎么知道这些编码参数的?是否只是使用包的经验还是我错过了文档中的数据?
    • @RobbB - 文档确实提到了这一点,例如在EncodersThe Cipher Input 部分中,但相当差,至少不是很详细。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多