Where can I find RSA PKCS#1 V2.1 implementation in C++?
I've found an implementation here, but I'm not sure it fits with that standard.
Can anybody also explain major differences between various implementations of RSA algorithm which may cause inconsistency in action?
2 に答える
RSA アルゴリズムは、次の 2 つの目的で使用できるプリミティブです。
- 機密性 (つまり、公開鍵暗号化)、または
- 発信元の証明 (つまり、暗号化ハッシュと組み合わせた場合のデジタル署名)
PKCS #1 は、ほとんどの人が RSA ベースの暗号化と署名について参照する標準です。特に、PKCS#1 (2.1) の最新バージョンでは、次の 4 つの異なるスキームが定義されています。
- PKCS#1 v1.5 暗号化 (従来の目的のみ、誰も使用しないでください)
- OAEP 暗号化 (新しい実装に優先)
- PKCS#1 v1.5 署名
- PSS 署名
つまり、「RSA PKCS#1 V2.1」と言うときは、上記のスキームのいずれかを実際に参照する必要があります。これは、ライブラリがスキームのサブセットを実装できるためです。
PKCS#1 標準は非常によく書かれているため、その正しい実装はすべて定義上、相互に互換性があります。最初のスキームを除くすべてのスキームは暗号化ハッシュに依存しているため、選択したライブラリに使用する予定のもの (SHA-256 など) が含まれていることも確認する必要があります。
ライブラリの品質は、一連のテスト ベクトル (存在する数とその由来) を見て判断することを強くお勧めします。
それでも、正しい実装が必ずしも安全であるとは限りません。バッファ オーバーフローなどのありふれたこととは別に、ライブラリが RSA 実装を標的とした最新のすべての攻撃を考慮に入れていることを確認する必要があります (少なくともRSA に対する最も実用的なサイド チャネル攻撃を含む)。これを評価するのは難しいですが、オープン ソース ライブラリの場合は、コミュニティの規模と活動、および脆弱性が発見されたらすぐに公開するかどうかを調べることで、感覚をつかむことができます。
BotanやCrypto++などのオープン ソース C++ ライブラリは、適切な選択です。それらがターゲット プラットフォームで十分に高速であること、ライセンス (それぞれ BSD およびパブリック ドメイン) が受け入れられること、およびプラットフォームと互換性があることを確認するだけでよい場合があります。
暗号化にスチューデントウェア ライブラリを使用しないでください。メンテナンスが不十分で、エラーが発生する可能性があります。代わりに、 Crypto++などのよく知られた暗号化フレームワークを使用してください。標準との互換性を主張する必要があります。標準の参照テストベクトルに対してテストするかどうかを確認できます。通常、そのようなものは存在します。
ライブラリが FIPS または Common Criteria で承認されている場合 (たとえば、OpenSSL は FIPS で承認されている場合)、追加のポイントが与えられます。