前端用AES加密后端解不开,密钥和模式都对吗?
我在前端用CryptoJS做AES加密,传给Java后端却一直解密失败。两边都说用的是AES/CBC/PKCS5Padding,密钥也是同一个字符串,但后端报“javax.crypto.BadPaddingException”。是不是我前端加密哪里写错了?
我试过把密钥用UTF-8转成WordArray,也确认了IV是16位,但还是不行。这是我的加密代码:
const key = CryptoJS.enc.Utf8.parse('mySecretKey12345');
const iv = CryptoJS.enc.Utf8.parse('1234567890123456');
const encrypted = CryptoJS.AES.encrypt('hello world', key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
console.log(encrypted.toString());
首先,Java那边用的是PKCS5Padding,而CryptoJS默认是Pkcs7。虽然两者在16字节分组下实际效果一样,但为了保险起见,最好统一叫法。你已经用了Pkcs7,那就保持这样。
问题很可能出在密钥长度上。'mySecretKey12345'这个字符串只有13个字符,转换成UTF-8后是13字节,不是标准的AES密钥长度(16, 24或32字节)。Java解密时会对密钥长度进行严格校验,导致报错。
建议把密钥改成16字节长的字符串,比如:
const key = CryptoJS.enc.Utf8.parse('mySecretKey1234');
这样修改后,Java端应该就能正常解密了。另外确认下Java端是不是真的用的AES/CBC/PKCS5Padding,有时候配置不对也会导致这个问题。
记得两边密钥长度要一致啊,这坑我以前也踩过,折腾半天才发现是这个原因。