我从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)

用您计算机上的sizeof(unsigned int)替换4(可能是4)。

10-01 14:55
查看更多