5

ランダムな内容のファイルを作成するためddです。/dev/urandomこれはうまくいきますが、同じシードで PRNG を再度実行することで、後でファイルの内容を再現できるようにしたいと考えています。キャラクターデバイスを公開するシード可能な PRNG はありますか?

最近の Linux 3.X カーネルを使用しています。

4

6 に答える 6

2

/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 です)。

于 2013-07-26T15:44:00.093 に答える
1

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
于 2013-07-25T14:49:22.430 に答える
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 の「ランダムな」バイトが含まれます。

于 2013-07-26T15:53:51.540 に答える
0

シードを指定してファイルをランダムに再現可能にしたい場合は、間違ったツールを使用しています。/dev/urandom は環境 (着信および発信ネットワーク パケットのタイミング、ディスク アクセスなど) からランダム性を取得するため、同じシードで開始したとしても、乱数の同じシーケンスを取得する可能性は非常に低いです 2回連続。

従来の(別名ソフトウェアのみの)疑似乱数ジェネレーターが必要です。メルセンヌ・ツイスターはいいですね。使用している言語で実装する必要があります。または、言語に付属している疑似乱数ジェネレーターを使用してください。

于 2013-07-26T17:45:48.637 に答える
0

ISO C の rand() 関数と srand() 関数を確認してください。

http://man7.org/linux/man-pages/man3/rand.3.html

于 2013-07-26T18:06:08.707 に答える