RAND_bytes
とRAND_pseudo_bytes
を同じシードで呼び出すたびに、別の乱数が返されますが、その理由はわかりません。 PRNGは自動的にLinuxの/dev/urandom
から自身をシードしますが、Windowsではどのように動作しますか?OpenSSLのPRNGはどのようにWindowsで動作しますか?
同じシードが異なる乱数につながるのはなぜですか?
RAND_bytes
とRAND_pseudo_bytes
を同じシードで呼び出すたびに、別の乱数が返されますが、その理由はわかりません。 PRNGは自動的にLinuxの/dev/urandom
から自身をシードしますが、Windowsではどのように動作しますか?OpenSSLのPRNGはどのようにWindowsで動作しますか?
同じシードが異なる乱数につながるのはなぜですか?
なぜ同じシードが異なる乱数につながるのですか?
OpenSSL wikiのRandom Numbersでrandサブシステムの一般的な設計について読むことができます。同じ種子が異なる乱数を生成する理由は...
ジェネレーターによって異なります。デフォルトジェネレーターを使用している場合は、md_rand
を使用しています。 source code for md_rand.c
を見ると、のような関数へのシステムコールで、それぞれの呼び出しでrand_bytes
がエントロピーを追加します。
Linuxの場合rand_bytes
もgetpid
の結果を追加します。 WindowsではGetSystemTime
とSystemTimeToFileTime
という結果が追加されます。
各呼び出しでエントロピーを追加することは、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も参照してください。
@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
Iはrand_bytesのソースコードを見てきた、私はそれ \tを見出しました。 \t \t初期化= 1; \t \t} RAND_pollでエントロピーを追加しますか? – Xiphogod
@Xiphogod - 青い文字の文字はハイパーリンクです。 ['md_rand.c'](https://github.com/openssl/openssl/blob/master/crypto/rand/md_rand.c)のリンクに沿って、' time_t curr_time = time(NULL); 'を検索してください。 – jww
[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
@jww - あなたの助けをありがとう。シード、それは自動的にそれ自体をシード?私はそれ自体が自動的に種を蒔くことを意味する(RAND_pollを呼ぶ) – Xiphogod