2010-07-13 7 views
7

Обычно, когда я извлекаю X509Certificate2 из своего хранилища ключей, я могу позвонить .PrivateKey, чтобы получить закрытый ключ сертификата как AsymmetricAlgorithm. Однако я решил использовать Bouncy Castle, и его экземпляр X509Certificate имеет только getPublicKey();. Я не вижу способа получить секретный ключ из сертификата. Есть идеи?Получить личный ключ от сертификата BouncyCastle X509? C#

я получаю письмо от моего X509Certificate2 Windows-МОЕГО хранилища используйте:

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

+0

Обновленный вопрос. –

+1

В * сертификате X509 есть * * закрытый ключ. –

ответ

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 ключ, но тот же результат может быть достигнут за АСС с DSACryptoServiceProvider и DSAParameters

+0

Работал, как чертов шарм, вы джентльмен и ученый. –

+0

Не могли бы вы предоставить код для DSA, который вы упомянули? Попробовал сам, но он не работает ... – vojta

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

это должен быть ответ? – Sushant

1

Найти .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);