vue前端 crypto-js aes 加解密和問題處理

解碼為空問題解決方案:

  1. key需要為16位
  2. key和iv加密和解密時(shí)保持一致
  3. 加解密mode為CryptoJS.mode.CBC、padding為CryptoJS.pad.Pkcs7,保持一致

出現(xiàn)Error: Malformed UTF-8 data報(bào)錯(cuò)解決方案:

  1. 使用CryptoJS.enc.Utf8.parse
  2. 對字符串進(jìn)行base64編碼
  3. 替換換行符和空格:字符串保存在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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容