CryptoJS解密出现Malformed UTF-8 data错误的解决方案咨询
解决AES解密时的"Malformed UTF-8 data"错误
我来帮你拆解下解密函数里的问题,一步步搞定这个UTF-8错误:
问题出在这几个关键错误上:
- 加密格式不匹配:你的加密函数返回的是Hex格式的字符串,但解密时却用
C.enc.Base64.parse()去解析,这会导致数据完全错乱,后续解密自然失败。 - 解密方法用反了:你在解密函数里写了
C.AES.encrypt(),这是加密方法,解密必须用C.AES.decrypt()才对! - 结果转换错误:最后你直接返回了解密前的
encryptedData解析结果,根本没用到解密后的内容,这完全是逻辑错误。
修正后的解密函数:
var decryptData2 = function(encryptedData) { var C = CryptoJS; // 1. 用Hex解析加密数据(和加密格式对应) var encryptedHex = C.enc.Hex.parse(encryptedData); // 2. 转成CryptoJS需要的CipherParams对象 var cipherParams = C.lib.CipherParams.create({ ciphertext: encryptedHex }); var Key = C.enc.Utf8.parse("6il7YCRSqIOB9NooY225lPKQ0KuAF/nkFX6cY3vJkS0="); var IV = C.enc.Utf8.parse("0123456789ABCDEF"); // 3. 使用decrypt方法解密 var decryptedText = C.AES.decrypt(cipherParams, Key, { iv: IV, mode: C.mode.CBC, padding: C.pad.Pkcs7 }); // 4. 转成UTF8字符串,再解析回原始对象 return JSON.parse(decryptedText.toString(C.enc.Utf8)); }
补充说明:
- 加密时你用了
toString(CryptoJS.format.Hex),所以解密第一步必须用C.enc.Hex.parse()来还原加密数据,保持格式一致。 - CryptoJS的
decrypt方法需要接收CipherParams对象或者Base64字符串,这里我们把Hex解析后的内容包装成CipherParams对象更稳妥。 - 解密后的结果要先转成UTF8字符串,再用
JSON.parse转回你原来的复杂对象,这样就能正常拿到原始数据了。
测试一下,调用修正后的decryptData2(encryptedData),应该就能正确返回你最初的data对象,不会再出现UTF-8格式错误了。
内容的提问来源于stack exchange,提问作者ryoshpa
相关产品推荐
相关产品推荐

