前端用AES加密后端解不开,哪里出问题了?

UP主~悦嘉 阅读 40

我在前端用CryptoJS做AES加密,传给后端PHP,但后端死活解密失败,密钥和模式都对上了啊。

我用的是AES-128-CBC,密钥是16位字符串,还加了PKCS7填充。前端加密代码大概是这样:

const key = CryptoJS.enc.Utf8.parse('mysecretpassword');
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());

后端说收到的密文base64解码后长度不对,是不是我哪里序列化错了?

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
珮青的笔记
这个问题我遇到过太多次了,前端和后端加解密对不上90%是因为数据格式处理的问题。我们一步步来排查:

首先最容易出问题的是密文的传输格式。CryptoJS默认返回的是一个包含多个属性的对象,直接toString()会输出Base64格式,但可能不是后端期望的原始格式。这里需要注意两点:

1. 前端加密后应该这样获取密文:
const ciphertext = encrypted.ciphertext.toString(CryptoJS.enc.Base64);

这样得到的才是纯粹的密文Base64字符串,而不是包含盐值和算法信息的复合对象。

2. 后端PHP解密时需要特别注意几点:
// 密钥和IV必须和前端完全一致
$key = 'mysecretpassword';
$iv = '1234567890123456';

// 接收前端传来的密文
$encrypted = $_POST['data'];

// 先base64解码
$decoded = base64_decode($encrypted);

// 使用openssl解密
$decrypted = openssl_decrypt(
$decoded,
'AES-128-CBC',
$key,
OPENSSL_RAW_DATA,
$iv
);

if ($decrypted === false) {
// 这里可以打印openssl_error_string()看具体错误
die('解密失败');
}


几个常见坑点:
- PHP的openssl默认期望的是原始二进制数据,所以要用OPENSSL_RAW_DATA选项
- 确保前端传的是纯密文,没有附加其他元数据
- IV长度必须严格16字节,和你前端设置的一致
- 两边字符编码要统一,建议都用UTF-8

如果还是有问题,可以这样调试:
1. 在前端打印出加密后的字节数组长度:
CryptoJS.enc.Base64.parse(ciphertext).toString().length
2. 后端收到后同样打印base64解码后的长度
3. 比较这两个长度是否一致

最后吐槽一句,每次搞加密对接都像在拆炸弹,错一个字节就全挂了...
点赞
2026-03-09 12:04
萌新.红爱
啊这个问题我遇到过!前端CryptoJS的加密结果处理方式有点坑,你直接toString()得到的其实是CipherParams对象的特殊格式,不是纯密文。

我的做法是这样修改前端代码:

// 加密部分不变
const encrypted = CryptoJS.AES.encrypt('hello world', key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});

// 关键在这里!用这个方式获取密文
const ciphertext = encrypted.ciphertext.toString(CryptoJS.enc.Base64);


然后后端PHP这样解密:

$key = 'mysecretpassword';
$iv = '1234567890123456';
$ciphertext = base64_decode($_POST['ciphertext']);

$decrypted = openssl_decrypt(
$ciphertext,
'AES-128-CBC',
$key,
OPENSSL_RAW_DATA,
$iv
);


顺便吐槽下CryptoJS这个坑,我当时也折腾了好久才发现它返回的对象结构这么特别... 你试试看这样改应该就能通了!
点赞 5
2026-03-05 21:01