/dev/random
使用内核中断的计时来添加到熵池。池中的熵量在名为 的变量中进行跟踪entropy_count
。
这是来自 的相关代码片段random.c
。它表示变量中最后两次中断之间的时间(我认为以 jiffies 为单位)delta
和 delta 的差异delta2
。
delta = time - state->last_time;
state->last_time = time;
delta2 = delta - state->last_delta;
state->last_delta = delta;
if (delta < 0) delta = -delta;
if (delta2 < 0) delta2 = -delta2;
delta = MIN(delta, delta2) >> 1;
for (nbits = 0; delta; nbits++)
delta >>= 1;
r->entropy_count += nbits;
/* Prevent overflow */
if (r->entropy_count > POOLBITS)
r->entropy_count = POOLBITS;
看起来添加的熵的估计本质上是 delta 的以 2 为底的对数的下限(不是 ceil,因为循环之前的初始位移)。这具有一定的直观意义,尽管我不确定需要什么假设才能使其正式正确。
所以,我的第一个问题是“这个估计背后的理由是什么?”
我的第二个问题是关于delta = MIN(delta, delta2) ...
.这是做什么的?为什么要取这个增量和最后一个增量的最小值?我不知道这应该达到什么目的——也许它会让估计更好,也许只是更保守。
编辑:我找到了一个指定估计值的文件,但它并没有真正给出合理的论证(尽管它确实概述了估计器应该满足的一些非正式条件)。
评论中出现的其他资源:
- 维基百科关于
/dev/random
和/dev/urandom
- 一篇试图解释它的论文(我对此表示怀疑,请参阅评论)
- 一篇关于
/dev/random
上面写了代码的人的评论。 - 安全.SE 答案关于
/dev/random
熵池。
答案1
delta2
不是前一个delta
,而是不同之处的两个连续值之间delta
。它是一种导数:如果delta
测量速度,delta2
就是加速度。
该估计背后的直观想法是,中断以或多或少的随机间隔发生,由物理世界中不可预测的事件(例如击键或网络数据包的到达)决定。延迟的时间越长,涉及的不可预测的事件就越多。然而,有些物理系统会以固定的速率触发中断;该delta2
措施是一种检测此类事件发生的保护机制(如果中断以固定间隔发生,因此可以明确预测,则所有中断delta
都将具有相同的值,因此delta2
将为零)。
我说“直观”,没什么可说的。事实上,在“随机物理事件”模型中,对比特进行计数是错误的;如果硬件事件有概率发生p对于每个时间单位,你会得到一个表示为n位,那么熵贡献应计算为n/2位,不n位。但我们知道,在现实中,物理事件并不是完全随机发生的;而是随机发生的。该delta2
机制也承认这一点。
所以在实践中,“熵估计”正是:估计。它的安全价值并不是来自于一个合理的、数学上精确的理由,而是来自通常的安全来源:似乎没有人找到滥用它的方法(到目前为止)。
这一页是由一个厌倦了关于/dev/random
熵估计器的神话的人写的,我认为它很好地解释了事情,有足够的细节。在与 RNG 打交道时,正确掌握一些基本理念非常重要。