AES 128解密报错:CryptoJS.enc.Latin1首字符格式异常求助
解决CryptoJS AES128解密时的"First char of CryptoJS.enc.Latin1 is malformed"错误
我来帮你搞定这个问题!你遇到的这个报错,核心原因是密文的解码方式不对,另外密钥的处理也需要匹配AES128的要求。咱们一步步来修正:
错误根源分析
你提到的报错提示Latin1编码的首字符畸形,说明你可能错误地用CryptoJS.enc.Latin1去解码base64格式的密文了——你的data是标准的base64字符串,必须用Base64解码器处理,而不是Latin1。另外,你的密钥是十六进制字符串,也需要正确转成CryptoJS能识别的WordArray格式。
修正后的完整解密代码
// 确保已正确加载CryptoJS库 // 比如通过CDN引入:<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script> const encryptedData = "+JdTb5BOloxaBHQlTw6NPLNV9lZix1OwhR3HF3IRtu2pdg/TLkrTw6Xu4JpKFlxE+zgOZavj0UynSZ+ojxmDXRbUlfyOc4YAncJVMXr28/AtfxZkNQoHbPIo7WxcSdidNE2k+DHZFcNNKOzYnvL1oDN4ezecs8Vo7K6vC5ZFLPUylXsi5sPsGye+TBbauPX+/wXa3hWUJVMNk6HUghW7l4N5Ei7HnrxLkFSFnz+9YUKYbFMEgV6wd9debHrpyytVhA3x2+Eyn5KnQ7iNJKQsNw=="; const keyHex = "062ec23950a55b9f8b21b0f9d45ca853"; // 1. 处理密钥:将十六进制字符串转为WordArray(AES128需要16字节密钥,你的key刚好32位十六进制=16字节) const key = CryptoJS.enc.Hex.parse(keyHex); // 2. 处理密文:将base64字符串转为WordArray(这一步是解决报错的关键!) const ciphertext = CryptoJS.enc.Base64.parse(encryptedData); // 3. 执行解密(这里假设使用AES-CBC模式,且IV是密文的前16字节,这是常见的加密约定) // 提取IV(密文前16字节) const iv = ciphertext.clone(); iv.sigBytes = 16; iv.words = iv.words.slice(0, 4); // 每个Word对应4字节,16字节即4个Word // 提取真正的密文部分(去掉前16字节的IV) const actualCiphertext = ciphertext.clone(); actualCiphertext.words = actualCiphertext.words.slice(4); actualCiphertext.sigBytes -= 16; // 执行解密,确保模式和填充与加密端一致 const decrypted = CryptoJS.AES.decrypt( { ciphertext: actualCiphertext }, key, { iv: iv, padding: CryptoJS.pad.Pkcs7, mode: CryptoJS.mode.CBC } ); // 将解密后的WordArray转为UTF-8字符串(可根据实际编码调整) const plaintext = decrypted.toString(CryptoJS.enc.Utf8); console.log("解密结果:", plaintext);
关键注意事项
- 密文解码:必须用
CryptoJS.enc.Base64.parse()处理你的base64密文,而不是Latin1——Latin1是单字节字符编码,不适合解码base64二进制数据,这是你报错的直接原因。 - 密钥处理:你的密钥是十六进制字符串,用
CryptoJS.enc.Hex.parse()转成WordArray,刚好符合AES128的16字节要求。 - 模式与填充:如果你的加密端用的是ECB模式(不推荐,但部分旧系统会使用),可以去掉
iv参数,修改模式为CryptoJS.mode.ECB。另外填充方式要和加密端完全一致,默认的Pkcs7是大部分场景的通用选择。 - IV的处理:如果加密时没有把IV嵌入密文开头,你需要单独获取加密时使用的IV,否则解密结果会出现乱码。
内容的提问来源于stack exchange,提问作者Anand G
相关产品推荐
相关产品推荐

