HTTPS传输中,为什么加密后的数据在后端无法正确解密?

UX慧芳 阅读 37

我在做前后端数据加密时遇到个怪问题:AES加密的数据通过HTTPS发送到后端,Java那边解密总报错,明明算法都用的AES-256-CBC…

前端用的是CryptoJS这样加密的:


const ciphertext = CryptoJS.AES.encrypt('敏感数据', '123456').toString();
fetch('/api', {body: ciphertext});

后端Java用的是:


Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.doFinal(Base64.getDecoder().decode(requestBody));

已经试过调整模式和填充方式,甚至换过密钥长度,但一直报 Given final block not correct size,这到底哪里不对啊?

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
シ浚博
シ浚博 Lv1
问题出在CryptoJS默认用的是CBC模式但没显式设置IV,而Java那边需要明确的IV。最简单的办法是让前端也用固定IV加密:

const key = CryptoJS.enc.Utf8.parse('1234567890123456'); // 16字节
const iv = CryptoJS.enc.Utf8.parse('1234567890123456');
const ciphertext = CryptoJS.AES.encrypt('敏感数据', key, { iv: iv }).toString();
fetch('/api', {body: ciphertext});


后端解密时也要用相同IV:

byte[] ivBytes = "1234567890123456".getBytes();
IvParameterSpec iv = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] result = cipher.doFinal(Base64.getDecoder().decode(requestBody));


记得key和IV都要16字节,别问我怎么知道的,踩过坑。
点赞 3
2026-02-14 14:00