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

此外,请注意 RsaPrivateCrtKeyParametersRsaKeyParameters 的子类,因此,根据您的使用方式,可以直接使用 RsaPrivateCrtKeyParameters 实例,其中 public 键是预期的。