当前位置:  开发笔记 > 编程语言 > 正文

真随机数发生器

如何解决《真随机数发生器》经验,为你挑选了5个好方法。

对不起,这不是一个"真实"的问题,但有时回来我记得在这里看到一篇关于随机随机化随机化生成真正随机数的帖子,而不仅仅是伪随机数.如果我搜索它,我不会看到它.

有人知道那篇文章吗?



1> Simon Johnso..:

我不同意这个问题的很多答案.

可以在计算机上收集随机数据.如果你不能,SSL,SSH和VPN将不安全.

软件随机数发生器工作的方式是从许多不同的地方收集的随机数据,例如时钟漂移,中断定时等.

这些方案的技巧是正确估计(随机性的豪华名称).只要您正确估计熵,源是否为偏差并不重要.

为了说明这一点,我在这个评论中击中字母e的几率远远高于z,所以如果我使用关键中断作为熵的来源则会产生偏差 - 但仍然存在一些随机性在那个输入中.您无法准确预测本段中接下来将会出现哪个字母序列.您可以从这种不确定性中提取熵,并将其用作随机字节的一部分.

像Yarrow这样的高质量实时随机生成器具有内置的非常复杂的熵估计,并且只会发出尽可能多的字节,因为它可以在其"随机池"中可靠地说出它.


-1密码安全伪随机!=真随机

2> Blorgbeard..:

我相信那是在thedailywtf.com上 - 即.不是你想做的事情.

无论您调用randomize()多少次,都无法从伪随机数中获得真正的随机数.

可以从特殊硬件中获取"真实"随机数.您还可以从鼠标移动和类似的东西中收集熵.



3> John with wa..:

在帖子的最后,我将回答你为什么要使用多个随机数生成器来实现"更多随机性"的问题.

关于随机性意味着什么存在哲学争论.在这里,我的意思是"在所有方面都无法区分统一(0,1)iid分布对所抽取的样本"我完全无视随机的哲学问题.

Knuth第2卷有一个分析,他试图按照你的建议创建一个随机数生成器,然后分析它失败的原因,以及真正的随机过程.第2卷详细介绍了RNG.

其他人建议您使用随机物理过程来生成随机数.然而,正如我们在Espo/vt交互中所看到的,这些过程可能具有微妙的周期性元素和其他非随机元素,部分原因是具有确定性行为的外部因素.一般来说,最好永远不要假设随机性,但总是要测试它,如果你意识到它们,你通常可以纠正这些伪影.

有可能创建一个"无限"的比特流,它们确定地完全随机出现.不幸的是,这种方法在存储器中随着要求的位数而增长(因为它们必须避免重复循环),因此它们的范围是有限的.

实际上,使用具有已知属性的伪随机数生成器几乎总是更好.要查找的关键数字是相空间维度(在您仍然可以依赖于均匀分布的样本之间大致偏移)和位宽度(每个样本中相对于彼此均匀随机的位数) )和循环大小(分配开始重复之前可以采取的样本数).

但是,由于来自给定生成器的随机数确定性地采用已知序列,因此搜索生成器并找到对齐序列的人可能会暴露您的过程.因此,如果您维护两个生成器,则可以避免立即将您的分发识别为来自特定随机数生成器.从第一个开始,您对i进行采样,然后将其均匀地映射到一个到n,其中n最多是相位维度.然后,在第二次你抽样i次,并返回第i个结果.在最坏的情况下,这会将周期大小减小到(原始周期大小/ n),但是对于该周期仍将生成均匀的随机数,并且这样做的方式使得在n中搜索对齐呈指数.它还将减少独立相位长度.唐"



4> Sklivvz..:

由于随机数的定义是:无法存在真正随机数的算法:

具有不可预测的结果,并且在理想情况下,所有结果同样可能; 这种选择产生的; 缺乏统计相关性.

有更好或更差的伪随机数发生器(PRNG),即完全可预测的数字序列,在不知道称为种子的信息的情况下难以预测.

现在,极难推断种子的PRNG在加密方面是安全的.如果您正在寻找的话,您可能希望在Google中查找它们.

另一种方式(无论这是否真的是随机的是一个哲学问题)是使用随机数据源.例如,不可预测的物理量,例如噪声,或测量放射性衰变.

这些仍然受到攻击,因为它们可以独立测量,有偏差等等.所以这真的很棘手.这是通过定制硬件完成的,这通常非常昂贵.我不知道它有多好/dev/random,但我敢打赌,它对于加密技术还不够好(大多数加密程序都带有自己的RNG,而Linux也在启动时寻找硬件RNG).



5> Espo..:

根据维基百科 /dev/random,在类Unix操作系统中,是一个特殊文件,用作真正的随机数生成器.

/ dev/random驱动程序从各种非确定性源收集环境噪声,包括但不限于在操作系统环境中发生的键盘间定时和中断间定时.对噪声数据进行采样并将其与类似CRC的混合函数组合成连续更新的"熵池".通过获取该池内容的MD5哈希来获得随机位串.单向散列函数从池数据中提取真实的随机位,并从对手中隐藏池的状态.

/ dev/random例程维护池中真实随机性的估计值,并在每次请求使用随机字符串时减少它.当估计值降至零时,例程会锁定并等待非确定性事件的发生以刷新池.

/ dev/random内核模块还提供另一个接口/ dev/urandom,它不等待熵池重新充电并返回所请求的字节数.结果/ dev/urandom与/ dev/random相比在生成时相当快,仅在需要非常高质量的随机性时使用.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有