创建 RSA public 密钥和私钥
Create RSA public key and private key
我正在尝试使用 BouncyCastle 库在 ASP.NET 核心上创建一个 SHA1withRSA sign/verify 函数,首先我需要创建一个密钥对,我正在使用此页面生成密钥:
https://travistidwell.com/jsencrypt/demo/
然而,根据我发现的 BouncyCastle 示例代码 (C# Sign Data with RSA using BouncyCastle),根据生成的 Public 和私钥文本,我无法制作密钥文件,据我所知,这将是一个public 密钥的 .CER 文件和私钥的 .PEM 文件。
那么您能否建议我一种制作 .CER 和 .PEM 文件的方法?另外,我还没有找到关于使用 BouncyCastle 库签署 SHA1withRSA 的完整示例 - 或者只是核心 C#,如果你能给我一个完整的示例,我将不胜感激,非常感谢。
链接网站生成 PKCS#1 格式的私钥和 public X.509/SPKI 格式的密钥,每个 PEM 编码。
.NET Core 从 3.0 版开始仅支持导入 PKCS#1 和 X.509 密钥。对于 .NET Core 2.2,最简单的方法是应用 BouncyCastle。要加载 PEM 密钥,可以使用 BouncyCastle 的 PemReader
。
选项 1:
使用 BouncyCastle 的 DotNetUtilities
class,可以派生 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
反过来有 signing/verifying:
的方法
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 的 RsaPrivateCrtKeyParameters
和 RsaKeyParameters
class 可以直接使用 :
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
:
提供的用于签名和验证的 classes
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 下执行。
我正在尝试使用 BouncyCastle 库在 ASP.NET 核心上创建一个 SHA1withRSA sign/verify 函数,首先我需要创建一个密钥对,我正在使用此页面生成密钥: https://travistidwell.com/jsencrypt/demo/
然而,根据我发现的 BouncyCastle 示例代码 (C# Sign Data with RSA using BouncyCastle),根据生成的 Public 和私钥文本,我无法制作密钥文件,据我所知,这将是一个public 密钥的 .CER 文件和私钥的 .PEM 文件。
那么您能否建议我一种制作 .CER 和 .PEM 文件的方法?另外,我还没有找到关于使用 BouncyCastle 库签署 SHA1withRSA 的完整示例 - 或者只是核心 C#,如果你能给我一个完整的示例,我将不胜感激,非常感谢。
链接网站生成 PKCS#1 格式的私钥和 public X.509/SPKI 格式的密钥,每个 PEM 编码。
.NET Core 从 3.0 版开始仅支持导入 PKCS#1 和 X.509 密钥。对于 .NET Core 2.2,最简单的方法是应用 BouncyCastle。要加载 PEM 密钥,可以使用 BouncyCastle 的 PemReader
。
选项 1:
使用 BouncyCastle 的 DotNetUtilities
class,可以派生 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
反过来有 signing/verifying:
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 的 RsaPrivateCrtKeyParameters
和 RsaKeyParameters
class 可以直接使用 :
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 下执行。