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
相关产品推荐
相关产品推荐

