我正在尝试从/ dev / random收集真正的随机数。这是我的简单代码:
u_char buf[256];
memset(buf, 0, 256);
int dev = open("/dev/random", O_RDONLY);
int nbr = read(dev, buf, 100);
printf("Number of bytes returned : %d\n", nbr);
你可以看到我要求100个随机字节,但是当我运行这个程序时,我总是得到变量 nbr 的输出,范围是15到30,这可以理解为/ dev / random并不总是有足够的熵,但我的期望是,在read()时,/ dev / random应该阻塞,直到它将我的缓冲区填充到100个随机字节,在这种情况下不会发生并且程序不会阻塞。我读了/ dev / random的手册页。它说
当熵池为空时,来自/ dev / random的读取将被阻止 直到收集到额外的环境噪音。
这是否意味着/ dev / random只会在熵池为空时阻塞,并且当它有任何数量的数据时是否会阻塞,无论它是否小于所需的字节数?
任何帮助都将不胜感激。
答案 0 :(得分:5)
/dev/random
并不特别,这只是read
的行为。该参数是缓冲区大小,read
将返回该大小可用的内容。
考虑使用FILE*
和fread
来读取一个100字节的块。
答案 1 :(得分:2)
简而言之,除非要读取 没有 数据,否则不会阻止读取。它总会返回它可以读取的数量或错误,即使数据少于您想要的数据。
答案 2 :(得分:1)
您的程序正在从/dev/random
读取100个字节。如果你通过一些手动操作重新启动它(例如输入命令,或者只是bash的向上箭头键),那个手动操作(按键序列)正在为random(4)
的熵池提供信息。所以你永远不会陷入封锁的情况。
应用于/dev/random
的{{3}}系统调用的语义是它会尝试读取一些字节。如果至少读取了一个字节,则read(2)
系统调用成功并且不会阻塞。
另外,正如我评论的那样,最近足够的硬件和最近足够的内核有足够好的随机源,可能永远不会阻塞。{/ p>
答案 3 :(得分:0)
/ dev / random从SHA1(entropy_pool_data)获取数据。 SHA1仅输出20个字节。如果您希望获得真正的随机位,则从/ dev / random请求超过160位是没有意义的。