2009-05-03 63 views
2

为了某些目的,能够绕过任何算法生成的随机数字,以支持自然输入 - 比如说掷骰子,这将会很棒。例如,加密密钥生成让我觉得这是一种需要足够少的随机数据的情况,并且要求数据真正具有足够的随机性,这可能是一种可行和理想的事情。是否存在用于从用户输入构建熵池的任何软件?

所以我想知道的是,在我离开之前弄脏我的手之前,是否有任何软件可以直接从随机数字输入中构建熵池?请注意,仅仅将事情从基数r转换为基数2是不够的;例如,因为3和2是相对的素数,所以在保持原始输入中的最大熵的同时将基数-3(或基数-6)数字转换为二进制数字并不是完全简单。

回答

4

设备/dev/random在Linux上完全实现了这一点 - 也许值得看看源代码?

编辑:

作为joeytwiddle说,如果有足够的随机性是不可用的,/dev/random将阻塞,通过监控外部设备(例如鼠标,磁盘驱动器)等熵为“建立”。这可能是也可能不是你想要的。如果您不希望等待并且对可能的质量较低的随机性感到满意,请使用/dev/urandom代替 - 它是一个非阻塞的伪随机数生成器,它在/dev/random可用时会注入随机性,使其随机性高于普通确定性PRNG。 (有关更多详细信息,请参见man /dev/urandom。)

+1

/dev/random从用户交互(鼠标/键盘)和磁盘访问速度中获取一些输入,这些都自然影响现象。没有这些输入,/ dev/random会缓慢输出(等待真正的随机数据)! – joeytwiddle 2009-05-03 09:31:59

+0

/dev/random从用户交互(鼠标/键盘)和磁盘访问速度中获取一些输入,这两种情况都是自然影响的现象。没有这些输入,/ dev/random会缓慢输出(等待真正的随机数据)! – joeytwiddle 2009-05-03 09:32:29

+0

@joey:但是IIRC根可以向池中贡献熵并提供它自己的估计值。所以一个合适的setuid程序可以接受来自可信用户的骰子卷,并将它们送入/ dev/random,然后输出与用户掷骰子一样快(即仍然非常缓慢......) – 2009-05-03 10:08:28

2

这个paper建议了各种方法,包含UN * X和Windows的实现思路。

2

我不确定你在问什么。 “熵池”只是“一些随机数字”的一个词,所以你当然可以使用骰子滚动;简单地将它们用作具有所需特征的伪随机数生成器。

您可以从LavarndHotbits在线获得物理生成的随机数。

0

请注意,池中的熵数量不一定必须是整数。这应该主要处理你的主要因素 - 其他问题。

即使您最终使用的是需要整数估计的实现,您也需要相当多的骰子来生成加密密钥。所以你可以只是要求他们一束。如果用户给出了10个d6卷的结果,并且你估计熵为25位,那么每个掷骰子只丢失0.08位。记住要圆下来;-)

顺便说一句,我会认为要求用户的TRNG数据,而不是从硬件来源/ dev /随机做,是一个有趣的玩具,而不是一个改进。专家很难生成随机数字 - 你不想让一般用户处于他们自己的业余主义的控制之下。 “随机数的产生太重要了,以至于没有机会”--Robert Coveyou。

另一方面,BSD的作者认为,由于对PC硬件实际来源的熵估计并不是很好理解(作为一个物理问题,而不是数学问题),所以使用PRNG实际上并不是坏的选项,只要根据Schneier/Kelsey/Ferguson的Yarrow设计进行良好的重新设计。你的骰子想法至少比典型的熵源/ dev/random更有优势,只要用户可以信任找到合适的骰子并正确地滚动它们,就可以自信地将熵放在下限。它有一个缺点,那就是有一副双筒望远镜和/或在他们的键盘上窃听手段的观察者(例如,通过其E/M发射)可以打破整个方案,所以真的取决于你的威胁模型。

相关问题