22

驚くべきことに、Bouncy Castle の軽量 API の使用に関する Web 上の情報はほとんどありません。しばらく見回した後、基本的な例をまとめることができました。

RSAKeyPairGenerator generator = new RSAKeyPairGenerator();
generator.init(new RSAKeyGenerationParameters
    (
        new BigInteger("10001", 16),//publicExponent
        SecureRandom.getInstance("SHA1PRNG"),//prng
        1024,//strength
        80//certainty
    ));

AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();

私は RSA と舞台裏で行われている数学について基本的な理解を持っているので、何が何であるかを理解しpublicExponentstrengthいます。私が収集したものから、適切なパディングが使用されている限り、それは小さい (3 のように) である可能性がありますpublicExponentphi(pq)ただし、何certaintyを指すのかわかりません(パーセンテージを指す可能性があると述べた場所もありますが、確認したいです)。の使用SecureRandomは自明です。RSAKeyGenerationParametersのドキュメントはまったく価値がありません (驚くことではありません)。私の唯一の推測は、生成されたキーの精度と関係があるということですが、もう一度確認したいと思います。certaintyだから私の質問は、との適切な値は何publicExponentですか?

追伸「状況次第です - 情報をどの程度安全にしたいか」と答えないでください。特に指定がない限り、最高度のセキュリティ (つまり、4096 ビットの RSA キー以上) を想定することはかなり安全です... Bouncy Castle の軽量 API の使用の良い例を示すソースへのリンクも歓迎します (私はJCA 実装またはそれに関連する例に関心のあるすべての人)。

4

4 に答える 4

11

両方に正しい値を使用しています。

publicExponent はフェルマー数でなければなりません。0x10001 (F4) が現在の推奨値です。3 (F1) も安全であることが知られています。

RSA キーの生成には素数が必要です。ただし、絶対素数を生成することはできません。他の暗号化ライブラリと同様に、BC は推定素数を使用します。確実性は、数値を素数にする確実性を示します。80 を超えると、キーの生成が大幅に遅くなります。

RSA アルゴリズムは、BC が相対的な素数をチェックするため、素数が真の素数ではないという万一の場合でも機能することに注意してください。

于 2010-06-21T18:03:13.520 に答える
9

「確実」であるためには、ソース コードを詳しく調べる必要がありますが、certaintyパラメーターはコンストラクターに直接渡され、「newが素数を表すBigInteger確率は(1 - 1/2このコンストラクターの実行時間は、このパラメーターの値に比例します。"BigInteger

したがって、値が 80 の場合、その数が素数でない可能性は 2 80に 1 未満です。コメントは、素数の生成時間がこのパラメーターに対して線形であることを示唆していますが、それを増やすことを選択した場合は、それをテストして確認する必要があります。使用している鍵のサイズと一致する値を使用することが理にかなっている場合があります。たとえば、NIST は、1024 ビットの RSA キーは 80 ビットの対称キーと同じくらい強力であると述べています。2048 ビットの RSA キーの場合、確実性として 112 ビット (同等の強度の対称キー サイズ) を使用したい場合があります。

特別な場合に公開指数として 3 を使用することの脆弱性を認識しているようです。値 65537 は現在、ほぼ普遍的に使用されています。

于 2010-06-21T18:09:18.530 に答える
3

良いリファレンスはFIPSPUB186-3です。特に、付録Bのセクション3には、プライム生成アルゴリズムだけでなく、多くのセキュリティパラメータがあります。certaintyMiller-Rabin素数性検定の反復回数です。

于 2010-06-22T00:51:25.773 に答える
2

確実性の値を計算する方法の詳細については、crypto.stackexchange.comでこの回答を参照してください。

PaŭloEbermannの回答のプレビュー:

xビットの確実性は、何か(この場合はpが素数)が真でない確率が2-xよりも小さいことを意味します。これは、最初の試行でランダムなxビット値を正しく推測するのと同じ確率であるため、この名前が付けられています。

xを選択する方法は?p(およびq)が素数でない確率を十分に小さくして、この時点での失敗確率が、対称鍵の推測、係数の因数分解など、システムを壊す可能性のある他の方法よりも大きくならないようにします。

したがって、ここでは、対称および非対称のキーサイズの対応表が役立つはずです。http://www.keylength.com/公開鍵の使用に伴う対称鍵サイズを選択するのと同じ主要な確実性を選択します。

于 2012-07-01T18:08:37.427 に答える