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

如何正确调用openssl_decrypt解密C#生成的含IV的base64加密字符串

问题核心原因

你当前调试IV已经完全匹配,解密失败的核心是两个参数配置错误:

  1. 加密算法位数不匹配:C#的RijndaelManaged默认用AES算法,密钥长度对应算法位数:16字节密钥对应AES-128,32字节密钥对应AES-256。你C#示例中Key是16字节,所以不能直接用aes-256-cbc,需要根据你的实际密钥长度调整算法名。
  2. 密钥转换校验缺失:你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 08:57:02