キーの強度はJavaに依存しているため、Javaで実装されたキー生成でよりランダム性を実現したいと考えています。
java.security.KeyPairGenerator
を使用して秘密鍵と公開鍵を作成したいと考えています。シードはオブジェクトで定義できSecureRandom
ます。
SecureRandom random = new SecureRandom();
byte[] rand = new byte[8]; // or only one byte
次のように作成するrandom byte[]
とします。
// new KeyPress registered
long currentTime = System.currentTimeMillis();
long time = currentTime - lastTime;
lastTime = currentTime;
byte = time % Byte.MAX_VALUE;
// add byte to array or to the SecureRandom object
random.setSeed(byte);
initialize メソッドを使用すると、ジェネレーター オブジェクトにシードを追加できます。これにより、キーのランダム性が向上します。
// adds the seed to the generator
keyGen.initialize(4096, random);
問題は、すべてのユーザー入力の後、またはたとえば 8 バイトの後にキー ジェネレーターのシードを設定する必要があるかどうかです。ここで得られるランダム性は、システム クロックの精度に依存することがわかっています。しかし、 currentTimeMillis() メソッドは正確だと思います。
これはランダム性を高めるための解決策だと思いますか? それとも何も変わらないと思いますか?
EDIT 1 03.12.13 まず、コメントや感想をありがとうございます。@Quincunx「SecureRandomはおそらく十分にランダムだと思います。」何のために十分ですか?つまり、何のために必要かによると思います。右?問題は、どうすればランダム性を高めることができるかということでした! @IT-Proええ、時間の二乗を使用できますが、ユーザー入力はよりランダムだと思いますよね?ユーザー入力の後にバイト配列を収集し、ユーザーがジェネレーターへのすべての入力を終了した後にそれを渡すと言ったということですか?
EDIT 2 03.12.13 @Ericksonあなたの言っていることは真実ではないと思います! 「これらのシステムレベルのデバイスは、キーを押すことですでにエントロピーを収集しています」これへのリンクを共有していただけますか? このトピックについては、私よりもあなたの方が理解しているかもしれませんが、そのようなことをおっしゃる場合は、詳細を読みたいと思います。