如何正确编码字符串以便在 NodeJS 中使用 CryptoJs 解密?
How to properly encode strings so to decrypt with CryptoJs in NodeJS?
我正在设计一个定制的混合加密系统。我有对称加密和非对称加密和解密都在服务器端处理。我现在要做的就是对称解密
我遇到了一些麻烦,因为我的客户端发送的对称密钥、iv 和数据都是字符串格式(非对称解密后),但 CryptoJS 对其编码非常敏感。就文档而言,它也非常混乱和模糊 - 至少对于一个相对较新的开发人员而言。我只是想不通 CryptoJS 对每个参数需要什么编码。我想我现在应该猜对了,但是没有。
我请求帮助获得正确的编码,以便我可以使用以下内容解密。非常感谢您的帮助。
非对称解密后的数据示例如下(丢弃密钥):
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>
我正在设计一个定制的混合加密系统。我有对称加密和非对称加密和解密都在服务器端处理。我现在要做的就是对称解密
我遇到了一些麻烦,因为我的客户端发送的对称密钥、iv 和数据都是字符串格式(非对称解密后),但 CryptoJS 对其编码非常敏感。就文档而言,它也非常混乱和模糊 - 至少对于一个相对较新的开发人员而言。我只是想不通 CryptoJS 对每个参数需要什么编码。我想我现在应该猜对了,但是没有。
我请求帮助获得正确的编码,以便我可以使用以下内容解密。非常感谢您的帮助。
非对称解密后的数据示例如下(丢弃密钥):
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>