反序列化 RSA 公钥和私钥 C#

nAv*_*viD 5 c# encryption serialization rsa public-key

作为我的项目的一部分,我必须使用 RSA 加密一些文本,并且我从另一家公司获得了公钥。公钥如下所示:

var publicKey="MIGfMA0GCSq2GSIb3DQEBAQUAA4GNADCBiQKBgQCgFGVfrY4jQSoZQWWygZ83roKXWD4YeT2x2p41dGkPixe73rT2IW04glatgN2vgoZsoHuOPqah5and6kAmK2ujmCHu6D1auJhE2tXP+yLkpSiYMQucDKmCsWXlC5K7OSL77TXXcfvTvyZcjObEz6LIBRzs6+FqpFbUO9SJEfh6wIDAQAB" 
Run Code Online (Sandbox Code Playgroud)

问题是我不知道它的格式是什么以及如何将其反序列化为RSAParameters. Internet 上的其他示例已使用 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;
}
Run Code Online (Sandbox Code Playgroud)

Top*_*aco 7

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

此类密钥的导入取决于 .NET 版本。.NET Core从 v3.0 开始提供直接支持导入 PKCS#1、PKCS#8 和 X.509 密钥的方法,例如RSA.ImportSubjectPublicKeyInfo后者。此选项不适用于.NET Framework,但BouncyCastle提供了类似的舒适解决方案。

这里(参见方法)是一个使用BouncyCastleImportPublicKey导入 X.509 (SPKI) 格式的 PEM 编码公钥的示例。然而,那里使用的期望完整的 PEM 数据,包括页眉和页脚,两者都通过换行符与正文分开。因此,当使用这里发布的公钥时,必须相应地添加页眉和页脚,例如:PemReader

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;
}
Run Code Online (Sandbox Code Playgroud)