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参数属于无效配置,不影响运行但无实际意义。
修正方案
- 调整依赖引入,移除无用的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>
- 修正编码、填充、解密入参逻辑,完整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
相关产品推荐
相关产品推荐

