反序列化 RSA public 和私钥 C#

Deserialize RSA public and private key C#

注:我的问题在Whosebug上没有答案

作为我项目的一部分,我必须使用 RSA 加密一些文本,并且我从另一家公司获得了一个 public 密钥。 public 键看起来像这样:

var publicKey="MIGfMA0GCSq2GSIb3DQEBAQUAA4GNADCBiQKBgQCgFGVfrY4jQSoZQWWygZ83roKXWD4YeT2x2p41dGkPixe73rT2IW04glatgN2vgoZsoHuOPqah5and6kAmK2ujmCHu6D1auJhE2tXP+yLkpSiYMQucDKmCsWXlC5K7OSL77TXXcfvTvyZcjObEz6LIBRzs6+FqpFbUO9SJEfh6wIDAQAB" 

问题是我不知道它的格式是什么以及如何将它反序列化为 RSAParameters。网上的其他例子都使用了XML序列化。密钥由 Java.

创建

然后我也想知道如何反序列化它的相关私钥,我现在无法访问它的任何样本。

更新:

这是我的部分代码:

var pk = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiiTx4F35eWP10AFMAo8MLhCKq2ryKFG9PKKWeMLQuwMSdiQq347BkMYA+Q+YscScf7weUSTk9BHVNNfTchDwzjQrIoz6TZGggqD+ufin1Ccy0Sp6QeBMnIB89JsdzQGpVcsoTxk53grW0nYY8D+rlFvBwFicKe/tmVPVMYsEyFwIDAQAB";


...

  public static RSACryptoServiceProvider ImportPublicKey(string pem)
        {
            //var newPem = "-----BEGIN PUBLIC KEY-----\n" + pem + "-----END PUBLIC KEY-----";
            Org.BouncyCastle.OpenSsl.PemReader pr = new Org.BouncyCastle.OpenSsl.PemReader(new StringReader(Pem));
            Org.BouncyCastle.Crypto.AsymmetricKeyParameter publicKey = (Org.BouncyCastle.Crypto.AsymmetricKeyParameter)pr.ReadObject();
            RSAParameters rsaParams = Org.BouncyCastle.Security.DotNetUtilities.ToRSAParameters((Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)publicKey);

           

            RSACryptoServiceProvider csp = new RSACryptoServiceProvider();// cspParams);
            csp.ImportParameters(rsaParams);
            return csp;

        }

发布的密钥是 X.509 (SPKI) 格式的 PEM 编码 public 密钥,但没有页眉 (-----BEGIN PUBLIC KEY-----) 和页脚 (-----END PUBLIC KEY-----)。这可以使用 ASN.1 解析器轻松验证,例如here.

此类密钥的导入取决于.NET 版本。 .NET Core 从 v3.0 开始提供直接支持导入 PKCS#1、PKCS#8 和 X.509 密钥的方法,例如RSA.ImportSubjectPublicKeyInfo for the latter. This option is not available for .NET Framework, but BouncyCastle 提供了一个同样舒适的解决方案。

Here(参见 ImportPublicKey 方法)是一个使用 BouncyCastle[= 导入 X.509 (SPKI) 格式的 PEM 编码 public 密钥的示例27=]。但是,那里使用的 PemReader 需要完整的 PEM 数据,包括页眉和页脚,它们都通过换行符与正文分开。因此,当使用此处发布的 public 键时,必须相应地添加页眉和页脚,例如:

using System.IO;
using System.Security.Cryptography;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
...
// from: https://gist.github.com/valep27/4a720c25b35fff83fbf872516f847863
public static RSACryptoServiceProvider ImportPublicKey(string pemBody)
{
    var pem = "-----BEGIN PUBLIC KEY-----\n" + pemBody + "\n-----END PUBLIC KEY-----";      // Add header and footer
    PemReader pr = new PemReader(new StringReader(pem));
    AsymmetricKeyParameter publicKey = (AsymmetricKeyParameter)pr.ReadObject();
    RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)publicKey);

    RSACryptoServiceProvider csp = new RSACryptoServiceProvider();// cspParams);
    csp.ImportParameters(rsaParams);
    return csp;
}