Получить закрытый ключ от сертификата BouncyCastle X509?C # - PullRequest
9 голосов
/ 13 июля 2010

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

Я получаю сертификат X509Certificate2 из моего хранилища ключей Windows-MY, затем использую:

//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 #) в * 1012?* (закрытый ключ)?

Ответы [ 3 ]

21 голосов
/ 16 сентября 2011
Akp = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(this.Certificate.PrivateKey).Private;
17 голосов
/ 14 июля 2010

Не слишком много знаю 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 с DSACryptoServiceProvider и DSAParameters

1 голос
/ 20 мая 2015

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