8

我有一个设备会产生一些噪音,我想将这些噪音添加到嵌入式 Linux 系统中 /dev/random 设备的熵池中。

我正在阅读/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零大小的数组?我应该如何为它赋值?

感谢您在这里的任何帮助!

4

3 回答 3

4

我正在使用硬件 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 忽略它等于 0 并继续运行。

bit_count 所做的是将 /dev/random 阻塞并等待从物理 RNG 源添加更多熵的点。因此,可以对 bit_count 进行猜测。如果你猜得低,最坏的情况是 /dev/random 会比其他情况更早阻塞。如果您猜得高,/dev/random 将像 /dev/urandom 一样运行一段时间,比它在阻塞之前的运行时间长一点。

您可以根据熵源的“质量”进行猜测。如果它很低,比如人类输入的字符,您可以将其设置为每字节 1 或 2 个。如果它很高,例如从专用硬件 RNG 读取的值,您可以将其设置为每字节 8 位。

于 2013-09-21T01:07:15.227 回答
1

如果您的数据是完全随机的,那么我相信entropy_count您提供的缓冲区中的位数是合适的。然而,许多(大多数?)随机源并不完美,因此将缓冲区大小和熵量作为单独的参数保存是有意义的。

buf被声明为大小为零是标准的 C 习惯用法。交易是,当您实际分配 a 时rand_pool_info,您会这样做malloc(sizeof(rand_pool_info) + size_of_desired_buf),然后您使用该buf成员引用缓冲区。注意:对于某些C 编译器,您可以声明buf[*]而不是buf[0]显式地声明实际上buf是“有弹性的”。

于 2013-06-15T00:47:09.540 回答
0

缓冲区中的字节数与数据的熵相关,但不能仅从该数据或其长度计算熵。

当然,如果数据来自一个好的、不可预测的和均匀分布的硬件随机噪声发生器,那么熵(以位为单位)是缓冲区的 8* 大小(以字节为单位)。

但是,如果这些比特分布不均或无法以某种方式预测,则熵会变小。

https://en.wikipedia.org/wiki/Entropy_(information_theory)

我希望这会有所帮助。

于 2016-10-03T09:58:12.807 回答