反序列化 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;
}
注:我的问题在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;
}