両方のコード行:
KeyPairGenerator.getInstance("RSA")
KeyPairGenerator.getInstance("RSA", "BC")
うまくいきます。それで、BCを使用するかどうかの違いは何ですか?
BC は、使用されているデフォルトの RSA と完全に互換性がありますか? (Sun JDK 6 を使用)
BouncyCastle FAQには、RSA 実装の詳細に関連するエントリがいくつかあります。
個人的には、Sun と BC のプロバイダーに互換性がないことについて書かれたものは何も見つかりませんでした。Java のネイティブ RSA 実装を使用することをお勧めします。明確に定義された利点がある場合にのみ、外部依存関係を追加する必要があります。
プロジェクトの別の場所で BC ライブラリを使用している場合、どのプロバイダーを使用するかは問題ではないと思います。
編集
J2ME には RSA 実装が含まれていません。そのため、アプリを J2ME に移植することを計画している場合は、BouncyCastle ライブラリが適切な方法です。
KeyPairGenerator
指定されたアルゴリズムの公開鍵と秘密鍵のペアを生成するオブジェクトを返します。このメソッドは、最も優先度の高いプロバイダーから始めて、登録済みのセキュリティ プロバイダーのリストを走査します。指定されたアルゴリズムをサポートする最初のプロバイダーからの KeyPairGeneratorSpi 実装をカプセル化する新しい KeyPairGenerator オブジェクト が返されます。
Security.getProviders()
登録済みプロバイダーのリストは、メソッドを介して取得できることに注意してください 。
リンクされた Javadoc にSecurity.getProviders()
は、次のように記載されています。
インストールされているすべてのプロバイダーを含む配列を返します。配列内のプロバイダーの順序は、優先順位です。
どうやらBCはあなたの場合、「偶然にも」最初に優先されるプロバイダーです。その周りに不確実性があり (つまり、アプリケーションを配布したいが、エンドユーザーの環境を制御できない)、BC の使用に固執したい場合は、2 番目のコンストラクターを使用することをお勧めします。
「BC」は、暗号アルゴリズムの BouncyCastle 実装を返します。
プロバイダーを指定しない場合、暗号化アルゴリズムの「最も優先される」実装が返されます。つまり、1 番目のプロバイダーがプロバイダーの配列で最も優先されます。