如何将Java AES/CBC/PKCS5Padding加密逻辑转换为PHP实现?
问题分析与解决方案
你的PHP代码和Java代码输出不一致,核心是两个关键错误:
1. AES模式与密钥长度不匹配
Java中SecretKeySpec会根据密钥字节长度自动适配AES版本:你的密钥mykey123823196ext470329981320tst是32个UTF-8字符(对应32字节),实际使用的是AES-256;但PHP代码指定的是AES-128-CBC,导致密钥处理逻辑完全错误。
2. IV(初始化向量)的编码错误
Java中new byte[16]生成的是全0字节数组(每个字节值为0x00),而PHP里的'0000000000000000'是16个ASCII字符'0'(每个对应字节0x30),两者完全不同。
修正后的PHP代码
$str = 'Emma'; $key = 'mykey123823196ext470329981320tst'; // 生成和Java一致的全0字节IV $iv = str_repeat(chr(0), 16); // 使用AES-256-CBC匹配Java的密钥长度 $encrypted = openssl_encrypt($str, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); $encodedEncryptedData = base64_encode($encrypted); echo $encodedEncryptedData; // 输出:wuN9UzYYdmevVxgTxcYIbw==
关键调整说明
- 把加密模式改为
AES-256-CBC,对齐Java中32字节密钥对应的AES版本 - 用
str_repeat(chr(0), 16)生成全0字节IV,和Java的new byte[16]逻辑一致 - 保留
OPENSSL_RAW_DATA参数,确保输出原始加密字节流后再Base64编码,和Java流程对齐
内容的提问来源于stack exchange,提问作者newsshare24h
相关产品推荐
相关产品推荐

