Получите закрытый ключ от сертификата BouncyCastle X509? С#

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

Я получаю 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 private ключ)?

3 ответов


не знаю 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


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

найти .Чистая 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);