为什么写入 /dev/random 不会使 /dev/random 的并行读取速度更快?

为什么写入 /dev/random 不会使 /dev/random 的并行读取速度更快?

通常读取/dev/random会产生 100-500 个字节和块,等待收集熵。

为什么其他进程写入信息不能/dev/random加快读取速度?它不应该提供所需的熵吗?

它对于解锁或类似软件很有用,gpg无需重新启动并重新输入所有内容,用于生成非超级绝密密钥等。

答案1

您可以写入 ,/dev/random因为它是向 提供额外随机字节的方式的一部分/dev/random,但这还不够,您还必须通过调用通知系统有额外的熵ioctl()

我需要相同的功能来测试我的智能卡设置程序,因为我不想等待我的鼠标/键盘生成足够的内容来为gpg每次测试运行进行多次调用。我所做的是运行 Python 程序,该程序与我的测试并行。当然应该不是完全用于真正的gpg密钥生成,因为随机字符串根本不是随机的(系统生成的随机信息仍将交织)。如果您有外部源来设置 的字符串random,那么您应该能够拥有高熵。您可以使用以下方法检查熵:

cat /proc/sys/kernel/random/entropy_avail

该程序:

#!/usr/bin/env python
# For testing purposes only 
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
    time.sleep(0.001)

(完成后不要忘记终止该程序。)

答案2

通常,它由内核开发人员设计并记录在man 4 random

Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count.  This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.

答案3

安东尼已经解释过,写入/dev/random不会增加熵计数,并展示了 RNDADDENTROPY ioctl(参见随机(4)) 可用于计算熵。显然它并不真正安全,因此当硬件随机数生成器可用时,这是一种替代方案。

以下实现从熵池中获取 512 字节(4096 位)的随机性/dev/hwrng并将其转发到熵池(每个字节记入 4 位熵,这是我的任意选择)。之后它将调用选择(2)当熵池已满时阻塞的系统调用(记录在随机(4)联机帮助页)。

Python 版本:

import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
    while True:
        d = hw.read(512)
        fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
        select.select([], [rnd], [])

由于 Arch Linux iso 没有安装 Python,这里也有一个 Perl 版本:

open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
    my $l = read $hw, my $d, 512;
    ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
    vec(my $w, fileno $rnd, 1) = 1;
    select undef, $w, undef, undef
}

这可能就是 rngd 程序(的一部分)rng-工具)确实如此(未经验证),只是它使用了已经普遍可用的工具(Python 或 Perl)。

相关内容