出于某些目的,能够绕过任何类型的算法生成的随机数以支持自然输入(例如掷骰子)会很好。例如,加密密钥生成让我觉得需要足够少的随机数据,并且数据真正随机的要求足够高,这可能是一个可行且理想的事情。
所以在我动手之前我想知道的是:是否有任何软件可以直接从随机数字输入构建熵池?请注意,仅仅将事物从基数 r 转换为基数 2 是不够的;例如,因为 3 和 2 是相对素数,所以将基数 3(或基数 6)数字转换为二进制数字同时保持原始输入中的最大熵并不完全简单。
出于某些目的,能够绕过任何类型的算法生成的随机数以支持自然输入(例如掷骰子)会很好。例如,加密密钥生成让我觉得需要足够少的随机数据,并且数据真正随机的要求足够高,这可能是一个可行且理想的事情。
所以在我动手之前我想知道的是:是否有任何软件可以直接从随机数字输入构建熵池?请注意,仅仅将事物从基数 r 转换为基数 2 是不够的;例如,因为 3 和 2 是相对素数,所以将基数 3(或基数 6)数字转换为二进制数字同时保持原始输入中的最大熵并不完全简单。
该设备/dev/random
在 Linux 上正是这样做的——也许值得查看源代码?
编辑:
正如 joeytwiddle 所说,如果没有足够的随机性,/dev/random
将阻塞,等待通过监视外部设备(例如鼠标、磁盘驱动器)来“建立”熵。这可能是也可能不是您想要的。如果您不想等待并且对可能质量较低的随机性感到满意,请/dev/urandom
改用 - 它是一个非阻塞伪随机数生成器,/dev/random
它在可用时注入随机性,使其比普通的确定性 PRNG 更加随机。(详情请参阅man /dev/urandom
。)
本文针对 UN*X 和 Windows提出了各种具有实现思路的方法。
我不确定你在问什么。“熵池”只是“一些随机数”的一个词,所以你当然可以用掷骰子;只需将它们用作具有所需特征的伪随机数生成器即可。
您可以从例如Lavarnd或Hotbits在线获取物理生成的随机数。
请注意,池中的熵量不一定是整数。这应该主要处理您的除 2 以外的主要因素问题。
即使您最终使用了一个确实需要整数估计的实现,您也需要大量掷骰子来生成加密密钥。所以你可以要求他们成群结队。如果用户给您 10 次 d6 掷骰的结果,并且您估计熵为 25 位,那么每次掷骰子您只损失了 0.08 位。记得四舍五入;-)
顺便说一句,我认为向用户询问 TRNG 数据,而不是像 /dev/random 那样从硬件源中提取数据,是一种有趣的玩具,而不是一种改进。对于专家来说,生成随机数已经够难的了——你不想让普通用户任由他们自己的业余爱好摆布。“随机数的产生太重要了,不能靠运气”——罗伯特·科维尤。
另一方面,BSD 的作者认为,由于 PC 硬件上实际资源的熵估计并不是那么好理解(这是一个物理问题,而不是数学问题),因此使用 PRNG 实际上并不是一个糟糕的选择,前提是它根据 Schneier / Kelsey / Ferguson 的Yarrow设计重新播种。您的骰子想法至少比 /dev/random 的典型熵源具有优势,只要可以信任用户找到公平的骰子并正确掷骰子,您就可以自信地设置熵的下限。它的缺点是,拥有一副好双筒望远镜和/或窃听键盘的手段(例如通过其 E/M 发射)的观察者可能会破坏整个方案,因此这完全取决于您的威胁模型。