【问题标题】:Get Private Key from BouncyCastle X509 Certificate? C#从 BouncyCastle X509 证书获取私钥? C#
【发布时间】:2021-06-02 13:56:54
【问题描述】:

通常,当我从我的密钥库中获取X509Certificate2 时,我可以调用.PrivateKey 以将证书的私钥作为AsymmetricAlgorithm 检索。但是我决定使用 Bouncy Castle 并且它的 X509Certificate 实例只有一个 getPublicKey(); 我看不到从证书中获取私钥的方法。有什么想法吗?

我从我的 Windows-MY 密钥库中获得了 X509Certificate2,然后使用:

//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 私钥)?

【问题讨论】:

    标签: c# x509certificate bouncycastle private-key


    【解决方案1】:
    Akp = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(this.Certificate.PrivateKey).Private;
    

    【讨论】:

    • 这应该是答案吗?
    • 这样做我得到Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'The requested operation is not supported.'
    【解决方案2】:

    不太了解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 密钥,但使用 DSACryptoServiceProviderDSAParameters 的 DSA 可以实现相同的结果。

    【讨论】:

      【解决方案3】:

      查找 .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);
      

      【讨论】:

      • 这不适用于 EC 椭圆曲线私钥
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2014-08-19
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多