在使用crypto-js进行解密的时候,有可能会报错:
Malformed UTF-8 data
Error: Malformed UTF-8 data
很多贴子说没有进行base64转码,但是当你进行了base64转码之后如果还是存在这个问题该如何解决?
首先如果你是从接口里取出来的数据且保证这个数据在解码网站解码正确的前提下,将接口返回数据使用res.replace(/\s/g,'')正则过滤掉空格,然后问题就解决啦
原因:接口返回结果浏览器会自动换行导致数据中存在换行,base64无法正常转码,过滤掉空格就可以了,有的网站可以正常解码出来是因为他们内置了去掉空格。
var str1 = res.replace(/\s/g,'')
this.result = JSON.parse(this.decryptByDES(str1)) || {}
decryptByDES(ciphertext, key='***', iv='***'){
const keyHex = cryptoJs.enc.Utf8.parse(key);
const decrypted = cryptoJs.TripleDES.decrypt({
// ciphertext: cryptoJs.enc.Hex.parse(ciphertext) // hex 编码解密
ciphertext: cryptoJs.enc.Base64.parse(ciphertext) // base64 编码解密
}, keyHex, {
mode: cryptoJs.mode.CBC, // CBC模式
padding: cryptoJs.pad.Pkcs7, // pkcs7padding 填充方式
iv: cryptoJs.enc.Utf8.parse(iv) // 设置偏移量(若 ECB 模式则删除该行)
});
return decrypted.toString(cryptoJs.enc.Utf8); // 返回 base64 编码格式
},