美文网首页
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