在 Node-RED 中解码 AES-CTR 消息

Decoding AES-CTR messages in Node-RED

我在 Node-RED 中解密 AES-CTR 负载时遇到问题。

例如,我在这里对“消息”进行编码 -> https://cryptii.com/pipes/aes-encryption - 然后在 Node-RED 中解密该结果。

Crytii Site Results:
Input: 4d657373616765
Algorithm: AES-128
Mode: CTR
Key: 000102030405060708090a0b0c0d0e0f
IV: 101112131415161718191a1b1c1d1e1f
Output: 4a9b9c0780b266

在 Node-RED 中解密来自 Cryptii (4a9b9c0780b266) 的输出有效载荷时,我在调试窗口中收到一个“”返回值。

var cryptojs = context.global.cryptojs;

var key = '000102030405060708090a0b0c0d0e0f';
var iv = '101112131415161718191a1b1c1d1e1f';
var data = msg.payload;

var message = cryptojs.AES.decrypt(
    data, 
    key, { 
        mode: cryptojs.mode.CTR, 
        iv: iv }
    );

msg.payload = message.toString();

return msg;

这是使用的库:https://www.npmjs.com/package/crypto-js 并且需要对 Node-RED 的 settings.js 进行更改。

我对主题的理解有限,如有任何指导,我们将不胜感激。 TIA

密钥、IV 和密文是十六进制编码的,因此必须使用十六进制编码器进行解析并转换为 WordArrays(如果密钥作为字符串传递,CryptoJS 也会应用密钥派生函数)。

密文必须作为 CipherParams 对象传递。

CTR是流密码模式,不使用填充。在 CryptoJS 中,必须明确禁用填充,否则将应用默认填充 (PKCS7)。

var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f'); // hex decode
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // hex decode
var data = CryptoJS.enc.Hex.parse('4a9b9c0780b266'); // hex decode

var message = CryptoJS.AES.decrypt(
    {ciphertext: data}, // pass ciphertext as CipherParams object 
    key, { 
        mode: CryptoJS.mode.CTR, 
        iv: iv,
        padding: CryptoJS.pad.NoPadding // disable padding
   }
);

console.log(message.toString()); // hex encode
console.log(message.toString(CryptoJS.enc.Utf8)); // UTF-8 decode
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>