Crypto-JS AES 报错 Malformed UTF-8 data 的解决,接口前端base64中文乱码问题

今天遇到js端解密后端AES加密数据报错Malformed UTF-8 data 的问题,找了不少才找的这个方法。还是国外的大佬厉害。

①key要32位数的

Key Length: Ensure your key is 32 bytes for AES-256.


完整的demo

<script>

import CryptoJS from 'crypto-js';//引入库

export default {
  data() {
    return {
     
    };
  },
  onLoad: function (options) {
    let that = this;
    this.test()//调用测试
  },
  methods: {
    test() {
      let result = '你的密文';
      let iv = 'x0hG4kWKLzrib0M8XXcMEg==';//你的iv,我这里用过base64加密了
      let key = '你的可以';//要32位!!!!
      let method = 'AES-256-CBC';

      // Parse IV using CryptoJS
      iv = CryptoJS.enc.Base64.parse(iv);//先base64解密iv

      //解密密文
      try {
        // Assuming `result` is already a Base64 encoded string
        result = CryptoJS.enc.Base64.parse(result);

        // Decrypt result
        result = CryptoJS.AES.decrypt(
            {ciphertext: result},
            CryptoJS.enc.Utf8.parse(key), // Convert key to WordArray
            {
              iv: iv,
              mode: CryptoJS.mode.CBC,
              padding: CryptoJS.pad.Pkcs7
            }
        );


        // Convert decrypted data to UTF-8 string
        result = result.toString(CryptoJS.enc.Utf8);
        result = decodeURIComponent(escape(atob(result)));//很重要,中文防止乱码

        console.log('Decrypted and Decoded Result:', JSON.parse(result));//因为的我数据用了json加密,所以这里json解密一下
      } catch (error) {
        console.error('Error during decryption:', error);
      }

    },
  }
};
</script>

image.png

评论/留言