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

Python AES-256-CBC加密后PHP解密为空,请求排查问题

AES-256-CBC跨语言解密失败的原因及修复方案

核心错误原因

  • 填充逻辑不匹配:Python代码使用PKCS#7填充(自定义pad函数实现:填充字节的数值等于需要填充的字节数),但PHP解密时指定了OPENSSL_ZERO_PADDING,这会让OpenSSL跳过填充处理,导致解密后的数据无法正确还原,最终返回空值。
  • OpenSSL参数误用:OPENSSL_ZERO_PADDING要求输入数据必须是AES块大小(16字节)的整数倍,而Python加密前已做PKCS#7填充,解密后的数据末尾带有填充字节,PHP未处理解填充,也会导致结果异常。

修复后的PHP解密函数

移除OPENSSL_ZERO_PADDING(OpenSSL默认采用PKCS#7填充/解填充),并调整参数确保Base64处理逻辑正确:

function decrypt($encryptedData, $key) {
    // 直接传入Base64编码的加密字符串,OpenSSL会自动解码并处理PKCS#7解填充
    $decryptedData = openssl_decrypt(
        $encryptedData,
        'AES-256-CBC',
        $key,
        0,
        substr($key, 0, 16)
    );
    return $decryptedData;
}

// 若手动处理Base64解码,写法如下:
function decrypt($encryptedData, $key) {
    $rawEncrypted = base64_decode($encryptedData);
    $decryptedData = openssl_decrypt(
        $rawEncrypted,
        'AES-256-CBC',
        $key,
        OPENSSL_RAW_DATA, // 标记传入的是原始二进制数据
        substr($key, 0, 16)
    );
    return $decryptedData;
}

额外验证项

  • 密钥长度符合要求:你的密钥字符串长度为32字节,满足AES-256对密钥长度的要求。
  • 编码一致性:Python和PHP均使用UTF-8编码处理密钥、IV及明文,这部分逻辑无需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:03:21