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

