キーストアからプルしたX509Certificate2
から新しいRSACryptoServiceProvider
オブジェクトを初期化する最良の方法は何ですか?証明書は、公開鍵(暗号化用)と秘密鍵(復号用)の両方に関連付けられています。
私は現在FromXmlString
メソッドを使用していますが、もっと良い方法があるはずです。
ありがとう
RSACryptoServiceProvider publicKeyProvider =
(RSACryptoServiceProvider)certificate.PublicKey.Key;
そして
RSACryptoServiceProvider privateKeyProvider =
(RSACryptoServiceProvider)certificate.PrivateKey;
証明書の公開キープロパティまたは秘密キープロパティのキープロパティは、AsymmetricAlgorithm型です。
推奨される方法は、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
が使用されます。
この問題を説明するリンクがあります (ジェレミー・バートンによる回答を探してください)。
ブローダートの答えは確かに正しい。ただし、明確にするために、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が含まれます。