【问题标题】:Create RSA public key and private key创建 RSA 公钥和私钥
【发布时间】:2021-06-30 13:17:13
【问题描述】:

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

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

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

【问题讨论】:

  • 链接站点生成 PKCS#1(私有)和 X.509(公共)格式的密钥。两者都应该可以作为 DER 导入 .NET Core(与 .NET Framework 相比),除非您使用的版本太旧。因此,您使用的是哪个 .NET Core 版本?即使 BouncyCastle 单独与 .NET Core 一起使用,您是否也想应用它?
  • 感谢您的回复,我使用的是 .NET Core 2.2,您能给我一些建议来制作密钥文件吗?是的,我只需要它与 .NET Core 一起工作。

标签: c# .net-core rsa bouncycastle


【解决方案1】:

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

.NET Core 从 3.0 版开始仅支持导入 PKCS#1 和 X.509 密钥。对于 .NET Core 2.2,最简单的方法是应用 BouncyCastle。要加载 PEM 密钥,可以使用 BouncyCastle 的 PemReader

选项 1:

使用 BouncyCastle 的 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 又具有签名/验证方法:

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);

选项 2:

或者,可以直接使用 BouncyCastle 的 RsaPrivateCrtKeyParametersRsaKeyParameters

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;
}

以及BouncyCastle的SignerUtilities提供的签名和验证类:

RsaPrivateCrtKeyParameters privateKeyParameters = (RsaPrivateCrtKeyParameters)GetAsymmetricKeyParameterFromPem(privateKey, true);
RsaKeyParameters publicKeyParameters = (RsaKeyParameters)GetAsymmetricKeyParameterFromPem(publicKey, false);

ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");
signer.Init(true, privateKeyParameters);
byte[] dataToSign = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog");
signer.BlockUpdate(dataToSign, 0, dataToSign.Length);
byte[] signature = signer.GenerateSignature();

signer.Init(false, publicKeyParameters);
signer.BlockUpdate(dataToSign, 0, dataToSign.Length);
bool verified = signer.VerifySignature(signature);
Console.WriteLine(verified);

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

【讨论】:

  • 这两种解决方案可以在 .NET Fiddle 上在线比较:dotnetfiddle.net/7rHq89
  • 非常感谢您的努力!效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多