You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS使用CryptoJS.AES加密的长内容PHP openssl_decrypt解密失败如何解决

问题根源

该故障和字符串长度限制无关,核心是JS和PHP两端的密钥、IV处理逻辑不匹配,且密钥、IV长度不符合AES算法要求:

  1. JS端使用CryptoJS.enc.Hex.parse()将十六进制格式的密钥、IV转换为原始二进制字节参与加密,但PHP端直接将十六进制字符串作为密钥、IV传入,两端实际使用的密钥、IV完全不同
  2. AES-256-CBC要求密钥长度为32字节(对应十六进制字符串长度64位),IV长度为16字节(对应十六进制字符串长度32位),你当前使用的密钥、IV十六进制长度都不符合规范,短内容解密成功仅为巧合

解决方案

第一步:补全密钥和IV到合法长度

将你的密钥补全为64位十六进制字符串,IV补全为32位十六进制字符串,两端同步使用补全后的值。

第二步:修正PHP端密钥、IV的转换逻辑

PHP端需要用hex2bin()将十六进制字符串转换为原始二进制字节,和JS端的CryptoJS.enc.Hex.parse()逻辑对齐。

修正后的PHP解密代码示例

<?php
$ciphertext = "rQAT7R3TJUU+iLIzY+MNpoer7/br60oQrxo2O7BmI0b/O668bT7L5/cJUQbAFFDcwX4+8g3kjem6pCMGU7u9srVM7yauPmw8lcW9IiWSrbg=";
// 请将下面的密钥替换为你补全到64位的合法十六进制密钥
$key = hex2bin('59b6ab45d379b89d794c87b74a51100000000000000000000000000000000000');
// 请将下面的IV替换为你补全到32位的合法十六进制IV
$iv = hex2bin('0aaff094b6bc297a0000000000000000');

var_dump(openssl_decrypt(
    base64_decode($ciphertext),
    'aes-256-cbc',
    $key,
    OPENSSL_RAW_DATA,
    $iv
));

补充说明

CryptoJS默认使用Pkcs7填充,和PHP openssl扩展的默认填充规则一致,无需额外调整填充逻辑。

内容的提问来源于stack exchange,提问作者Maarten Raaijmakers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:15:02