4、真随机数发生器(TRNG):TRNG与PRNG的区别、TRNG的熵源设计、TRNG的在线测试与健康检测

各位同学,今天我们来聊聊真随机数发生器。说实话,这个模块在芯片安全里是个“隐形英雄”。你平时可能不太注意它,但一旦它出问题,整个加密系统就跟纸糊的一样。我当年做第一颗安全芯片时,就在这上面栽过跟头——嗯,后面会细说。

4.1 TRNG与PRNG的区别

先搞清楚两个概念:PRNG(伪随机数发生器)和TRNG(真随机数发生器)。

PRNG,说白了就是个算法。你给它一个种子,它就能源源不断地吐出“看起来随机”的数。但问题是——它本质上是确定的。只要知道种子和算法,就能复现整个序列。我见过不少项目,工程师图省事直接用PRNG当密钥源,结果被攻击者通过侧信道反推出种子,整个系统直接沦陷。

TRNG就不一样了。它依赖物理世界的随机性——比如热噪声、抖动、亚稳态。这些过程在物理上是不可预测的,所以TRNG产生的数才是真正的随机。你想想看,量子力学层面的不确定性,谁能预测?

我习惯用一个比喻:PRNG就像一本写好的剧本,演员按台词演;TRNG就像现场即兴表演,没人知道下一句是什么。

核心区别总结:
  • 确定性:PRNG是确定的,TRNG是非确定的
  • 熵源:PRNG依赖种子,TRNG依赖物理噪声
  • 可重复性:PRNG可复现,TRNG不可复现
  • 应用场景:PRNG适合仿真测试,TRNG适合密钥生成

但注意,实际芯片里往往是两者配合使用。TRNG负责产生高质量的种子,PRNG负责快速扩展。这叫“混合模式”。

4.2 TRNG的熵源设计

熵源是TRNG的心脏。设计不好,整个TRNG就是摆设。常见的熵源有几种:

4.2.1 环形振荡器抖动

这是最经典的做法。两个环形振荡器,频率略有差异,通过采样产生随机位。原理很简单:振荡器的相位会受热噪声影响,产生随机抖动。我早期做的一个项目就用这个方案,但踩了个坑——

避坑指南:我曾经遇到过环形振荡器被电源噪声锁定的情况。两个振荡器频率太接近,结果被电源纹波同步了,输出全是010101... 后来我强制让两个振荡器的标称频率差至少3倍以上,才解决这个问题。

4.2.2 亚稳态采样

利用触发器的亚稳态特性。当输入信号刚好在时钟边沿附近变化时,触发器会进入亚稳态,最终稳定到0或1是随机的。这个方法面积小,但输出速率低。

我个人习惯用这种方法做“熵源增强”。在主熵源后面加一级亚稳态采样,把残留的确定性成分打散。

4.2.3 量子噪声源

这是目前最前沿的做法。利用PN结的散粒噪声或电阻的热噪声,经过放大和比较器产生随机位。优点是熵质量极高,缺点是模拟电路设计复杂,对工艺敏感。

我记得有一次帮客户调试一颗28nm的芯片,他们的量子噪声源在低温下输出全是0。查了半天,发现是比较器的失调电压随温度漂移了。后来加了动态失调消除,才算搞定。

设计建议:不管用哪种熵源,一定要做“熵源多样性”。我建议至少设计两种不同类型的熵源,平时可以互相校验。万一一种失效,另一种还能顶上。

4.3 TRNG的在线测试与健康检测

这是TRNG设计里最容易忽视的部分。很多工程师觉得“我熵源设计好了,输出随机数就行了”。但现实是——熵源会老化、会受环境影响、甚至会被攻击者刻意干扰。

所以,在线测试不是可选项,是必选项。

4.3.1 健康检测的层次

我一般把健康检测分为三个层次:

  1. 原始熵源检测:直接检测模拟信号的幅度、频率、抖动范围。比如环形振荡器的频率是否在正常范围内。
  2. 数字后处理检测:对经过数字化后的比特流做统计测试。比如计算0/1比例、游程长度、自相关等。
  3. 系统级检测:结合密码模块,验证生成的随机数是否能通过NIST SP 800-22等标准测试。

4.3.2 常用的在线测试算法

这里我列几个常用的,你们可以直接参考:

测试项 检测内容 阈值建议
重复计数测试 连续相同的比特数 超过64位则告警
自适应比例测试 窗口内0/1比例偏差 偏差超过3σ则告警
游程测试 连续0或1的游程长度分布 与期望分布偏差超过5%则告警
自相关测试 延迟1~16位的自相关系数 系数绝对值超过0.01则告警
关键点:健康检测的阈值不能太松也不能太紧。太松了检测不到攻击,太紧了正常工作时频繁误报。我一般建议先采集100万比特的“黄金样本”,统计出正常波动范围,再设定3σ作为告警阈值。

4.3.3 攻击场景与应对

你想想看,攻击者会怎么对付你的TRNG?

  • 频率锁定攻击:注入特定频率的电磁干扰,让振荡器被锁定。应对方法:做频率监测,发现异常立即切换熵源。
  • 温度攻击:极端温度让熵源失效。应对方法:温度传感器+自适应偏置电路。
  • 电压毛刺攻击:瞬间电压变化让比较器输出固定值。应对方法:多次采样+多数表决。

我曾经遇到过一种很狡猾的攻击——攻击者不是让TRNG完全失效,而是让它的熵率降低到50%以下。这样生成的密钥虽然看起来随机,但实际熵值只有一半。破解难度直接降了一个数量级。所以,健康检测不仅要检测“是否失效”,还要检测“是否退化”。

4.4 一个完整的TRNG架构

下面我用SVG画一个典型的TRNG架构图,你们可以直观感受一下各个模块的关系:

典型TRNG架构图 熵源模块 环形振荡器 亚稳态采样 模拟健康检测 频率/幅度监测 数字化模块 比较器 采样触发器 后处理模块 冯·诺依曼校正 哈希提取 数字健康检测 统计测试/自相关 控制逻辑 随机数输出 (经健康检测验证) 熵源/处理 健康检测 控制逻辑 输出

从这张图你可以看到,TRNG不是简单的“熵源→输出”一条线。健康检测是贯穿始终的。模拟端检测物理信号,数字端检测统计特性,控制逻辑根据检测结果决定是否告警或切换熵源。

个人经验:我建议在芯片上电时做一次完整的“自检”,包括熵源启动时间、频率稳定时间、初始随机性测试。自检通过后才允许TRNG输出。运行过程中,每输出1M比特做一次快速健康检测。这样既保证安全,又不影响性能。

好了,关于TRNG的核心内容就这些。记住一句话:TRNG的强度不取决于它有多复杂,而取决于你对熵源的理解有多深,以及你的健康检测有多全面。下次你们设计安全芯片时,希望这些经验能帮你们少走弯路。