AES解密不适用于crypto.js

问题描述 投票:1回答:1

我正在尝试使用crypto-js获取解密的数据,但变得空白。而相同的密钥可以在线进行AES解密。

var CryptoJS = require("crypto-js"); 
var key = '+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXn';
var iv = '5ty76ujie324$567';
var encdata = 'ad06c28a5c9d933bc73451f86fcaa69a';
cipher = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encdata))
var decrypt = CryptoJS.AES.decrypt(cipher, Buffer.from(key), {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});

var ddd = decrypt.toString(CryptoJS.enc.Utf8);
console.log(ddd,"hey");

无法理解为什么会这样。但是,如果我使用加密,则可以使用以下代码

var crypto = require("crypto");
 let encryptedText = Buffer.from(encdata, 'hex');
        let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);
        let decrypted = decipher.update(encryptedText);
        decrypted = Buffer.concat([decrypted, decipher.final()]);
       console.log(decrypted.toString());
javascript node.js encryption hex cryptojs
1个回答
0
投票

键和IV必须作为WordArray对象(而不是字符串或NodeJS缓冲区)[1]传递。由于两者都指定为UTF8字符串,因此可以使用相应的UTF8编码器(WordArrayCryptoJS.enc.Utf8.parse(...)将它们转换为[2]对象:

var key = CryptoJS.enc.Utf8.parse('+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXn');         // Key: Use a WordArray-object instead of a UTF8-string / NodeJS-buffer 
var iv = CryptoJS.enc.Utf8.parse('5ty76ujie324$567');                          // IV: Use a WordArray-object instead of a UTF8-string 
var encdata = 'ad06c28a5c9d933bc73451f86fcaa69a';
var cipher = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encdata));   

var decrypt = CryptoJS.AES.decrypt(cipher, key, {
  iv: iv,
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.Pkcs7
});

var decrypted = decrypt.toString(CryptoJS.enc.Utf8);
console.log(decrypted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>

请注意,密文通常作为CipherParams-对象[1]传递。或者,可以将其作为字符串传递(如本例中所示),然后使用可定义的格式策略将其隐式转换为CipherParams对象(默认情况下,期望使用Base64编码的字符串)。] >

解密将返回WordArray,将其转换为UTF8字符串[4]

© www.soinside.com 2019 - 2024. All rights reserved.