美文网首页
vue前端 crypto-js aes 加解密和问题处理

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

作者: 橙子只过今天 | 来源:发表于2023-07-04 15:21 被阅读0次

解码为空问题解决方案:

  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

相关文章

网友评论

      本文标题:vue前端 crypto-js aes 加解密和问题处理

      本文链接:https://www.haomeiwen.com/subject/ulxaedtx.html