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

.NET不同版本RSA加密结果不一致,第三方解密失败求助

问题根源

.NET Framework 4.6及以上版本中,RSACryptoServiceProvider默认使用CNG(Cryptography Next Generation)加密提供程序,而.NET 3.5依赖的是旧版CryptoAPI CSP。即便使用相同公钥和PKCS#1 v1.5填充模式(对应Encrypt方法的false参数),两者生成的加密字节数组仍存在差异,导致Base64编码结果不同,第三方解密逻辑仅兼容.NET 3.5的输出格式。

解决方案

方案1:强制使用.NET 3.5兼容的加密提供程序

通过CspParameters指定旧版CryptoAPI的PROV_RSA_FULL提供程序,让.NET 4.6.2的加密行为与.NET 3.5完全对齐,生成的密文可直接被第三方解密:

public string Encryption(string strText)
{
    var testData = Encoding.UTF8.GetBytes(strText);
    // 配置兼容.NET 3.5的加密参数
    var cspParams = new CspParameters
    {
        ProviderType = 1, // 对应PROV_RSA_FULL,.NET 3.5默认使用的提供程序
        Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseMachineKeyStore
    };
    using (var rsa = new RSACryptoServiceProvider(cspParams))
    {
        rsa.FromXmlString(publicKey.ToString());
        var encryptedData = rsa.Encrypt(testData, false); // 保持PKCS#1 v1.5填充逻辑
        return Convert.ToBase64String(encryptedData);
    }
}

方案2:使用跨版本兼容的RSA抽象类

如果后续计划升级到.NET Core/.NET 5+,推荐使用RSA.Create()替代RSACryptoServiceProvider,显式指定填充模式确保跨版本行为一致:

public string Encryption(string strText)
{
    var testData = Encoding.UTF8.GetBytes(strText);
    using (var rsa = RSA.Create())
    {
        rsa.FromXmlString(publicKey.ToString());
        // 显式指定PKCS#1 v1.5填充,与原代码逻辑对齐
        var encryptedData = rsa.Encrypt(testData, RSAEncryptionPadding.Pkcs1);
        return Convert.ToBase64String(encryptedData);
    }
}
性能优化说明

临时方案读取.NET 3.5加密文件会引入额外IO操作,高负载下会显著提升CPU和磁盘IO占用。上述代码方案直接在内存中生成兼容密文,无需依赖外部文件,能有效降低系统资源消耗,优化高负载场景下的性能表现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:02:06