1

我正在尝试从 /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 个随机字节,但是当我运行这个程序时,我总是在 15 到 30 范围内的变量nbr中得到输出,这是可以理解的,因为 /dev/random 并不总是有足够的熵,但我的期望是在 read() 时,/dev/random 应该阻塞,直到它将我的缓冲区填充到 100 个随机字节,这在这种情况下不会发生并且程序不会阻塞。我阅读了 /dev/random 的手册页。它说

当熵池为时,来自 /dev/random 的读取将被阻塞,直到收集到额外的环境噪声。

这是否真的意味着 /dev/random 只会在熵池为时阻塞,并且在它有任何数量的数据时不会阻塞,无论它是否小于所需的字节?

任何帮助,将不胜感激。

4

4 回答 4

5

这对 来说并不特殊/dev/random,这只是 的行为read。该参数是一个缓冲区大小,read将返回该大小可用的内容。

考虑使用FILE*andfread来读取一个 100 字节的块。

于 2012-11-02T06:47:24.847 回答
2

简而言之,除非没有要读取的数据,否则 read 不会阻塞。它总是会返回它可以读取的数量或错误,即使这比你想要的数据少。

于 2012-11-02T08:44:39.267 回答
1

您的程序正在读取 100 个字节/dev/random。如果您通过一些手动操作(例如键入命令,或者只是 bash 的向上箭头键)重新启动它,则该手动操作(按键序列)正在为random(4). 所以你永远不会处于阻塞状态。

read(2)系统调用的语义/dev/random是它会尝试读取一些字节。如果至少读取了一个字节,则read(2)系统调用成功并且不会阻塞。

此外,正如我评论的那样,最新的硬件和最新的内核具有足够好的随机源,可能random(4)永远不会阻塞。

于 2012-11-02T07:56:28.230 回答
0

/dev/random 从 SHA1(entropy_pool_data) 获取数据。SHA1 仅输出 20 个字节。如果您希望获得真正的随机位,则从 /dev/random 请求超过 160 位是没有意义的。

于 2013-08-15T22:24:07.790 回答