我有一个设备会产生一些噪音,我想将它添加到嵌入式Linux系统中/ dev / random设备的熵池中。
我正在阅读man page on /dev/random并且我并不真正理解您传递给RNDADDENTROPY ioctl调用的结构。
RNDADDENTROPY
Add some additional entropy to the input pool, incrementing
the entropy count. This differs from writing to /dev/random
or /dev/urandom, which only adds some data but does not
increment the entropy count. The following structure is used:
struct rand_pool_info {
int entropy_count;
int buf_size;
__u32 buf[0];
};
Here entropy_count is the value added to (or subtracted from)
the entropy count, and buf is the buffer of size buf_size
which gets added to the entropy pool.
此结构中entropy_count
是我添加的位数吗?为什么这不总是buf_size * 8
(假设buf_size
以字节为单位)?
另外为什么buf
是一个零大小的数组?我该如何为它分配值?
感谢您的帮助!
答案 0 :(得分:2)
我正在使用硬件RNG存储我的熵池。我的结构是静态大小 看起来像这样(我的内核有一个稍微不同的random.h;只是复制什么 你找到你的,并将数组大小增加到你想要的任何东西):
#define BUFSIZE 256
/* WARNING - this struct must match random.h's struct rand_pool_info */
typedef struct {
int bit_count; /* number of bits of entropy in data */
int byte_count; /* number of bytes of data in array */
unsigned char buf[BUFSIZ];
} entropy_t;
无论你在buf中传递什么都会被哈希并且会搅动熵池。 如果您正在使用/ dev / urandom,那么为bit_count传递的内容并不重要 因为/ dev / urandom忽略它等于零而且只是继续前进。
bit_count的作用是推动/ dev / random阻止的点 并等待物理RNG源添加更多熵。 因此,可以猜测bit_count。如果你猜低,最差 会发生的事情是/ dev / random会比其他情况更快地阻止 将有。如果你猜高,/ dev / random将像/ dev / urandom一样运行 比它阻挡之前要长一点点。
您可以根据熵源的“质量”进行猜测。 如果它很低,就像人类输入的字符一样,你可以将它设置为1或2 每字节。如果它很高,就像从专用硬件RNG读取的值, 你可以将它设置为每字节8位。
答案 1 :(得分:1)
如果您的数据完全随机,那么我认为entropy_count
适合您提供的缓冲区中的位数。然而,许多(大多数?)随机性源并不完美,因此将缓冲区大小和熵量保持为单独的参数是有意义的。
buf
是标准的C语言。这笔交易是当您实际分配rand_pool_info
时,您执行malloc(sizeof(rand_pool_info) + size_of_desired_buf)
,然后使用buf
成员引用缓冲区。注意:使用一些 C编译器,您可以声明buf[*]
而不是buf[0]
来明确指出实际上buf
是“有弹性的”。
答案 2 :(得分:0)
缓冲区中的字节数与数据的熵相关,但不能仅根据该数据或其长度计算熵。
当然,如果数据来自一个好的,不可预测且相等分布的硬件随机噪声发生器,则熵(以位为单位)是缓冲区的8 *大小(以字节为单位)。
但如果比特分布不均匀或以某种方式可预测,则熵变小。
请参阅https://en.wikipedia.org/wiki/Entropy_(information_theory)
我希望有所帮助。