如何正确编码字符串以便在 NodeJS 中使用 CryptoJs 解密?

How to properly encode strings so to decrypt with CryptoJs in NodeJS?

我正在设计一个定制的混合加密系统。我有对称加密和非对称加密和解密都在服务器端处理。我现在要做的就是对称解密

我遇到了一些麻烦,因为我的客户端发送的对称密钥、iv 和数据都是字符串格式(非对称解密后),但 CryptoJS 对其编码非常敏感。就文档而言,它也非常混乱和模糊 - 至少对于一个相对较新的开发人员而言。我只是想不通 CryptoJS 对每个参数需要什么编码。我想我现在应该猜对了,但是没有。

Docs

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

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

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);
}
  • 您对数据、密钥和 IV 使用了错误的编码器。这三个都是 Base64 编码的(而不是十六进制或 Utf8)。所以应用Base64编码器。
  • 密文必须作为 CipherParams 对象或 Base64 编码传递给 CryptoJS.AES.decrypt(),隐式转换为 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));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>