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

基于C#实现Base64编码RSA私钥的解密功能

解决.NET中Base64格式RSA密钥的解密问题

我帮你搞定这个Base64 RSA密钥的解密问题——毕竟.NET默认依赖XML格式密钥确实有点麻烦,结合你已经用iTextSharp完成了加密,咱们直接上可行的解决方案:

1. 先搞定Base64密钥转.NET RSA可用格式

你的Base64密钥应该是PKCS#8(私钥)和X.509(公钥)格式(这也是iTextSharp常用的密钥标准),我们需要把它转换成.NET的RSAParameters对象才能用。这里用BouncyCastle库来简化操作(.NET原生处理这类格式太繁琐),先通过NuGet安装BouncyCastle包,然后写转换工具:

using System;
using System.Security.Cryptography;
using System.IO;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Crypto;

public static class RSAKeyConverter
{
    // Base64 PKCS#8私钥转RSAParameters
    public static RSAParameters ConvertPkcs8PrivateKeyFromBase64(string base64PrivateKey)
    {
        byte[] privateKeyBytes = Convert.FromBase64String(base64PrivateKey);
        using (var ms = new MemoryStream(privateKeyBytes))
        {
            var reader = new PemReader(new StreamReader(ms));
            var keyPair = (AsymmetricCipherKeyPair)reader.ReadObject();
            return DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyPair.Private);
        }
    }

    // Base64 X.509公钥转RSAParameters
    public static RSAParameters ConvertX509PublicKeyFromBase64(string base64PublicKey)
    {
        byte[] publicKeyBytes = Convert.FromBase64String(base64PublicKey);
        using (var ms = new MemoryStream(publicKeyBytes))
        {
            var reader = new PemReader(new StreamReader(ms));
            var publicKeyParams = (RsaKeyParameters)reader.ReadObject();
            return DotNetUtilities.ToRSAParameters(publicKeyParams);
        }
    }
}

2. 编写解密核心方法

解密的关键是填充方式必须和你用iTextSharp加密时完全一致——这是新手最容易踩坑的点!比如iTextSharp如果用RSA/ECB/PKCS1Padding加密,解密就要用RSAEncryptionPadding.Pkcs1;如果用OAEP填充,就要对应匹配哈希算法(比如SHA-1、SHA-256)。

public static byte[] DecryptWithRsa(byte[] encryptedData, RSAParameters privateKeyParams, RSAEncryptionPadding padding)
{
    using (var rsa = RSA.Create())
    {
        rsa.ImportParameters(privateKeyParams);
        return rsa.Decrypt(encryptedData, padding);
    }
}

3. 整合到你的Program类中

把上面的代码整合到你的现有程序里,示例如下:

internal class Program
{
    public static void Main()
    {
        // 替换成你的Base64私钥
        string base64PrivateKey = "你的PKCS#8格式Base64私钥";
        // 替换成你加密后得到的Base64数据
        string encryptedBase64Data = "加密后的Base64字符串";
        
        // 1. 转换私钥为.NET可用格式
        var rsaPrivateParams = RSAKeyConverter.ConvertPkcs8PrivateKeyFromBase64(base64PrivateKey);
        
        // 2. 选择和加密时一致的填充方式,这里举两个例子:
        // 情况1:加密用的是PKCS#1 v1.5填充(iTextSharp常见默认)
        var padding = RSAEncryptionPadding.Pkcs1;
        // 情况2:加密用的是OAEP-SHA256填充,就用这个:
        // var padding = RSAEncryptionPadding.OaepSHA256;
        
        // 3. 解密流程
        byte[] encryptedData = Convert.FromBase64String(encryptedBase64Data);
        byte[] decryptedBytes = DecryptWithRsa(encryptedData, rsaPrivateParams, padding);
        
        // 把解密后的字节转成明文(根据你的数据编码调整,比如UTF-8)
        string plainText = System.Text.Encoding.UTF8.GetString(decryptedBytes);
        Console.WriteLine("解密结果:" + plainText);
    }
}

敲黑板!关键注意事项

  • 填充方式绝对不能错:如果加密时用的是OAEP填充,解密时一定要用对应的RSAEncryptionPadding.OaepSHAXX,否则会直接抛出解密失败的异常。你可以回头查一下iTextSharp加密时的Cipher.getInstance()参数,比如"RSA/ECB/OAEPWithSHA-1AndMGF1Padding"对应RSAEncryptionPadding.OaepSHA1。
  • 密钥格式要对应:确认你的私钥是PKCS#8格式(去掉-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----以及换行后的Base64内容),公钥是X.509格式(同理去掉首尾标识)。
  • BouncyCastle版本兼容:确保安装的BouncyCastle NuGet包和iTextSharp依赖的版本匹配,避免出现依赖冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:46