测试硬件随机数生成器

信息安全 密码学 随机的 树莓派
2021-09-05 14:32:32

Raspberry Pi 有一个内置的硬件随机数生成器,但似乎没有任何关于硬件的公开文档,即使有也会有问题(哪家公司会公开承认他们的硬件可能存在问题)如果他们可以摆脱它,拥有自己的硬件?)。

那么问题来了,测试硬件随机数生成器的最佳方法是什么?如果我用硬件随机数生成器生成的随机数填充了一个 10GB 的文件,我的主计算机上是否有任何工具可以用来查看生成的数字中是否有任何模式?

我很难相信没有第三方方法可以验证随机数生成器(无论是软件还是硬件)是否可以安全使用。否则,为什么会有人相信一个非开源且无法独立审计的随机数生成器?

我想使用 Raspberry Pi 来生成一些私钥,但是普通的软件随机数生成器没有获得足够的熵来使其可行(需要很长时间才能生成),但是使用硬件随机数生成器它更可行。我只是不知道我是否可以信任硬件随机数生成器。

4个回答

这里有几个因素在起作用:

  • ARM 微处理器内部使用的物理 HRNG 机制。
  • 微处理器内部硅片上的支持逻辑。
  • 部署在微处理器上的微码。
  • RNG 在 Linux 中的实现。

根据制造商的说法,该特定芯片在集电极开路 HRNG 设计中使用来自反向偏置晶体管的噪声。这正是我在当前 HRNG 项目中使用的硬件,但要小得多。这是直接在硅片中实现 HRNG 的最便宜的方法之一;虽然我使用的是分立晶体管,但 ARM 处理器只是将其缩小到芯片上的几个硅片。

我们知道这种机制是随机性的强大来源,因为它依赖于一种称为量子隧道效应的现象,这种现象被称为概率性和随机性。基本思想是电子会随机“跳跃”在晶体管内部的带隙上,从而产生随机波动的信号。然后我们可以放大它(简单的 PNP 晶体管放大器就可以了),并通过以固定频率对结果进行采样来将输出解释为 1 或 0 - 如果超过某个阈值,则为 1,否则为 0。

这种机制的一个轻微缺陷是,任何 DC 泄漏都会导致向 1 倾斜,而不是 0 更频繁地出现。为了解决这个问题,我们可以使用一个叫做冯诺依曼去相关的简单技巧,它本质上涉及将位对 01 和 10 分别编码为 0 和 1,并忽略所有 00 和 11 对。这会产生统计上无偏的流。

我几乎可以肯定地保证这是它产生随机数的机制。有一个主要的替代方案(两个反向偏置的非门并联),但它受到英特尔专利的保护,所以我怀疑 ARM 是否在使用它。不幸的是,唯一可以确定的方法是拿一些酸并打开芯片,然后用显微镜开始对硅进行逆向工程。我碰巧没有可用的备用装备。

您在此类探索中可能发现的潜在漏洞是高频时钟信号或其他 HF 数据线非常靠近 HRNG 或其支持逻辑,从而导致潜在的干扰。这在 IC 中通常不太可能发生,但我们在这里讨论的是高灵敏度应用,因此值得寻找。但是,即使是这种情况,从密码分析的角度来看,我也不认为它提供了有用的偏差。

下一个被利用的潜力是微码。最近,一位研究人员证明,可以为英特尔处理器修补微码,以在指令缓冲区中寻找独特的模式,并检测何时使用 RDRAND 指令填充/dev/random池。然后它将识别处理器缓存中该池缓冲区的位置并将其有效归零,从而将归零池复制回系统内存。这意味着/dev/random会不断输出相同的攻击者控制的值,带来明显的毁灭性后果。如果在 ARM 微代码中使用了类似但更微妙的技巧,则可能以只有补丁创建者知道的方式大量减少 HRNG 的熵。检测这些技巧会很困难,但可以通过提取微码并对其进行分析来完成。

最后一个问题是Linux内核内部的RNG设计。/dev/random池通常由一堆基于状态的源提供,使用基于加密函数的混合算法但是,当 RDRAND 或类似指令可用时,引擎只需对池中的数据进行异或运算。这并不是一个好主意,因为它可以通过生成某些值来以有意义的方式轻松处理池数据。如果使用更强的混合功能,攻击者将需要打破它(或做一些更引人注目的事情)以获得对池的有意义的控制。

你的问题没有一个明显的答案。硬件随机数生成器的质量可能非常高,但仅在消费类设备的情况下很难分析它们的实现。话虽如此,如果您要不信任您的硬件,那么您一开始就无法真正做出任何保证。如果你想将不信任的范围完全限制在产生的随机数的质量上,那么围绕这个事实设计你的支持系统。

我过去也遇到过同样的问题。美国国家标准与技术研究院 (NIST) 实际上已经准备了一套完整的测试它包含各种统计测试并报告每个测试的 ap 值。它包括简单的测试,例如仅计算零和一以查看它们是否接近 50%,以及复杂的测试,例如频谱分析。有一个非常广泛的易于阅读和理解的手册,它解释了所有的理论以及如何正确使用测试和解释它们的结果。

我很难相信没有第三方方法可以验证随机数生成器(无论是软件还是硬件)是否可以安全使用。

不幸的是,情况就是这样。除非 RNG 非常糟糕以至于输出中存在明显的偏差,否则很难检测到 RNG 是否包含可以被视为后门的细微弱点,而无需查看源代码。

关于用于测试随机数据可预测性的工具 - 行业标准是更顽固的套件,可在此处找到
RaspberryPi 特定示例,在安装内核模块和 rng-tools 后启动

apt-get install dieharder
cat /dev/hwrng | dieharder -d 0 -vv  

# Verbose is now 0
#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name|rands/second|   Seed   |
    mt19937|  1.34e+06  |2497347415|
#=============================================================================#
    test_name       |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.79423698|  PASSED