2017-05-09 18 views
1

RAND_bytesRAND_pseudo_bytesを同じシードで呼び出すたびに、別の乱数が返されますが、その理由はわかりません。 PRNGは自動的にLinuxの/dev/urandomから自身をシードしますが、Windowsではどのように動作しますか?OpenSSLのPRNGはどのようにWindowsで動作しますか?

同じシードが異なる乱数につながるのはなぜですか?

+0

[OpenSSL wikiの[乱数](https://wiki.openssl.org/index.php/Random_Numbers)、[opensslで確定的キーを生成する](http://stackoverflow.com/q/22759465/)を参照してください。 608639)と[OpenSSLのEVP_PKEY_keygenを使用する前に乱数ジェネレータをシードする必要がありますか?](http://stackoverflow.com/q/28537832/608639) – jww

+0

@jww - あなたの助けをありがとう。シード、それは自動的にそれ自体をシード?私はそれ自体が自動的に種を蒔くことを意味する(RAND_pollを呼ぶ) – Xiphogod

答えて

0

なぜ同じシードが異なる乱数につながるのですか?

OpenSSL wikiのRandom Numbersでrandサブシステムの一般的な設計について読むことができます。同じ種子が異なる乱数を生成する理由は...

ジェネレーターによって異なります。デフォルトジェネレーターを使用している場合は、md_randを使用しています。 source code for md_rand.cを見ると、のような関数へのシステムコールで、それぞれの呼び出しでrand_bytesがエントロピーを追加します。

Linuxの場合rand_bytesgetpidの結果を追加します。 WindowsではGetSystemTimeSystemTimeToFileTimeという結果が追加されます。

各呼び出しでエントロピーを追加することは、RNGの優れた設計方法です。 When Good Randomness Goes Bad: Virtual Machine Reset Vulnerabilities and Hedging Deployed CryptographyおよびWhen Virtual is Harder than Real: Security Challenges in Virtual Machine Based Computing Environmentsも参照してください。

+0

@Xiphogod - ソースコードを['md_rand.c']に見てください(https://github.com/openssl /openssl/blob/master/crypto/rand/md_rand.c)。 "get process id"や "get time"のような関数を呼び出します。 'RAND_bytes'が呼び出されるたびにジェネレータを動かします。 (!初期化) \t \t { \t \t RAND_poll()場合 – jww

+0

Iはrand_bytesのソースコードを見てきた、私はそれ \tを見出しました。 \t \t初期化= 1; \t \t} RAND_pollでエントロピーを追加しますか? – Xiphogod

+0

@Xiphogod - 青い文字の文字はハイパーリンクです。 ['md_rand.c'](https://github.com/openssl/openssl/blob/master/crypto/rand/md_rand.c)のリンクに沿って、' time_t curr_time = time(NULL); 'を検索してください。 – jww

関連する問題