前端js使用crypto-js进行aes解密,解密内容为空

var key = '6f4ff1fc2b53b9ee'
var iv = 'jskey_1618823712'
var str = 'ubgW0ZKHPho5zjE1VMsEGg=='

 getDAesString(k,i,str) {                                             
                        var key = CryptoJS.enc.Utf8.parse(k); // 秘钥
                        var iv = CryptoJS.enc.Utf8.parse(i); //向量iv
                        var decrypted = CryptoJS.AES.decrypt(str , key, {
                            iv:iv,
                            mode:CryptoJS.mode.CBC,
                            padding:CryptoJS.pad.Pkcs7
                        });
                        return decrypted.toString(CryptoJS.enc.Utf8);
                    },
                    
    this.getDAesString(key,iv,str)

使用crypto-js进行aes解密,解密内容总是为空,找了好几篇文章,看大家都是这么写的,是我哪里写错了吗?

阅读 7.8k
2 个回答

你首先要确定这段base64是一个aes加密的字符串, 其次, 你要把原数据发出来。要不然,天知道错在哪。
把原始数据用这个密钥和iv用aes cbc加密一次, 对比这个base64看看。

给你个例子,Node.js 15 亲测通过

import CryptoJS from "crypto-js";

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);
}

function decrypt(k, i, base64) {
    const key = CryptoJS.enc.Utf8.parse(k);
    const iv = CryptoJS.enc.Utf8.parse(i);
    const encrypted = CryptoJS.AES.decrypt(base64, key, {
        iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString(CryptoJS.enc.Utf8);
}

const x = encrypt(key, iv, "helloworld你好");
console.log(x);
console.log(decrypt(key, iv, x));
Yj3EjgTOiwVU6BB70xvd6PbsbNIAhk29EbyFuR62gYE=
helloworld你好

至于你遇到的问题,需要从几个方面去分析

  1. keyiv 是不是跟加密时用的完全相同?
  2. keyiv 在加密的时候是不是也是用的 CryptoJS.enc.Utf8.parse()
  3. 加密时的 mode 是不是也是 CryptoJS.mode.CBC
  4. 加密时的 padding 是不是同样的 CryptoJS.pad.Pkcs7
  5. str 是不是通过加密结果的 ciphertext 属性编码的结果

已参与了 SegmentFault 思否「问答」打卡,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏