2010-07-13 328 views
7

正常情况下,当我从我的密钥库中获取X509Certificate2时,我可以拨打.PrivateKey来检索证书的私钥,作为AsymmetricAlgorithm。然而,我决定使用Bouncy Castle,它的实例X509Certificate只有一个getPublicKey();我看不到一种方法将私钥取出证书。有任何想法吗?从BouncyCastle X509证书获取私钥? C#

我从我的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的私钥)?

+1

你是如何获得X509Certificate对象?你使用什么样的容器? – CriGoT 2010-07-13 18:57:40

+0

更新的问题。 – 2010-07-13 19:11:44

+1

X509证书中有*无*私钥。 – 2010-07-14 00:46:08

回答

12

不知道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)); 
    } 
 

您可以通过使用

 

AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey); 
 

调用代码显然,这假定证书包括RSA密钥,但相同的结果可以为DSA,而实现与DSACryptoServiceProviderDSAParameters

+0

工作就像一个该死的魅力,你是一个绅士和学者。 – 2010-07-14 13:46:52

+0

您能否提供您提到的DSA代码?一个人试了一下,但它不起作用... – vojta 2015-09-10 11:16:45

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

这应该是答案? – Sushant 2014-12-19 22:01:18

1

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