c# - 创建RSA公钥和私钥

标签 c# .net-core rsa bouncycastle

我正在尝试使用 BouncyCaSTLe 库在 ASP.NET Core 上创建 SHA1withRSA 签名/验证功能,首先我需要创建 key 对,我正在使用此页面生成 key : https://travistidwell.com/jsencrypt/demo/

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

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

最佳答案

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

自版本 3.0 起,.NET Core 仅支持导入 PKCS#1 和 X.509 key 。对于.NET Core 2.2,最简单的方法是应用 BouncyCaSTLe。为了加载 PEM key ,可以使用 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 下执行。

关于c# - 创建RSA公钥和私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68179901/

相关文章:

c# - 如何显示二次公式的解

javascript - 如何获取表格行中被单击元素的 id?

c# - 可以在 linq to sql 中使用 lambda 表达式吗?

docker - dotnet 核心限制内存使用

c# - Perl 和 .NET RSA 一起工作?从 Perl 公钥在 .NET 中加密?从 Perl 加载私钥?

java - 使用 RSA 加密长字符串 (Java)

c# - if else 在 asp.net 数据网格上填充数据源

c# - 获取 .NET Core JsonSerializer 以序列化私有(private)成员

c# - 如何从 TypeInfo 获取声明和继承的成员

android - 不应使用具有 ECB 模式的密码