创建 RSA 公钥和私钥

时间:2021-06-29 13:42:05

标签: c# .net-core rsa bouncycastle

我正在尝试使用 BouncyCastle 库在 ASP.NET 核心上创建一个 SHA1withRSA 签名/验证函数,首先我需要制作一个密钥对,我使用这个页面来生成密钥: https://travistidwell.com/jsencrypt/demo/

然而,从我发现的 BouncyCastle 示例代码 (C# Sign Data with RSA using BouncyCastle) 中,从生成的公钥和私钥文本中,我无法制作密钥文件,据我所知,这将是公钥的 .CER 文件和 .PEM 用于私钥。

那么你能给我建议一种制作 .CER 和 .PEM 文件的方法吗?另外,我还没有找到关于使用 BouncyCastle 库签署 SHA1withRSA 的完整示例 - 或者只是核心 C#,如果您能给我推荐一个完整的示例,我将不胜感激,非常感谢。

1 个答案:

答案 0 :(得分:2)

链接的网站生成 PKCS#1 格式的私钥和 X.509/SPKI 格式的公钥,每个 PEM 编码。

.NET Core 自 3.0 版起仅支持导入 PKCS#1 和 X.509 密钥。对于 .NET Core 2.2,最简单的方法是应用 BouncyCastle。要加载 PEM 密钥,可以使用 BouncyCastle 的 .topLabel { margin-top: 50px; } .borderline { border-bottom: 4px solid #000000; padding-bottom: 10px; margin-bottom: 40px } .box-shadow { margin-top: 40px; box-shadow: 0.15rem 0.15rem 0.25rem #000000; }

选项 1:

使用 BouncyCastle 的 PemReader 类,可以派生 DotNetUtilities 实例,从而派生 RSAParameters 实例:

RSACryptoServiceProvider

using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; ... public static RSACryptoServiceProvider GetRSACryptoServiceProviderFromPem(string pem, bool isPrivate) { PemReader pemReader = new PemReader(new StringReader(pem)); object key = pemReader.ReadObject(); RSAParameters rsaParameters = isPrivate ? DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)(((AsymmetricCipherKeyPair)key).Private)) : DotNetUtilities.ToRSAParameters((RsaKeyParameters)key); RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(); rsaKey.ImportParameters(rsaParameters); return rsaKey; } 依次具有签名/验证方法:

RSACryptoServiceProvider

选项 2:

或者,BouncyCastle 的 RSACryptoServiceProvider privateCSP = GetRSACryptoServiceProviderFromPem(privateKey, true); RSACryptoServiceProvider publicCSP = GetRSACryptoServiceProviderFromPem(publicKey, false); byte[] dataToSign = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog"); byte[] signature = privateCSP.SignData(dataToSign, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); bool verified = publicCSP.VerifyData(dataToSign, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); RsaPrivateCrtKeyParameters 类可以直接使用

RsaKeyParameters

以及 BouncyCastle 的 using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; ... public static AsymmetricKeyParameter GetAsymmetricKeyParameterFromPem(string pem, bool isPrivate) { PemReader pemReader = new PemReader(new StringReader(pem)); object key = pemReader.ReadObject(); return isPrivate ? ((AsymmetricCipherKeyPair)key).Private : (AsymmetricKeyParameter)key; } 提供的用于签名和验证的类:

SignerUtilities

两个实现都可以在 .NET Core 2.2 下执行。