AES 解密不适用于 crypto.js
AES decryption not working with crypto.js
我正在尝试使用 crypto-js 获取解密数据,但结果为空白。而相同的密钥可以在线进行 aes 解密。
var CryptoJS = require("crypto-js");
var key = '+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXn';
var iv = '5ty76ujie3247';
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());
密钥和 IV 必须作为 WordArray
对象(而不是字符串或 NodeJS 缓冲区)传递 [1]. Since both are specified as UTF8-strings, they can be converted into WordArray
-objects with the corresponding UTF8-encoder (CryptoJS.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('5ty76ujie3247'); // 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
-object [1] 传递。或者,它可以作为字符串传递(如本例所示),然后 隐式 转换为具有可定义格式策略的 CipherParams
对象(默认情况下,一个应为 Base64 编码字符串)。
解密returns一个WordArray
转换成UTF8字符串[4]:
我正在尝试使用 crypto-js 获取解密数据,但结果为空白。而相同的密钥可以在线进行 aes 解密。
var CryptoJS = require("crypto-js");
var key = '+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXn';
var iv = '5ty76ujie3247';
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());
密钥和 IV 必须作为 WordArray
对象(而不是字符串或 NodeJS 缓冲区)传递 [1]. Since both are specified as UTF8-strings, they can be converted into WordArray
-objects with the corresponding UTF8-encoder (CryptoJS.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('5ty76ujie3247'); // 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
-object [1] 传递。或者,它可以作为字符串传递(如本例所示),然后 隐式 转换为具有可定义格式策略的 CipherParams
对象(默认情况下,一个应为 Base64 编码字符串)。
解密returns一个WordArray
转换成UTF8字符串[4]: