如何从CryptoJS解密后的words数组与sigBytes还原原始JSON字符串
问题:如何将CryptoJS AES解密后的WordArray对象转为可读JSON字符串?
问题详情
- 原始Payload:
{"msg":"This is encrypted using AES"} - 初始化向量(iv):
1110000348111000 - 密钥(key):
8880002784888000 - 加密字符串:
QxpJspQ5AjeX0HK3uLjSNLZK/i8VWxcXfjpMLghZrSKui/m5XNO5at0jvsI4qGMC - 解密后返回的异常WordArray对象:
{ words: [ -1965411475, 1913178924, 601984393, -1493862515, 1415172454, -1789306172, 750380297, -1517138640, -934802361, 1164290040, -1702889832, 1716466309 ], sigBytes: -85 }
解决方案
1. 先修复解密参数异常
sigBytes: -85是无效解密的标志,说明你当前的解密参数和加密端不匹配。核心要确保:
- 密钥、IV的编码方式和加密端完全一致(比如都用UTF-8解析)
- 加解密的模式(如CBC)、填充方式(如Pkcs7)保持同步(CryptoJS默认是CBC+Pkcs7,若加密端自定义了参数,解密时必须同步设置)
2. 正确转换有效解密结果为可读JSON
当解密参数正确后,CryptoJS.AES.decrypt()会返回有效的WordArray对象,直接用内置方法转换即可:
// 加密字符串 const encryptedStr = 'QxpJspQ5AjeX0HK3uLjSNLZK/i8VWxcXfjpMLghZrSKui/m5XNO5at0jvsI4qGMC'; // 将密钥和IV转为CryptoJS认可的WordArray格式 const key = CryptoJS.enc.Utf8.parse('8880002784888000'); const iv = CryptoJS.enc.Utf8.parse('1110000348111000'); // 执行解密(确保模式、填充与加密端一致) const decryptedWordArray = CryptoJS.AES.decrypt(encryptedStr, key, { iv: iv }); // 转为UTF-8字符串 const decryptedStr = decryptedWordArray.toString(CryptoJS.enc.Utf8); // 解析为原始JSON对象 const originalPayload = JSON.parse(decryptedStr); console.log(originalPayload); // 输出:{"msg":"This is encrypted using AES"}
3. 常见排查点
- 如果解密后字符串乱码,优先检查密钥、IV的正确性,以及编码格式是否和加密端一致(比如加密用Hex编码,解密也要用
CryptoJS.enc.Hex.parse()转换) - 若加密端使用了自定义的密钥派生方式(如PBKDF2),解密时必须同步实现相同的派生逻辑
内容的提问来源于stack exchange,提问作者Mayank_MP5
相关产品推荐
相关产品推荐

