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

UP主~悦嘉 阅读 2

我在前端用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解码后长度不对,是不是我哪里序列化错了?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
萌新.红爱
啊这个问题我遇到过!前端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这个坑,我当时也折腾了好久才发现它返回的对象结构这么特别... 你试试看这样改应该就能通了!
点赞 1
2026-03-05 21:01