首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >add_disk_randomness函数是如何工作的?

add_disk_randomness函数是如何工作的?
EN

Stack Overflow用户
提问于 2018-08-01 04:35:28
回答 1查看 113关注 0票数 3

我正在尝试理解linux内核中的add_disk_randomness函数。我读了一些论文,但它们没有很好地描述它。这段代码来自/drivers/char/random.c

代码语言:javascript
复制
add_timer_randomness(disk->random, 0x100 + disk_devt(disk));

disk_devt(disk)保存变量disk->devt。我将其理解为唯一的块设备编号。但是主要设备号和次要设备号是什么?

然后将块设备号和十六进制0x100相加。

然后,我们还收集时间值disk->random。这是每个数据块的寻道时间吗?

这两个值将被传递给函数add_timer_randomness。如果能得到一个有值的例子就好了。

EN

回答 1

Stack Overflow用户

发布于 2018-08-01 06:27:21

add_timer_randomness的第一个参数是指向struct timer_rand_state的指针。您可以通过检查struct gendisk来确认这一点。

随机数.c中的timer_rand_state转载如下

代码语言:javascript
复制
/* There is one of these per entropy source */
struct timer_rand_state {
    cycles_t last_time;
    long last_delta, last_delta2;
};

此结构存储最后一个输入事件的时间戳以及之前的“增量”。add_timer_randomness首先获取当前时间(以jiffie为单位),然后读取last_time (也以jiffies为单位),然后用第一个值覆盖last_time

跟踪一阶、二阶和三阶“增量”,作为估计熵的一种方法。硬盘事件的主要熵来源是这些事件的时间。更多的数据被散列到熵池中,但它们对熵估计没有贡献。(重要的是不要过高估计您散列的数据有多不可预测。否则,您的熵池,因此您的RNG输出也可能是可预测的。另一方面,低估熵并不能使RNG输出更具可预测性。在这方面,使用悲观的估计器总是更好。这就是为什么对熵估计没有贡献的数据仍然被散列到熵池中的原因。)

增量是两个事件之间的时间。(时间戳之间的差异。)二阶增量是两个事件之间的时间差。(增量之间的区别。)三阶三角洲是二阶三角洲之间的差异。timer_rand_state指针是跟踪前一个时间戳和增量的内存位置。delta3不需要存储。

根据该定时数据的熵估计基于增量1、2和3的最大绝对值的对数。(不完全是对数。例如,它总是一个整数。它总是四舍五入一位。如果你取的几乎是对数的值是零,那么结果也是零。)

假设您有一个设备用作熵源,它每50毫秒生成一个新事件。增量将始终为50毫秒。二阶增量始终为零。由于三个增量中的一个为零,这将防止该设备的计时被依赖为重要的熵源。熵估计器成功地高估了输入熵,所以即使这个设备被用作熵源,它也不会“毒害”具有可预测性的熵池。

熵估计不是基于任何形式的数学。我们不能构建一个准确的熵源模型,因为我们不知道它是什么。我们不知道用户计算机上的硬件到底是什么,也不知道它在未知环境中的表现如何。我们只想知道,如果我们将(估计的)熵计数器加1,那么我们已经将不可预测数据的至少一位熵值散列到熵池中。除了计时之外的额外数据被散列到池中,而不会增加熵计数器,因此我们希望,如果基于计时器的熵估计器超出估计一段时间,那么在我们没有考虑到的非基于计时器的来源中可能存在一些不可预测性。(如果是这样的话,您的RNG仍然是安全的。)

我相信这听起来很难令人信服,但我不知道该怎么做。我尽了最大的努力来解释随机.c代码的相关部分。即使我可以整合并提供一些关于这个过程如何工作的直觉,它可能仍然不能令人满意。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51625297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档