解码为空问题解决方案:
- key需要为16位
- key和iv加密和解密时保持一致
- 加解密mode为
CryptoJS.mode.CBC
、padding为CryptoJS.pad.Pkcs7
,保持一致
出现Error: Malformed UTF-8 data
报错解决方案:
- 使用
CryptoJS.enc.Utf8.parse
- 对字符串进行base64编码
- 替换换行符和空格:字符串保存在localstorage中会存在换行符和空格,取出解码时需要将加密字符串中的空格去除或替换成
+
(重要
最终代码:
// 加密算法
function encryptKey(keyword) {
const key = '6f4ff1fc2b53b9ee'
const iv = 'jskey_1618823712'
function encrypt(k, i, text) {
const key = CryptoJS.enc.Utf8.parse(k)
const iv = CryptoJS.enc.Utf8.parse(i)
const encrypted = CryptoJS.AES.encrypt(text, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.ciphertext.toString(CryptoJS.enc.Base64)
}
let x = encrypt(key, iv, keyword)
x = x.replaceAll(/[\r\n]/g, '')
}
// 解密算法
function decryptKey(keyword) {
let idKey = keyword.replaceAll(/\s/g, '+')
const key = '6f4ff1fc2b53b9ee'
const iv = 'jskey_1618823712'
function decrypt(k, i, str) {
try {
const key = CryptoJS.enc.Utf8.parse(k)
const iv = CryptoJS.enc.Utf8.parse(i)
let base64 = CryptoJS.enc.Base64.parse(str)
let src = CryptoJS.enc.Base64.stringify(base64)
const encrypted = CryptoJS.AES.decrypt(src, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString(CryptoJS.enc.Utf8)
} catch (e) {
console.log(e)
return ''
}
}
let eid = decrypt(key, iv, idKey)
return eid ? eid.trim() : idKey
}
参考文章:
前端js使用crypto-js进行aes解密,解密内容为空
crypto-js解密报错malformed utf-8 data