计算机为从密码到视频游戏和赌博的所有事物生成随机数。 有两类随机数 - “真正的”随机数和伪随机数 - 这个差别对于加密系统的安全性是重要的。
计算机可以通过观察一些不可预测的外部数据(如鼠标移动或扇形噪声),并从中创建数据来生成真正的随机数字。 这被称为熵。 其他时候,他们使用算法产生“伪随机”数字,所以结果是随机的,即使它们不是。
这个话题最近变得更具争议性,很多人质疑英特尔的内置硬件随机数发生器芯片是否值得信赖。 要理解为什么它不值得信赖,你必须了解随机数字是如何被初始化的,以及它们被用于什么。
什么随机数用于
随机数已被使用了数千年。 无论是掷硬币还是掷骰子,目标都是让结果随机化。 计算机中的随机数生成器是相似的 - 它们是试图实现不可预知的随机结果。
随机数字生成器可用于许多不同的目的。 除了为了赌博而产生随机数字或在计算机游戏中产生不可预知的结果等显而易见的应用之外,随机性对于密码学是重要的。
密码学 要求攻击者无法猜测的数字。 我们不能一次又一次地使用相同的数字。 我们希望以非常不可预测的方式生成这些数字,所以攻击者无法猜测它们。 这些随机数字对于安全加密是非常重要的,无论您是在加密自己的文件还是 在Internet上 使用 HTTPS 网站。
真随机数
您可能想知道一台电脑如何能够实际生成一个随机数字。 这个“随机性”来自哪里? 如果它只是一个计算机代码,那么计算机生成的数字是不是可以预测的?
我们通常将计算机产生的随机数分成两种类型,这取决于它们是如何生成的:“真”随机数和伪随机数。
为了产生一个“真实”的随机数,计算机测量在计算机外发生的某种类型的物理现象。 例如,计算机可以测量一个原子的放射性衰变。 根据量子理论,当放射性衰变发生时无法确切知道,所以这基本上是来自宇宙的“纯粹的随机性”。 攻击者无法预测何时会发生放射性衰变,所以他们不知道随机值。
对于更多的日常例子,计算机可以依靠大气噪声,或者简单地使用按键盘上的按键的确切时间作为不可预测的数据或熵的来源。 例如,您的计算机可能会注意到,您在下午2点后正好按下了一个键0.23423523秒。 抓住足够的与这些按键相关的特定时间,你将有一个熵源,你可以用它来产生一个“真正的”随机数。 你不是一个可预测的机器,所以攻击者无法猜测你按下这些键时的确切时刻。 Linux上的/ dev / random设备产生随机数,“阻塞”,直到收集足够的熵返回一个真正的随机数才返回结果。
伪随机数字
伪随机数是“真”随机数的替代。 计算机可以使用种子值和算法来生成似乎是随机的数字,但实际上这是可预测的。 计算机不会从环境中收集任何随机数据。
在任何情况下,这都不是一件坏事。 例如,如果您正在玩视频游戏,那么在该游戏中发生的事件是否由“真实”随机数或伪随机数引起并不重要。 另一方面,如果您使用加密,则不需要使用攻击者可以猜到的伪随机数。
例如,假设攻击者知道伪随机数生成器使用的算法和种子值。 假设一个加密算法从这个算法得到一个伪随机数,并用它来产生一个加密密钥,而不增加任何额外的随机性。 如果攻击者知道了足够多的话,他们可以反向工作,并确定加密算法在这种情况下必须选择的伪随机数,从而破坏加密。
NSA和Intel的硬件随机数生成器
为了使开发人员更容易,并帮助生成安全的随机数,英特尔芯片包括一个称为RdRand的基于硬件的随机数发生器。 该芯片在处理器上使用熵源,并在软件请求时向软件提供随机数。
这里的问题是随机数发生器本质上是一个黑盒子,我们不知道里面发生了什么。 如果RdRand包含一个NSA后门,政府将能够打破由该随机数发生器提供的数据生成的加密密钥。
这是一个严重的问题。 在2013年12月,FreeBSD的开发人员不再支持直接使用RdRand作为随机源,他们不能相信它。 RdRand设备的输出将被输入到另一个算法中,该算法会增加额外的熵,确保随机数发生器中的任何后门都无关紧要。 Linux已经以这种方式工作,进一步随机化来自RdRand的随机数据,所以即使存在后门也不能预测。 英特尔首席执行官Brian Krzanich在最近的AMA(“Ask Me Anything”)上没有回答有关这些问题的问题。 [ 来源 ]
当然,这可能不仅仅是英特尔芯片的问题。 FreeBSD的开发者也通过名字叫出了Via的芯片。 这个争议显示了为什么产生真正随机的,不可预测的随机数是如此重要。
为了产生“真实”的随机数,随机数发生器收集“熵”,或从周围的物理世界看似随机的数据。 对于不需要随机的随机数,他们可能只是使用算法和种子值。
图片来源: Flickr 上的 rekre89,Flickr上的 Lisa Brewster,Flickr上的 Ryan Somma,Flickr 上的Huangjiahui