一、TRNG 基础概念:真随机数到底怎么来的?
各位同学,咱们今天聊点实在的。真随机数发生器——TRNG,这玩意儿在安全领域可是个硬通货。我刚开始接触这行的时候,总觉得随机数嘛,不就是个数字游戏?后来踩了坑才明白,真随机和伪随机之间,隔着一道天堑。
1.1 真随机数发生器的核心原理
说白了,TRNG 就是利用物理世界的不可预测性来产生随机数。你想想看,自然界里哪些东西是真正随机的?热噪声、放射性衰变、大气噪声……这些过程,你没法用任何数学模型精确预测。
TRNG 的工作流程其实不复杂,我习惯把它拆成三步:
- 熵源采集——从物理过程中提取随机信号
- 熵提取——把模拟信号转换成数字比特流
- 后处理——消除偏差,提高随机质量
核心要点:TRNG 的安全性建立在物理熵源上,而不是算法上。这意味着,只要物理过程本身不可预测,生成的随机数就是真随机。
1.2 常见的熵源类型
我在项目里接触过几种主流的熵源,各有各的脾气。下面这张表能帮你快速了解它们的区别:
| 熵源类型 | 物理原理 | 典型速率 | 硬件复杂度 | 我的评价 |
|---|---|---|---|---|
| 热噪声 | 电阻中载流子的热运动 | 低~中 | 低 | 最经典,稳定可靠 |
| 振荡器采样 | 时钟抖动的不确定性 | 中~高 | 中 | FPGA 上常用 |
| 量子效应 | 光子隧穿、量子涨落 | 高 | 高 | 高端专用,成本不低 |
热噪声熵源
这是我最喜欢的一种,原因很简单——它够纯粹。电阻里的电子在热运动,这种运动是随机的,跟温度直接相关。你只需要一个放大器,把微弱的噪声信号放大到可测量的范围,然后采样就行。
我记得有一次做低功耗设计,热噪声源的功耗成了瓶颈。后来改用斩波稳定放大器,才把功耗压下来。嗯,这里要注意:热噪声信号非常微弱,PCB 布局稍有不慎,工频干扰就进来了。
振荡器采样熵源
这个在 FPGA 和 ASIC 里特别常见。原理是利用两个振荡器——一个慢速、一个快速。慢速振荡器去采样快速振荡器的输出,由于时钟抖动,每次采到的相位都不一样。
你想想看,两个独立振荡器的频率漂移和抖动,叠加起来就是天然的随机性。我在一个 IoT 安全芯片项目里用过这种方案,成本低,效果也不错。但有个坑——如果两个振荡器有耦合,随机性会大打折扣。
避坑指南:我曾经在一个项目里发现,振荡器采样输出的随机数有周期性模式。查了两天才找到原因——电源噪声把两个振荡器同步了。从那以后,我设计 TRNG 时一定会给振荡器独立的 LDO 供电。
量子效应熵源
这是目前公认的"真·真随机"方案。利用量子力学的基本性质——比如光子通过半透半反镜时的路径选择,或者量子隧穿效应的不确定性。这些过程,从理论上就是不可预测的。
不过说实话,量子 TRNG 目前还比较贵。我在实验室里见过一套基于量子隧穿二极管的方案,随机质量确实好,但一颗芯片就要几十美金。一般消费级产品用不起。
1.3 TRNG 与 PRNG 的区别
这个问题,我面试新人时必问。很多人觉得"随机数嘛,不都一样?"——大错特错。
PRNG(伪随机数发生器)是用算法生成的。比如线性同余法、梅森旋转算法。只要种子确定了,整个序列就确定了。这意味着什么?意味着如果你知道种子,就能预测所有输出。
TRNG 就不一样了。它每次生成都依赖物理过程,同样的电路,两次运行结果完全不同。你没法用任何算法复现。
| 对比维度 | TRNG | PRNG |
|---|---|---|
| 熵源 | 物理过程 | 算法+种子 |
| 可预测性 | 不可预测 | 已知种子可预测 |
| 输出速率 | 通常较低 | 可以很高 |
| 可重复性 | 不可重复 | 相同种子可重复 |
| 典型应用 | 密钥生成、安全令牌 | 仿真、游戏、测试 |
我的建议:实际产品中,经常是 TRNG + PRNG 混合使用。TRNG 负责生成种子,PRNG 负责高速扩展。既保证了安全性,又满足了速率要求。我在一个金融安全终端里就是这么做的。
1.4 TRNG 的典型架构
下面这张图是我自己画的 TRNG 典型架构,你可以看到各个模块是怎么配合的:
1.5 为什么 TRNG 这么重要?
我直接说结论:没有真随机数,就没有真正的安全。你想想看,如果密钥是用 PRNG 生成的,攻击者只要拿到种子,整个系统就沦陷了。
2012 年有个著名的案例——某厂商的嵌入式设备用了一个固定种子的 PRNG 来生成 SSH 密钥。结果呢?所有设备的密钥都一样。攻击者拿到一台,就能登录所有设备。这就是典型的"伪随机"灾难。
TRNG 的价值就在于——它让攻击者没法预测。即使攻击者知道你的算法、你的硬件设计,只要物理熵源是安全的,他就没法复现你的随机数。
一句话总结:TRNG 是安全系统的"信任根"。没有它,上层所有的加密算法都是空中楼阁。
1.6 实际开发中的考量
做 TRNG 驱动开发,有几个点我特别在意:
- 启动时间——有些熵源需要预热,比如热噪声源要等温度稳定。我习惯在驱动里加一个"熵源就绪"状态位。
- 速率匹配——TRNG 输出速率通常不高,如果上层应用需要大量随机数,得考虑缓冲机制。
- 故障处理——熵源可能失效(比如振荡器停振),驱动里必须有超时检测和复位逻辑。
嗯,这些细节后面几章会展开讲。今天先把概念理清楚,后面写代码的时候才不会跑偏。