Получите закрытый ключ от сертификата 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
найти .Чистая 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);