这里有几个因素在起作用:
- 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 或类似指令可用时,引擎只需对池中的数据进行异或运算。这并不是一个好主意,因为它可以通过生成某些值来以有意义的方式轻松处理池数据。如果使用更强的混合功能,攻击者将需要打破它(或做一些更引人注目的事情)以获得对池的有意义的控制。
你的问题没有一个明显的答案。硬件随机数生成器的质量可能非常高,但仅在消费类设备的情况下很难分析它们的实现。话虽如此,如果您要不信任您的硬件,那么您一开始就无法真正做出任何保证。如果你想将不信任的范围完全限制在产生的随机数的质量上,那么围绕这个事实设计你的支持系统。