You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CryptoJS实现AES-128 ECB零填充加解密解密异常问题排查

问题根因
  • 明文编码逻辑错误:普通ASCII明文US0378331005-USD-US-en包含非十六进制字符(字母U/S、横杠等),直接使用CryptoJS.enc.Hex.parse解析会自动跳过非法字符,生成错误的字数组对象,从加密输入阶段就产生了数据错误。普通UTF-8字符串应使用CryptoJS.enc.Utf8.parse做解析。
  • 填充模式配置错误:需求提到的0填充对应CryptoJS的填充枚举是CryptoJS.pad.ZeroPadding,而非CryptoJS.pad.NoPadding。NoPadding模式要求明文长度必须是AES块大小(16字节)的整数倍,否则会直接截断明文导致加密结果异常,测试明文长度为22字节,不符合NoPadding的使用要求。
  • 解密入参格式错误:CryptoJS.AES.decrypt方法默认接收Base64格式的密文字符串,或CipherParams类型的密文对象,直接传入十六进制格式的密文字符串,会被默认按Base64规则解析,最终得到完全错误的解密输入。
  • 冗余无效参数:ECB模式本身不使用初始向量(IV),代码中传入的iv参数属于无效配置,不影响运行但无实际意义。
修正方案
  1. 调整依赖引入,移除无用的md5资源引用,仅保留必要的CryptoJS核心、AES、编码相关资源:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/aes.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/enc-hex.min.js"></script>
  1. 修正编码、填充、解密入参逻辑,完整JS代码如下:
var text = 'US0378331005-USD-US-en';
var key = '11A1764225B11AA1'; // 16字节,符合AES-128密钥长度要求
console.log('text:', text);
console.log('key:', key);
console.log('key length:', key.length );

// 明文用Utf8编码解析,密钥按Hex编码解析
text = CryptoJS.enc.Utf8.parse(text);
key = CryptoJS.enc.Hex.parse(key);

// ECB模式无需传IV,填充用ZeroPadding(即0填充)
var encrypted = CryptoJS.AES.encrypt(text, key, { 
    mode: CryptoJS.mode.ECB, 
    padding: CryptoJS.pad.ZeroPadding 
});
// 输出十六进制格式密文
var encryptedHex = encrypted.ciphertext.toString(CryptoJS.enc.Hex);
console.log('encrypted hex:', encryptedHex);

// 解密时把十六进制密文包装为CipherParams对象传入,避免解析错误
var decrypted =  CryptoJS.AES.decrypt(
    { ciphertext: CryptoJS.enc.Hex.parse(encryptedHex) }, 
    key, 
    {
        mode: CryptoJS.mode.ECB, 
        padding: CryptoJS.pad.ZeroPadding 
    }
);
// 解密结果按Utf8转成字符串
console.log('decrypted text:', decrypted.toString(CryptoJS.enc.Utf8));
运行结果

修正后代码控制台输出如下,可正确还原明文:

text: US0378331005-USD-US-en
key: 11A1764225B11AA1
key length: 16
encrypted hex: 951422f8ac8354acf23fbcb57d10862afd93c628e7b8693d8a519704d719d4c0
decrypted text: US0378331005-USD-US-en

若确实需要使用NoPadding模式,只需要在加密前手动将明文填充到16字节的整数倍长度即可,其余逻辑保持一致。

内容的提问来源于stack exchange,提问作者DavidDunham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:18:23