计算机如何生成随机数

从密码术到视频游戏和赌博,计算机都会为所有内容生成随机数。随机数有两类-“真实”随机数和伪随机数-区别对于加密系统的安全性很重要。

计算机可以通过观察一些外部数据(例如无法预测的鼠标移动或风扇噪音)并从中创建数据来生成真正的随机数。这称为熵。有时候,他们会通过使用算法生成“伪随机”数,因此结果看起来是随机的,即使不是。

最近,这个话题变得越来越有争议,许多人质疑英特尔内置的硬件随机数生成器芯片是否值得信赖。要了解为什么它可能不值得信赖,您必须首先了解如何生成随机数以及它们的用途。

什么随机数用于

随机数已经使用了数千年。无论是掷硬币还是掷骰子,目的都是让最终结果具有随机的机会。计算机中的随机数生成器类似,它们是试图获得不可预测的随机结果。

有关的:什么是加密,它如何工作?

随机数生成器可用于许多不同目的。除了显而易见的应用(例如出于赌博目的生成随机数或在计算机游戏中产生不可预测的结果)外,随机性对于密码学也很重要。

密码学要求攻击者无法猜测的数字。我们不能只是一遍又一遍地使用相同的数字。我们希望以一种非常不可预测的方式生成这些数字,以使攻击者无法猜测它们。无论您是加密自己的文件还是仅使用Internet上的HTTPS网站,这些随机数对于安全加密都是必不可少的。

真随机数

您可能想知道计算机实际上如何生成随机数。这种“随机性”从何而来。如果只是一段计算机代码,难道计算机生成的数字就可以预测吗?

我们通常将计算机生成的随机数分为两种类型,具体取决于生成方式:“真”随机数和伪随机数。

为了生成“真实”随机数,计算机会测量在计算机外部发生的某种类型的物理现象。例如,计算机可以测量原子的放射性衰变。根据量子理论,无法确定何时会发生放射性衰变,因此这本质上是来自宇宙的“纯随机性”。攻击者无法预测何时会发生放射性衰变,因此他们不会知道随机值。

对于更日常的示例,计算机可能依赖于大气噪声,或者仅将按下键盘上按键的确切时间用作不可预测的数据或熵的来源。例如,您的计算机可能会注意到您在下午2点后恰好在0.23423523秒处按下了一个键,抓住与这些键相关的足够的特定时间,您将获得一个熵源,可用于生成“真实的”随机数。数字。您不是可预测的机器,因此攻击者无法猜测您按下这些键的确切时间。 Linux上的/ dev / random设备会生成随机数,“阻塞”并且直到它收集到足够的熵才能返回真正的随机数后才返回结果。

伪随机数

伪随机数是“真实”随机数的替代方法。计算机可以使用种子值和算法来生成看似随机的数字,但实际上是可预测的。电脑不会从环境中收集任何随机数据。

在每种情况下,这不一定都是一件坏事。例如,如果您正在玩电子游戏,那么该游戏中发生的事件是由“真实”随机数还是伪随机数引起的,这并不重要。另一方面,如果您使用的是加密,则您不想使用攻击者可能猜到的伪随机数。

例如,假设攻击者知道伪随机数生成器使用的算法和种子值。假设加密算法从该算法中获取了一个伪随机数,并使用它来生成加密密钥,而无需增加任何其他随机性。如果攻击者知道的足够多,他们可以向后工作并确定在这种情况下加密算法必须选择的伪随机数,从而破坏加密。

NSA和英特尔的硬件随机数生成器

为了使开发人员更轻松并帮助生成安全的随机数,英特尔芯片包括称为RdRand的基于硬件的随机数生成器。该芯片使用处理器上的熵源,并在软件请求时为软件提供随机数。

这里的问题是随机数生成器本质上是一个黑匣子,我们不知道它内部发生了什么。如果RdRand包含NSA后门,则政府将能够破坏仅由该随机数生成器提供的数据生成的加密密钥。

这是一个严重的问题。 2013年12月,FreeBSD的开发人员取消了对将RdRand直接用作随机来源的支持,称他们对此表示不信任。 [来源] RdRand设备的输出将被馈送到另一种算法中,该算法会增加额外的熵,从而确保随机数生成器中的任何后门都不重要。 Linux已经以这种方式工作了,进一步将来自RdRand的随机数据随机化,这样即使有后门也无法预测。 [来源]在Reddit上的最新AMA(“问我什么”)中,英特尔首席执行官Brian Krzanich没有回答有关这些问题的问题。 [来源]

当然,这可能不仅仅是英特尔芯片的问题。 FreeBSD的开发人员也按名称标注了Via的芯片。这项争议表明,为什么生成真正随机且不可预测的随机数如此重要。

为了生成“真实”随机数,随机数生成器从其周围的物理世界中收集“熵”或看似随机的数据。对于没有的随机数 真的 需要是随机的,他们可能只使用算法和种子值。

图片来源:Flickr上的rekre89,Flickr上的Lisa Brewster,Flickr上的Ryan Somma,Flickr上的huangjiahui


$config[zx-auto] not found$config[zx-overlay] not found