2010-07-13 32 views
7

Thông thường khi tôi lấy X509Certificate2 ra khỏi kho khóa của mình, tôi có thể gọi .PrivateKey để truy xuất khóa riêng của chứng chỉ dưới dạng AsymmetricAlgorithm. Tuy nhiên tôi đã quyết định sử dụng Lâu đài Bouncy và trường hợp của nó là X509Certificate chỉ có một số getPublicKey(); Tôi không thể thấy cách để lấy khóa riêng ra khỏi chứng chỉ. Bất kỳ ý tưởng?Nhận khóa cá nhân từ BouncyCastle X509 Certificate? C#

tôi nhận được một X509Certificate2 từ Windows-MY keystore của tôi sau đó sử dụng:

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

Liệu có cách nào để chuyển đổi một (C# private key) AsymmetricAlgorithm đến một AsymmetricKeyParameter (BouncyCastle private key)?

+1

How are you thu thập các đối tượng X509Certificate? Bạn đang sử dụng loại container nào? – CriGoT

+0

Đã cập nhật câu hỏi. –

+1

Có * không * khóa cá nhân trong chứng chỉ X509. –

Trả lời

12

Không biết BouncyCastle nhiều nhưng có vẻ như với tôi rằng điều đơn giản cần làm là tạo lại khóa dựa trên các thông số chính.

 

    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)); 
    } 
 

Bạn có thể gọi mã bằng cách sử dụng

 

AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey); 
 

Rõ ràng điều này giả định rằng chứng chỉ bao gồm một khóa RSA nhưng cùng một kết quả có thể đạt được cho DSA với DSACryptoServiceProviderDSAParameters

+0

Làm việc như một sự quyến rũ chết tiệt, bạn là một quý ông và một học giả. –

+0

Bạn có thể vui lòng cung cấp mã cho DSA mà bạn đề cập không? Một thử nó một mình, nhưng nó không hoạt động ... – vojta

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

này phải là câu trả lời? – Sushant

1

Tìm .NET X509Certificate2:

X509Certificate2 cert = this.FindCertificate(certificateFriendlyName); 

Parse nó để chứng BouncyCastle và sử dụng X509Certificate2Signature để có được chữ ký:

var parser = new X509CertificateParser(); 
var bouncyCertificate = parser.ReadCertificate(cert.RawData); 
var algorithm = DigestAlgorithms.GetDigest(bouncyCertificate.SigAlgOid); 
var signature = new X509Certificate2Signature(cert, algorithm); 
Các vấn đề liên quan