Bouncycastle - 从私钥生成公钥
Bouncycastle - Generate PublicKey from PrivateKey
我有一个简单的任务,但我不知道该怎么做。我想在 C# 中使用 Bouncycastle 从私钥生成 public 密钥。
using (var reader = new StringReader(privateKey))
{
var pemReader = new PemReader(reader);
// ...
}
我发现了很多使用这个的例子:
AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
var publicKey = keyPair.Public;
但是抛出异常:
Unable to cast object of type 'Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters' to type 'Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair
我需要更改什么才能使其正常工作?
编辑:
我使用了来自@James K Polk 的示例并让它运行起来。
using (var reader = new StringReader(privateKey))
{
var pemReader = new PemReader(reader);
var pemObject = pemReader.ReadObject();
var rsaPrivateCrtKeyParameters = (RsaPrivateCrtKeyParameters)pemObject;
var rsaKeyParameters = new RsaKeyParameters(false, rsaPrivateCrtKeyParameters.Modulus, rsaPrivateCrtKeyParameters.PublicExponent);
}
如@dlatikay 的评论所述,public 密钥不一定可以从私钥派生,因此没有 GetPublic
方法或 属性在抽象私钥上可用。然而,大多数私钥 类 包含足够的信息来轻松导出 public 密钥。这是 Bouncycastle RSA 私钥的示例:
var rand = new SecureRandom();
var keyGenParams = new RsaKeyGenerationParameters( new BigInteger("65537"), rand, 1024, 64 );
var rsaKeyGen = new RsaKeyPairGenerator();
rsaKeyGen.Init(keyGenParams);
var rsaKeyPair = rsaKeyGen.GenerateKeyPair();
var rsaPriv = (RsaPrivateCrtKeyParameters) rsaKeyPair.Private;
// Make a public from the private
var rsaPub = new RsaKeyParameters(false, rsaPriv.Modulus, rsaPriv.PublicExponent);
此外,请注意 RsaPrivateCrtKeyParameters
是 RsaKeyParameters
的子类,因此,根据您的使用方式,可以直接使用 RsaPrivateCrtKeyParameters
实例,其中 public 键是预期的。
我有一个简单的任务,但我不知道该怎么做。我想在 C# 中使用 Bouncycastle 从私钥生成 public 密钥。
using (var reader = new StringReader(privateKey))
{
var pemReader = new PemReader(reader);
// ...
}
我发现了很多使用这个的例子:
AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
var publicKey = keyPair.Public;
但是抛出异常:
Unable to cast object of type 'Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters' to type 'Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair
我需要更改什么才能使其正常工作?
编辑:
我使用了来自@James K Polk 的示例并让它运行起来。
using (var reader = new StringReader(privateKey))
{
var pemReader = new PemReader(reader);
var pemObject = pemReader.ReadObject();
var rsaPrivateCrtKeyParameters = (RsaPrivateCrtKeyParameters)pemObject;
var rsaKeyParameters = new RsaKeyParameters(false, rsaPrivateCrtKeyParameters.Modulus, rsaPrivateCrtKeyParameters.PublicExponent);
}
如@dlatikay 的评论所述,public 密钥不一定可以从私钥派生,因此没有 GetPublic
方法或 属性在抽象私钥上可用。然而,大多数私钥 类 包含足够的信息来轻松导出 public 密钥。这是 Bouncycastle RSA 私钥的示例:
var rand = new SecureRandom();
var keyGenParams = new RsaKeyGenerationParameters( new BigInteger("65537"), rand, 1024, 64 );
var rsaKeyGen = new RsaKeyPairGenerator();
rsaKeyGen.Init(keyGenParams);
var rsaKeyPair = rsaKeyGen.GenerateKeyPair();
var rsaPriv = (RsaPrivateCrtKeyParameters) rsaKeyPair.Private;
// Make a public from the private
var rsaPub = new RsaKeyParameters(false, rsaPriv.Modulus, rsaPriv.PublicExponent);
此外,请注意 RsaPrivateCrtKeyParameters
是 RsaKeyParameters
的子类,因此,根据您的使用方式,可以直接使用 RsaPrivateCrtKeyParameters
实例,其中 public 键是预期的。