2010-07-13 326 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);