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