2010-07-13 3 views
7

Normalmente quando estraggo un X509Certificate2 dal mio keystore posso chiamare .PrivateKey per recuperare la chiave privata del certificato come AsymmetricAlgorithm. Tuttavia, ho deciso di utilizzare Bouncy Castle e la sua istanza di X509Certificate ha solo un getPublicKey(); Non riesco a vedere un modo per ottenere la chiave privata dal certificato. Qualche idea?Ottieni la chiave privata dal certificato BouncyCastle X509? C#

ottengo l'un X509Certificate2 dal mio Windows-MY chiavi quindi utilizzare:

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

Esiste un modo per convertire un (chiave privata C#) AsymmetricAlgorithm ad un AsymmetricKeyParameter (BouncyCastle chiave privata)?

+1

Come stai ottenendo l'oggetto X509Certificate? Che tipo di contenitore stai usando? – CriGoT

+0

Domanda aggiornata. –

+1

C'è * no * chiave privata in un certificato X509. –

risposta

12

Non conosco molto BouncyCastle ma mi sembra che la cosa semplice da fare sia ricreare la chiave in base ai parametri chiave.

 

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

È possibile chiamare il codice utilizzando

 

AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey); 
 

Ovviamente questo presuppone che il certificato include una chiave RSA, ma lo stesso risultato può essere raggiunto per DSA con DSACryptoServiceProvider e DSAParameters

+0

Ha funzionato come un dannato fascino, tu sei un gentiluomo e uno studioso. –

+0

Potresti fornire il codice per DSA che menzioni? A provato da solo, ma non funziona ... – vojta

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

questa dovrebbe essere la risposta? – Sushant

1

Trova .NET X509Certificate2:

X509Certificate2 cert = this.FindCertificate(certificateFriendlyName); 

Parse al certificato BouncyCastle e utilizzare X509Certificate2Signature per ottenere la firma:

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