vue前端 crypto-js aes 加解密和问题处理

解码为空问题解决方案:

  1. key需要为16位
  2. key和iv加密和解密时保持一致
  3. 加解密mode为CryptoJS.mode.CBC、padding为CryptoJS.pad.Pkcs7,保持一致

出现Error: Malformed UTF-8 data报错解决方案:

  1. 使用CryptoJS.enc.Utf8.parse
  2. 对字符串进行base64编码
  3. 替换换行符和空格:字符串保存在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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容