2010-07-13 25 views
7

Normalerweise, wenn ich eine X509Certificate2 aus meinem Keystore schnappen kann ich .PrivateKey aufrufen, um den privaten Schlüssel des Zertifikats als AsymmetricAlgorithm abzurufen. Jedoch habe ich beschlossen, Bouncy Castle zu verwenden und seine Instanz von X509Certificate hat nur eine getPublicKey(); Ich kann keinen Weg sehen, den privaten Schlüssel aus dem cert zu bekommen. Irgendwelche Ideen?Erhalten Sie privaten Schlüssel von BouncyCastle X509-Zertifikat? C#

Ich erhalte die eine X509Certificate2 von meinem Windows-MY-Schlüsselspeicher verwenden Sie dann:

//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? 

Gibt es trotzdem eine AsymmetricAlgorithm (C# private Schlüssel) zu einem AsymmetricKeyParameter (bouncycastle privater Schlüssel) zu konvertieren?

+1

Wie werden Sie das X509Certificate Objekt zu erhalten? Welche Art von Container benutzen Sie? – CriGoT

+0

Aktualisierte Frage. –

+1

In einem X509-Zertifikat befindet sich * kein * privater Schlüssel. –

Antwort

12

Ich kenne BouncyCastle nicht so gut, aber es scheint mir, dass es einfach ist, den Schlüssel basierend auf den Schlüsselparametern neu zu erstellen.

 

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

Sie können den Code aufrufen, indem Sie

 

AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey); 
 

Offensichtlich geht davon aus, dass das Zertifikat einen RSA-Schlüssel enthält, aber das gleiche Ergebnis kann mit DSACryptoServiceProvider und DSAParameters

+0

Arbeitete wie ein verdammter Charme, Sie sind ein Gentleman und ein Gelehrter. –

+0

Könnten Sie bitte den von Ihnen erwähnten Code für DSA angeben? A versuchte es von mir, aber es funktioniert nicht ... – vojta

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

sollte dies die Antwort sein? – Sushant

1
für DSA erreicht werden

Finden. NET X509Certificate2:

X509Certificate2 cert = this.FindCertificate(certificateFriendlyName); 

Parse es BouncyCastle Zertifikat und verwenden X509Certificate2Signature Signatur zu erhalten:

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