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

PHP中openssl_decrypt AES-128-CBC解密失败,命令行可正常运行

排查PHP AES解密乱码问题

对比你能正常工作的OpenSSL命令,你的PHP代码存在几个关键问题,导致解密结果乱码:

1. 密钥格式处理错误

OpenSSL命令中-K参数接收的是十六进制编码的密钥,但PHP的openssl_decrypt函数需要的是二进制格式的密钥。你当前的代码把明文密钥$secretHash转成十六进制字符串直接传入,相当于把十六进制字符串当成了明文密钥,和命令行的逻辑完全不符。

举个例子:命令行里的-K 422943374a3568755d7c527f6e472132是十六进制密钥,需要先转成二进制才能在PHP中使用;如果你的$secretHash是这个十六进制密钥对应的明文,那直接用明文本身(二进制)即可,不需要转十六进制。

2. 输入数据与标志位不匹配

你一开始直接把base64编码的字符串传给openssl_decrypt,同时使用OPENSSL_ZERO_PADDING,这会导致函数解析错误:

  • OPENSSL_ZERO_PADDING要求输入是原始二进制加密数据(而非base64编码)
  • 必须搭配OPENSSL_RAW_DATA标志,告诉函数输入是二进制格式

3. 零填充的后续处理

OpenSSL命令的-nopad会保留原始加密数据的长度(要求是16字节的整数倍),解密后结果末尾可能存在多余的零字节,需要手动去除。


修正后的PHP代码示例

假设你使用的是命令行里的十六进制密钥,修正后的代码如下:

$encodedStr = "D5fiXKI4ie4c69gcCwM4/p414yrYtH9np+piNoqZASbkUnHAvbB4norHz6d6uzJmIg1sULhHFmfQTkvpw0tIEVmNcjyP6j2LK8zXYzohtNlsqBHx5v4xHEIyCcvfbMJddd5hs97jqkUtHuQyer2GdfDKZseaGgpXJ75GK7uKFPkbJ3wgQ6A0Q7q2tbBYeXEDmRMO6OhWeHgrezQOcyjcdOQk50SjMuaSb9IRimwagXamiXRg0LyTzA18a0SuqtbKCNgXnmhf39YxJUudkRmcMQ==";
// 命令行中的十六进制密钥
$hexKey = "422943374a3568755d7c527f6e472132";
$encryptionMethod = "AES-128-CBC";
// 全零IV转二进制(和命令行的-iv参数一致)
$iv = hex2bin("00000000000000000000000000000000");

// 解码base64得到原始二进制加密数据
$encrypted = base64_decode($encodedStr);
// 十六进制密钥转二进制
$binaryKey = hex2bin($hexKey);

// 使用正确的标志组合:原始二进制输入 + 零填充
$response = openssl_decrypt($encrypted, $encryptionMethod, $binaryKey, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

// 去除解密后可能存在的末尾零字节
$response = rtrim($response, "\x00");

var_dump($response);

如果你的$secretHash是明文密钥,先验证它的十六进制是否和命令行的-K一致:

$secretHash = ",MF-,2Y*s8DoYCFI";
echo bin2hex($secretHash); // 输出如果和422943374a3568755d7c527f6e472132一致,直接用$binaryKey = $secretHash;

额外注意事项

  • AES-128要求密钥长度必须是16字节(128位),确保你的密钥转成二进制后符合这个长度,否则openssl_decrypt会自动截断/补全,导致解密失败。
  • AES-CBC必须传入IV,即使是全零的也不能省略,否则函数会使用默认IV(不同环境可能不同),导致结果错误。
  • 如果解密后仍有问题,可以先对比命令行和解密后的二进制数据,确认每一步的处理是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:44