解碼為空問題解決方案:
- key需要為16位
- key和iv加密和解密時(shí)保持一致
- 加解密mode為
CryptoJS.mode.CBC、padding為CryptoJS.pad.Pkcs7,保持一致
出現(xiàn)Error: Malformed UTF-8 data報(bào)錯(cuò)解決方案:
- 使用
CryptoJS.enc.Utf8.parse - 對字符串進(jìn)行base64編碼
- 替換換行符和空格:字符串保存在localstorage中會(huì)存在換行符和空格,取出解碼時(shí)需要將加密字符串中的空格去除或替換成
+(重要
最終代碼:
// 加密算法
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進(jìn)行aes解密,解密內(nèi)容為空
crypto-js解密報(bào)錯(cuò)malformed utf-8 data