1

Javaでは、「SHA1PNRG」を使用して疑似乱数を生成しています。この番号生成の内部動作はわかりません。安全な番号生成に最適なシード値はどれですか?シードとして小さい数値を使用する必要がありますか、それともシードとして大きい値を使用する必要がありますか?適切なご指導をお願いします。

私のコード:

SecureRandom sr= SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);

私はsr.nextInt(int)次の値を取得するために使用してseedおり、長いデータ型の変数です。

4

3 に答える 3

0

NIST SP800-90Aは、SHA-1に基づくHash_DRBG(決定論的ランダムビットジェネレーター)を使用する場合、440ビット(つまり55バイト)のシード長を推奨します。(アルゴリズムもそこに描かれています)。

しかし、それはシードの長さだけでなく、そのエントロピー(「ランダム性」)にも関係します。ゼロの440ビット文字列でDRBGを初期化する場合、その長さにもかかわらず、それは悪い選択になります。

シードの目的は、ジェネレーターの初期状態を構成して、攻撃者が乱数のシーケンスを予測できないようにすることです。すべてのプロセスが決定論的であることを忘れないでください。ジェネレーターの状態がわかれば、その時点からランダムシーケンスを再現できるようになります。

SecureRandom.generateSeed現在のOSが提供するエントロピーソースに依存するメソッドを使用してシードを計算できます(たとえば、 OpenJDKのSeedGeneratorはLinuxでは/ dev / randomを使用し、WindowsではMS CryptoAPIを使用します)。

 SecureRandom sr= SecureRandom.getInstance("SHA1PRNG");     
 byte seed[] = random.generateSeed(55);
 sr.setSeed(seed);
于 2013-03-09T06:30:01.520 に答える
0

シードに使用する番号関係ありません。重要なのは、プログラムを開始するたびにシードに異なる番号を使用することです。

PRNG、または疑似乱数ジェネレーターは、シードに対して計算を実行することによって機能します。その計算の出力を次の乱数のシードとして使用し、以下同様に続きます。(これは単純化ですが、正しい考えが得られます。)したがって、同じシードを使用すると、PRNGは同じ数列を生成します。

一般的なシードは、システム時間、ユーザーのキー押下またはマウスの動き、またはプログラムの実行ごとに異なる可能性が高いその他の値から導出されます。

于 2013-03-09T04:52:07.803 に答える
0

マキシミン、人々がシードを推測できない(したがって、PRNGからの出力を予測できない)ことを懸念している場合は、実際にランダムなシードを使用する必要があります. たとえば、プログラムが実行されている時間を使用することは安全ではありません。

を直接呼び出して、内部のシード メカニズムをバイパスしないでくださいsetSeedjava.security.SecureRandom.setSeed(long)を呼び出す前にまたはjava.security.SecureRandom.setSeed(byte[])を呼び出すと、java.security.SecureRandom.nextBytes(byte[])内部のシード メカニズムがバイパスされ、提供されたシードのみが乱数の生成に使用されます。

数年前のこのトピックに関する Amit Thesi の有益なブログ投稿を参照してください。

于 2013-03-27T06:50:28.453 に答える