65.9K
CodeProject 正在变化。 阅读更多。
Home

随机数生成器 – 绝非虚言

2011年8月5日

CPOL

6分钟阅读

viewsIcon

26325

本文讨论代号为“Bull Mountain”的随机数生成器。了解英特尔在生成超强健随机数方面的最新创新。

除了Bull Mountain是美国的一个地理位置(实际上不止一个地方叫Bull Mountain)之外,它还是英特尔最新超强健随机数生成器创新的“代号”。它基于下一代平台(尚未发布)上的新指令 RdRand。 

有人可能会问……“为什么对一个我们还无法访问的平台上的指令如此兴奋?”  嗯,因为它是一项非常令人兴奋且重要的技术,这就是原因(如本博客标题所示)。  言归正传,即使我们大多数人无法访问硬件来测试它的卓越性能,我们也有大量的资源可以帮助实现和基本测试它。  请继续阅读。

Bull Mountain 软件实现指南》最近已在可管理性和安全社区上发布。  奇怪的是,这不是我们第一次揭示它的内容以及如何实现它。  它长期以来一直记录在Intel® AVX网页的第 8.6 节中,并且也在《Intel® 64 and IA-32 Architectures Software Developer’s Manual》中有所引用。  还没有硬件来测试你的实现?  别担心,在我们的“Whatif”网站上有一个支持 RdRand 指令的软件开发模拟器。  请注意,通过模拟,你将无法测试实际结果和性能——这必须在实际硬件上进行。  最后,我们都听说过 Red Hat、Black Hats 和 White Hats,对吧?  那么 Dead Hats 呢?  在这里你可以了解 802.11i 和 802.16e 加密技术——哦,它还有一个在线多项式除法器。  嗯,这有点随意,不是吗?

两天前,我在互联网上看到另一篇关于 Bull Mountain 的博客,作者称其为“真正的随机数生成器”。  嗯,不幸的是,尽管这位作者好心好意,Bull Mountain 并非真正的随机数生成器。  我猜他实际上并没有阅读他所写的博客的实现指南。  没关系。  现在让我们来讨论一下 Bull Mountain 是什么。

首先,我们简要介绍一下随机数生成器(RNG)。  它是一个实用程序或设备,它在一个区间内生成一系列数字,使得这些值看起来(希望!)是不可预测的。  每个值必须在统计上独立于前一个值,从区间中选择的数字的整体分布必须均匀分布,并且序列是不可预测的。  此外,我们希望 RNG 返回值的速度快,并且它应该是高度可扩展的(它应该在短时间内产生大量的请求)。  它还应该能抵御可能观察或更改其底层状态的攻击者,以便预测或影响其输出或干扰其操作。

关于随机数生成器的分类,以下是几种不同类型:

  1. 伪随机数生成器(PRNGs): 使用确定性算法,通常在软件中实现,计算出一系列看起来是随机的数字。  它们需要一个种子,并且同一个 PRNG 总是会产生完全相同的“随机”数字序列。  实际上并不是那么随机,对吧?  PRNG 在很大程度上被认为在密码学上是不安全的——这是一个研究人员通过创建“密码学安全伪随机数生成器”(CSPRNGS)来解决的问题。 
  2. 真正的随机数生成器(TRNGs): 不使用数学模型来确定性地生成看起来是随机的数字。  相反,TRNG 从某种物理源提取“随机性”(熵),然后用它来生成随机数。  例如,物理熵源可能是键盘输入或鼠标移动。  TRNG 设计者面临的主要挑战是找到可靠的熵源,因为由此产生的数值序列通常无法严格满足所需的统计特性。  TRNG 使用非确定性方法是好的;但是它们也有其他缺点。
  3. 级联构造随机数生成器  用于现代操作系统(如 Linux)和加密库,它接收来自熵源的输入,以提供一个熵缓冲区或池。  然后,该熵池用于提供非确定性随机数,这些随机数会定期为密码学安全 PRNG(CSPRNG)提供种子。  这个 CSPRNG 提供密码学安全的随机数,这些随机数看起来是真正随机的,并表现出明确级别的计算攻击抵抗能力。  这里的一个关键优势是性能。  对熵源进行采样可能很慢,因为它通常涉及某种类型的设备 I/O,并且需要一些时间才能发生实时采样事件。  CSPRNG 速度很快,因为它们是基于处理器的,并且可以避免 I/O 和熵源延迟。

最后,Bull Mountain 技术到底是什么?

总的来说,Bull Mountain 遵循级联构造 RNG 模型,使用处理器驻留熵源反复为硬件实现的 CSPRNG 提供种子。  与软件方法不同,它包含高质量的熵源实现,可以快速采样以使用高质量熵反复为 CSPRNG 提供种子。它代表了一个独立的硬件模块,与软件攻击其内部状态隔离,从而实现了在统计质量、高度不可预测的随机数序列、高性能、防攻击方面具有相当大鲁棒性的随机数生成目标。

数字随机数生成器(DRNG)在方法上是独特的,因为它是在处理器芯片本身的硬件中实现的,并且可以在所有特权级别(甚至虚拟机!)运行的软件中使用。

Bull Mountain 还利用了各种加密标准来确保其实现的鲁棒性,并提供其操作方式的透明度。  这些标准包括 NIST SP800-90、FIPS-140-2 和 ANSI X9.82。 

关于 RdRand 指令

  1. 从 DRNG 检索硬件生成的随机值,并将其存储在作为指令参数提供的目标寄存器中。  随机值的大小(16 位、32 位或 64 位)由所提供寄存器的大小决定。 
  2. 必须检查进位标志(CF)以确定在指令执行时是否可用随机值。
  3. 没有硬件环要求。
  4. 通过编程确定给定的 Intel 平台是否支持 RdRand,请使用 CPUID 指令检查 ECX 寄存器的第 30 位。  值为 1 表示处理器支持 RdRand 指令。
  5. 有关代码示例,请参阅 Bull Mountain 实现指南。  该实现指南中有许多编码示例,演示了如果你愿意,“如何自己构建”实现。  最终,你应该能够通过你喜欢的加密库中的函数调用来实现它。

以上就是本期内容!  希望你对这项新功能和我一样感到兴奋!

如有关于此帖的任何问题,请随时通过我们的 可管理性和安全社区论坛与我们联系。

© . All rights reserved.