如何正确调用openssl_decrypt解密C#生成的含IV的base64加密字符串
问题核心原因
你当前调试IV已经完全匹配,解密失败的核心是两个参数配置错误:
- 加密算法位数不匹配:C#的
RijndaelManaged默认用AES算法,密钥长度对应算法位数:16字节密钥对应AES-128,32字节密钥对应AES-256。你C#示例中Key是16字节,所以不能直接用aes-256-cbc,需要根据你的实际密钥长度调整算法名。 - 密钥转换校验缺失:你用
hex2bin(env("ENCRYPTION_KEY"))得到的密钥,需要和C#端_rijndael.Key的字节序列完全一致,任何一个字节不匹配都会解密失败。
修正后完整代码
// 密钥长度16字节用aes-128-cbc,32字节用aes-256-cbc,根据你C#实际密钥长度调整 $cipher = "aes-128-cbc"; // 确认环境变量中存储的是C#密钥字节对应的HEX字符串,无多余字符 $encryption_key = hex2bin(env("ENCRYPTION_KEY")); $base64decoded = base64_decode($encrypted_data, true); // 直接用substr拆分二进制即可,不需要unpack/pack处理 $iv = substr($base64decoded, 0, 16); $encrypted_payload = substr($base64decoded, 16); // 第四个参数传OPENSSL_RAW_DATA,因为$encrypted_payload是原始二进制加密数据,不是base64编码 $decrypted_data = openssl_decrypt($encrypted_payload, $cipher, $encryption_key, OPENSSL_RAW_DATA, $iv); // 可选:如果解密后尾部有多余填充字符,手动去除PKCS7填充 $decrypted_data = rtrim($decrypted_data, "\x00..\x10");
校验步骤
- 打印C#端
_rijndael.Key的字节序列的HEX字符串,和你环境变量ENCRYPTION_KEY的值对比,确保完全相同 - 确认C#端
RijndaelManaged的Mode属性是默认的CipherMode.CBC,Padding属性是默认的PaddingMode.PKCS7,和PHP openssl默认配置一致
内容的提问来源于stack exchange,提问作者Aleksandrs
相关产品推荐
相关产品推荐

