You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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));
}

补充说明:

  1. 加密时你用了toString(CryptoJS.format.Hex),所以解密第一步必须用C.enc.Hex.parse()来还原加密数据,保持格式一致。
  2. CryptoJS的decrypt方法需要接收CipherParams对象或者Base64字符串,这里我们把Hex解析后的内容包装成CipherParams对象更稳妥。
  3. 解密后的结果要先转成UTF8字符串,再用JSON.parse转回你原来的复杂对象,这样就能正常拿到原始数据了。

测试一下,调用修正后的decryptData2(encryptedData),应该就能正确返回你最初的data对象,不会再出现UTF-8格式错误了。

内容的提问来源于stack exchange,提问作者ryoshpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:52