Bouncycastle-从PrivateKey生成PublicKey

时间:2018-08-23 10:33:08

标签: c# bouncycastle

我有一个简单的任务,但我不知道该怎么做。我想使用Bouncycastle在C#中从私钥生成公钥。

using (var reader = new StringReader(privateKey))
{
    var pemReader = new PemReader(reader);
    // ...
}

我发现了很多使用此示例:

AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
var publicKey = keyPair.Public;

但是会引发异常:

  

无法将类型为“ Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters”的对象转换为类型为“ 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);
}

1 个答案:

答案 0 :(得分:1)

如@dlatikay在评论中所述,不一定可以从私钥派生公钥,因此抽象私钥上没有GetPublic方法或属性。但是,大多数私钥类包含足够的信息,可以轻松派生公钥。这是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实例。