一、TRNG 基础概念:真随机数到底怎么来的?

各位同学,咱们今天聊点实在的。真随机数发生器——TRNG,这玩意儿在安全领域可是个硬通货。我刚开始接触这行的时候,总觉得随机数嘛,不就是个数字游戏?后来踩了坑才明白,真随机和伪随机之间,隔着一道天堑。

1.1 真随机数发生器的核心原理

说白了,TRNG 就是利用物理世界的不可预测性来产生随机数。你想想看,自然界里哪些东西是真正随机的?热噪声、放射性衰变、大气噪声……这些过程,你没法用任何数学模型精确预测。

TRNG 的工作流程其实不复杂,我习惯把它拆成三步:

  1. 熵源采集——从物理过程中提取随机信号
  2. 熵提取——把模拟信号转换成数字比特流
  3. 后处理——消除偏差,提高随机质量

核心要点: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 典型架构,你可以看到各个模块是怎么配合的:

TRNG 典型架构框图 物理熵源 热噪声 / 振荡器 / 量子 模拟采样 ADC / 比较器 后处理 去偏 / 哈希 / 冯·诺依曼 模拟信号 原始比特流 随机数输出 接口:SPI / AHB / FIFO 处理后数据 健康检测 在线监测 / 告警 / 自检 监测信号 控制信号 架构说明: 1. 物理熵源是 TRNG 的根基,决定了随机性的上限 2. 健康检测模块实时监控熵源状态,发现异常立即告警 3. 后处理不是必须的,但能显著提升随机质量

1.5 为什么 TRNG 这么重要?

我直接说结论:没有真随机数,就没有真正的安全。你想想看,如果密钥是用 PRNG 生成的,攻击者只要拿到种子,整个系统就沦陷了。

2012 年有个著名的案例——某厂商的嵌入式设备用了一个固定种子的 PRNG 来生成 SSH 密钥。结果呢?所有设备的密钥都一样。攻击者拿到一台,就能登录所有设备。这就是典型的"伪随机"灾难。

TRNG 的价值就在于——它让攻击者没法预测。即使攻击者知道你的算法、你的硬件设计,只要物理熵源是安全的,他就没法复现你的随机数。

一句话总结:TRNG 是安全系统的"信任根"。没有它,上层所有的加密算法都是空中楼阁。

1.6 实际开发中的考量

做 TRNG 驱动开发,有几个点我特别在意:

  • 启动时间——有些熵源需要预热,比如热噪声源要等温度稳定。我习惯在驱动里加一个"熵源就绪"状态位。
  • 速率匹配——TRNG 输出速率通常不高,如果上层应用需要大量随机数,得考虑缓冲机制。
  • 故障处理——熵源可能失效(比如振荡器停振),驱动里必须有超时检测和复位逻辑。

嗯,这些细节后面几章会展开讲。今天先把概念理清楚,后面写代码的时候才不会跑偏。