作为我的项目的一部分,我必须使用 RSA 加密一些文本,并且我从另一家公司获得了公钥。公钥如下所示:
var publicKey="MIGfMA0GCSq2GSIb3DQEBAQUAA4GNADCBiQKBgQCgFGVfrY4jQSoZQWWygZ83roKXWD4YeT2x2p41dGkPixe73rT2IW04glatgN2vgoZsoHuOPqah5and6kAmK2ujmCHu6D1auJhE2tXP+yLkpSiYMQucDKmCsWXlC5K7OSL77TXXcfvTvyZcjObEz6LIBRzs6+FqpFbUO9SJEfh6wIDAQAB"
问题是我不知道它的格式是什么以及如何将其反序列化为RSAParameters
。 Internet 上的其他示例已使用 XML 序列化。密钥由 Java 创建。
然后我还想知道如何反序列化其相关的私钥,我现在无法访问它的任何示例。
Update :
这是我的代码的一部分:
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 编码公钥,但没有标头 (-----BEGIN PUBLIC KEY-----
) 和页脚 (-----END PUBLIC KEY-----
)。这可以使用 ASN.1 解析器轻松验证,例如here.
此类密钥的导入取决于 .NET 版本。.NET核心从 v3.0 开始提供直接支持导入 PKCS#1、PKCS#8 和 X.509 密钥的方法,例如RSA.ImportSubjectPublicKeyInfo对于后者。此选项不适用于.NET框架, but 充气城堡提供了同样舒适的解决方案。
Here (see ImportPublicKey
方法)是一个使用 X.509 (SPKI) 格式导入 PEM 编码公钥的示例充气城堡。但是,那PemReader
此处使用的数据需要完整的 PEM 数据,包括页眉和页脚,两者均通过换行符与正文分隔。因此,当使用此处发布的公钥时,必须相应地添加页眉和页脚,例如:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)