web-dev-qa-db-ja.com

x509Certificate2からRSACryptoServiceProviderを開始する最良の方法?

キーストアからプルしたX509Certificate2から新しいRSACryptoServiceProviderオブジェクトを初期化する最良の方法は何ですか?証明書は、公開鍵(暗号化用)と秘密鍵(復号用)の両方に関連付けられています。

私は現在FromXmlStringメソッドを使用していますが、もっと良い方法があるはずです。

ありがとう

28
Petey B
RSACryptoServiceProvider publicKeyProvider = 
    (RSACryptoServiceProvider)certificate.PublicKey.Key;

そして

RSACryptoServiceProvider privateKeyProvider = 
    (RSACryptoServiceProvider)certificate.PrivateKey;

証明書の公開キープロパティまたは秘密キープロパティのキープロパティは、AsymmetricAlgorithm型です。

47
blowdart

推奨される方法は、RSA基本クラスを使用してcertificate.GetRSAPrivateKey()を呼び出すことです。

RSA publicKeyProvider = certificate.GetRSAPrivateKey();

.NET 4.6以降、@ blowdartで提案されているRSACryptoServiceProviderへのキャストは推奨されなくなりました。 .NETにはいくつかのバージョン(.NET Coreなど)があるため、これはさらに問題になります。

この方法でRSACryptoServiceProviderにキャストすることで、このキャスト例外が発生する可能性が高くなります(使用するプラットフォームとライブラリによって異なります)。

タイプ「System.Security.Cryptography.RSACng」のオブジェクトをタイプ「System.Security.Cryptography.RSACryptoServiceProvider」にキャストできません

その理由は、実際の実装は各プラットフォームと異なる可能性があるためです。WindowsではRSACngが使用されます。

この問題を説明するリンクがあります (ジェレミー・バートンによる回答を探してください)。

16
Rosdi Kasim

ブローダートの答えは確かに正しい。ただし、明確にするために、RSACryptoServiceProviderインスタンスにboth X509証明書の公開鍵と秘密鍵を含める場合は、証明書に秘密鍵があることを前提として指摘する必要があります。証明書のHasPrivateKeyプロパティを確認します。

RSACryptoServiceProvider rsa;
if (cert.HasPrivateKey)
    rsa = (RSACryptoServiceProvider)cert.PrivateKey;
else
    rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;

RSAの場合、公開鍵のみが存在する場合、RSAパラメータは指数とモジュラスのみとなり、その他はすべてnullになります。一方、秘密鍵が存在する場合、RSAパラメータにはD、DP、DQ、指数、InverseQ、係数、P、Qが含まれます。

7
Emile