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

