从BouncyCastle X509证书获取私钥? C#

通常,当我从密钥库中获取X509Certificate2时,我可以调用.PrivateKey来检索证书的私钥作为AsymmetricAlgorithm 。 但是我决定使用Bouncy Castle,它的X509Certificate实例只有一个getPublicKey(); 我看不到从私有密钥中获取私钥的方法。 有任何想法吗?

我从我的Windows-MY密钥库中获取了X509Certificate2,然后使用:

 //mycert is an X509Certificate2 retrieved from Windows-MY Keystore X509CertificateParser certParser = new X509CertificateParser(); X509Certificate privateCertBouncy = certParser.ReadCertificate(mycert.GetRawCertData()); AsymmetricKeyParameter pubKey = privateCertBouncy.GetPublicKey(); //how do i now get the private key to make a keypair? 

无论如何将AsymmetricAlgorithm (C#私钥)转换为AsymmetricKeyParameter (bouncycastle私钥)?

不知道BouncyCastle那么多,但在我看来,简单的事情是根据关键参数重新创建密钥。

public static AsymmetricKeyParameter TransformRSAPrivateKey(AsymmetricAlgorithm privateKey) { RSACryptoServiceProvider prov = privateKey as RSACryptoServiceProvider; RSAParameters parameters = prov.ExportParameters(true); return new RsaPrivateCrtKeyParameters( new BigInteger(1,parameters.Modulus), new BigInteger(1,parameters.Exponent), new BigInteger(1,parameters.D), new BigInteger(1,parameters.P), new BigInteger(1,parameters.Q), new BigInteger(1,parameters.DP), new BigInteger(1,parameters.DQ), new BigInteger(1,parameters.InverseQ)); }
public static AsymmetricKeyParameter TransformRSAPrivateKey(AsymmetricAlgorithm privateKey) { RSACryptoServiceProvider prov = privateKey as RSACryptoServiceProvider; RSAParameters parameters = prov.ExportParameters(true); return new RsaPrivateCrtKeyParameters( new BigInteger(1,parameters.Modulus), new BigInteger(1,parameters.Exponent), new BigInteger(1,parameters.D), new BigInteger(1,parameters.P), new BigInteger(1,parameters.Q), new BigInteger(1,parameters.DP), new BigInteger(1,parameters.DQ), new BigInteger(1,parameters.InverseQ)); } 

您可以使用调用代码

AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey);
AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey); 

显然,这假设证书包含RSA密钥,但使用DSACryptoServiceProviderDSAParameters可以为DSA实现相同的结果

 Akp = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(this.Certificate.PrivateKey).Private; 

查找.NET X509Certificate2:

 X509Certificate2 cert = this.FindCertificate(certificateFriendlyName); 

将其解析为BouncyCastle证书并使用X509Certificate2Signature获取签名:

 var parser = new X509CertificateParser(); var bouncyCertificate = parser.ReadCertificate(cert.RawData); var algorithm = DigestAlgorithms.GetDigest(bouncyCertificate.SigAlgOid); var signature = new X509Certificate2Signature(cert, algorithm);