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

PHP的openssl_public_encrypt转C#代码结果不一致求助

PHP转C# RSA加密结果不一致问题排查

原PHP加密代码

if (null === $date)
    $date = time();
$plain = "user:{$login};system:{$system};date:{$date};";

if (!openssl_public_encrypt($plain, $encrypted, $this->key)) {
    throw new \Exception("Error while encoding with message: "  . openssl_error_string());
}

return base64_encode(base64_encode($encrypted));

编写的C#代码

if (date == null) date = DateTimeOffset.Now;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters rsaParam = rsa.ExportParameters(false);
rsaParam.Modulus = key;
rsa.ImportParameters(rsaParam);

var plain = $"user:{login};system:{system};date:{date.Value.ToUnixTimeSeconds()};";
var result = rsa.Encrypt(Encoding.UTF8.GetBytes(plain), RSAEncryptionPadding.Pkcs1);

return Convert.ToBase64String(Encoding.UTF8.GetBytes(Convert.ToBase64String(result)));

问题现象

转换后两者加密结果差异明显:长度不同,C#生成的结果末尾缺少两个"",PHP结果始终带有"",已确认除时间戳外明文内容一致。

排查与修复

1. RSA公钥参数不完整

PHP的openssl_public_encrypt使用的是完整公钥(通常包含Modulus和Exponent等参数),而你的C#代码仅设置了Modulus,缺失公钥指数(Exponent)。RSA加密必须同时使用Modulus和Exponent才能生成合法公钥,参数缺失会直接导致加密逻辑错误。

默认RSA公钥指数为65537,对应字节数组为new byte[] { 0x01, 0x00, 0x01 },补充该参数后可修复核心问题:

RSAParameters rsaParam = rsa.ExportParameters(false);
rsaParam.Modulus = key;
rsaParam.Exponent = new byte[] { 0x01, 0x00, 0x01 }; // 补充公钥指数
rsa.ImportParameters(rsaParam);

2. 推荐使用更可靠的RSA实现

RSACryptoServiceProvider是较旧的API,建议使用.NET Core/.NET 5+推荐的RSACng,兼容性与安全性更优:

using (var rsa = new RSACng())
{
    RSAParameters rsaParam = new RSAParameters();
    rsaParam.Modulus = key;
    rsaParam.Exponent = new byte[] { 0x01, 0x00, 0x01 };
    rsa.ImportParameters(rsaParam);
    
    // 后续加密逻辑保持不变
}

3. 验证Base64编码逻辑

两次Base64编码的逻辑在PHP与C#中完全一致:

  • PHP:二进制加密结果→Base64字符串→该字符串的UTF8字节→Base64字符串
  • C#:Convert.ToBase64String(Encoding.UTF8.GetBytes(Convert.ToBase64String(result)))
    这部分逻辑无需修改。

4. 时间戳一致性验证

确保date为null时,C#生成的秒级Unix时间戳与PHP的time()完全一致,需确认服务器时区统一(均为UTC或同一本地时区),避免时区差异导致明文不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:05:24