PHP与Java AES-256-CBC加密结果不一致,需对齐Java输出
调整PHP AES-256-CBC加密代码以匹配Java输出
问题描述
使用以下PHP代码进行AES-256-CBC加密:
$content='Hello World'; $output = openssl_encrypt( $content, 'AES-256-CBC', '2EE3732CA11BAD106A2429C142136345', OPENSSL_RAW_DATA, $iv ); echo bin2hex($output);
得到输出:bc08212ff2960c50327e4f1585f401b9
但使用在线工具加密时,输出为:5415dc0f7cc496be97f2dc9b9d5b2b42,同时以下Java代码也得到该结果:
String text="Hello World"; String secretKey="2EE3732CA11BAD106A2429C142136345"; IvParameterSpec ivParameterSpec = new IvParameterSpec("0000000000000000".getBytes()); SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "AES"); Cipher instance = Cipher.getInstance("AES/CBC/PKCS5Padding"); instance.init(1, secretKeySpec, ivParameterSpec); String output= stringToHex(instance.doFinal(text.getBytes())); System.out.println(output); //Output: 5415dc0f7cc496be97f2dc9b9d5b2b42
需要修改PHP代码,使其输出与Java一致。
解决方法
修改后的PHP代码如下:
$content = 'Hello World'; $key = '2EE3732CA11BAD106A2429C142136345'; // 与Java一致的IV:16个0的字符串 $iv = '0000000000000000'; $output = openssl_encrypt( $content, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv ); echo bin2hex($output); // 输出:5415dc0f7cc496be97f2dc9b9d5b2b42
关键修改点
- 统一初始向量(IV):Java代码中使用固定的16个0字符串作为IV,PHP代码需显式定义相同值的
$iv,确保加密初始条件一致。 - 编码对齐:PHP默认字符串编码为UTF-8,与Java默认的字符串转字节编码匹配,无需额外转换。
- 填充方式兼容:Java使用
PKCS5Padding,PHP的openssl_encrypt默认使用PKCS7Padding,由于AES块大小为16字节,两种填充方式效果完全一致,无需额外配置。
内容的提问来源于stack exchange,提问作者ABP
相关产品推荐
相关产品推荐

