/dev/random
使用内核中断的时间添加到熵池中。在名为的变量中跟踪池中的熵量entropy_count
。
这是的相关代码段random.c
。它表示变量的最后两次间断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
,上面写了代码的家伙发表了评论。 - 关于
/dev/random
熵池的secutity.SE答案。
/dev/random
是不稳定的基础-请参见/ dev / random熵池?。我对托马斯进行了询问,希望他能回答您的问题。