2010-07-13 5 views
7

Normalement, quand je prends un X509Certificate2 à partir de mon fichier de clés, je peux appeler le .PrivateKey pour récupérer la clé privée du certificat comme AsymmetricAlgorithm. Cependant, j'ai décidé d'utiliser Bouncy Castle et son instance de X509Certificate a seulement un getPublicKey(); Je ne peux pas voir un moyen d'obtenir la clé privée sur le cert. Des idées?Obtenir la clé privée du certificat BouncyCastle X509? C#

je reçois l'un X509Certificate2 de mon Windows MY keystore puis utilisez:

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

est-il de toute façon de convertir un AsymmetricAlgorithm (C# clé privée) à un AsymmetricKeyParameter (bouncycastle clé privée)?

+1

Comment obtenons l'objet que vous X509Certificate? Quel type de conteneur utilisez-vous? – CriGoT

+0

Question mise à jour. –

+1

Il existe une clé privée * no * dans un certificat X509. –

Répondre

12

Ne sait pas BouncyCastle beaucoup mais il me semble que la chose simple à faire est de recréer la clé en fonction des paramètres clés.

 

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

Vous pouvez appeler le code en utilisant

 

AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey); 
 

Évidemment, cela suppose que le certificat comprend une clé RSA, mais le même résultat peut être obtenu pour DSA avec DSACryptoServiceProvider et DSAParameters

+0

Travaillé comme un charme sacrément, vous êtes un gentleman et un érudit. –

+0

Pourriez-vous s'il vous plaît fournir le code pour DSA que vous mentionnez? A essayé par moi-même, mais cela ne fonctionne pas ... – vojta

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

cela devrait être la réponse? – Sushant

1

Trouver .NET X509Certificate2:

X509Certificate2 cert = this.FindCertificate(certificateFriendlyName); 

Parse à un certificat BouncyCastle et utiliser X509Certificate2Signature pour obtenir la signature:

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