JS使用CryptoJS.AES加密的长内容PHP openssl_decrypt解密失败如何解决
问题根源
该故障和字符串长度限制无关,核心是JS和PHP两端的密钥、IV处理逻辑不匹配,且密钥、IV长度不符合AES算法要求:
- JS端使用
CryptoJS.enc.Hex.parse()将十六进制格式的密钥、IV转换为原始二进制字节参与加密,但PHP端直接将十六进制字符串作为密钥、IV传入,两端实际使用的密钥、IV完全不同 - 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
相关产品推荐
相关产品推荐

