ランダムな内容のファイルを作成するためdd
です。/dev/urandom
これはうまくいきますが、同じシードで PRNG を再度実行することで、後でファイルの内容を再現できるようにしたいと考えています。キャラクターデバイスを公開するシード可能な PRNG はありますか?
最近の Linux 3.X カーネルを使用しています。
ランダムな内容のファイルを作成するためdd
です。/dev/urandom
これはうまくいきますが、同じシードで PRNG を再度実行することで、後でファイルの内容を再現できるようにしたいと考えています。キャラクターデバイスを公開するシード可能な PRNG はありますか?
最近の Linux 3.X カーネルを使用しています。
/dev/urandom
可能な限り予測できないように設計されています。より従来のシードされた疑似乱数ジェネレーターが必要なようです。
ここに私がCで書いたものがあります:
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *endptr;
unsigned long int seed;
if (argc != 2 || *argv[1] == '\0') {
fprintf(stderr, "usage: %s seed\n", argv[0]);
return EXIT_FAILURE;
}
errno = 0;
seed = strtoul(argv[1], &endptr, 0);
if (errno != 0 || *endptr != '\0' || seed > UINT_MAX) {
fprintf(stderr, "%s: invalid seed\n", argv[0]);
return EXIT_FAILURE;
}
srandom((unsigned int) seed);
while (1) {
int i;
long int randomnum = random();
for (i = 0; i < sizeof randomnum; i++) {
if (putchar((randomnum >> (i * CHAR_BIT)) & UCHAR_MAX) == EOF) {
return EXIT_SUCCESS;
}
}
}
}
これはプログラムであり、デバイス ファイルではありませんが、その出力は から得られるものと同じ形式です/dev/urandom
。そこからの出力を にパイプしてdd
省略できif
ます。
プログラムに提供する真にランダムなシードを考え出す必要がある場合は、次の/dev/urandom
ように bash で取得できます。
seed=$(od -vAn -N4 -tu4 </dev/urandom)
4 をマシンにあるものに置き換えsizeof(unsigned int)
ます (おそらく 4 です)。
urandomドキュメントから取得
Linux システムがオペレーターの操作なしで起動すると、エントロピー プールはかなり予測可能な状態になる場合があります。これにより、エントロピー プール内の実際のノイズ量が推定値を下回ります。この影響を打ち消すために、シャットダウンと起動の間でエントロピー プール情報を運ぶのに役立ちます。これを行うには、Linux システムの起動シーケンス中に実行される適切なスクリプトに次の行を追加します。
echo "Initializing kernel random number generator..." # Initialize kernel random number generator with random seed # from last shut-down (or start-up) to this start-up. Load and # then save 512 bytes, which is the size of the entropy pool. if [ -f /var/random-seed ]; then cat /var/random-seed >/dev/urandom fi dd if=/dev/urandom of=/var/random-seed count=1
/dev/*random は疑似乱数ジェネレーターではないため、シードを使用しません。環境からランダム性を提供します (キーボード、割り込み、ネットワークなどのハードウェアをソースとして使用します)。/dev/urandom の場合、シードと RNG はプールが使い果たされた場合にのみ使用されます。しかし、それがいつ起こるかはまだ予測できません。
したがって、/dev/*random から乱数を読み取らないでください。代わりに、bash 機能を使用して乱数を生成します。
#! /ビン/バッシュ # RNG のシード ランダム = 1234 # 乱数を 10 個出力する {1..10} の i について 行う エコー $ランダム 終わり
上記のスクリプトは、シードが一定であるため、毎回同じ数列を出力します。
0 から 255 の範囲の値を意味するバイトを生成する場合は、printf
代わりに使用echo
して、その範囲に取得する乱数を循環させます。
printf "\\x$(printf "%x" $(($RANDOM % 256)))"
スクリプトを実行して出力をファイルにリダイレクトすると、10 の「ランダムな」バイトが含まれます。
シードを指定してファイルをランダムに再現可能にしたい場合は、間違ったツールを使用しています。/dev/urandom は環境 (着信および発信ネットワーク パケットのタイミング、ディスク アクセスなど) からランダム性を取得するため、同じシードで開始したとしても、乱数の同じシーケンスを取得する可能性は非常に低いです 2回連続。
従来の(別名ソフトウェアのみの)疑似乱数ジェネレーターが必要です。メルセンヌ・ツイスターはいいですね。使用している言語で実装する必要があります。または、言語に付属している疑似乱数ジェネレーターを使用してください。
ISO C の rand() 関数と srand() 関数を確認してください。