1. TRNG基础概念:真随机数到底“真”在哪?

各位同学好,我是老周。做嵌入式安全这行快十五年了,今天咱们来聊聊TRNG——真随机数发生器。说实话,我刚入行时也分不清“真随机”和“伪随机”到底差在哪,直到第一次在金融终端项目里被认证机构打回来……嗯,从那以后我再也不敢把PRNG当TRNG用了。

1.1 真随机数发生器(TRNG)是什么?

TRNG,全称True Random Number Generator。它靠物理世界的不可预测现象来产生随机数。比如电阻的热噪声、时钟的抖动、甚至宇宙射线。这些过程在原理上就是不可重复、不可预测的。

我习惯用一个比喻:TRNG像掷骰子,PRNG像背口诀。你掷一次骰子,结果由空气阻力、桌面摩擦、手部角度共同决定——没人能精确复现。但背口诀,只要知道起始数字和规则,结果就是确定的。

核心定义:TRNG从物理熵源中提取不可预测的随机性,经过数字化和后处理,输出统计上独立、均匀分布的随机比特序列。

1.2 TRNG与PRNG的本质区别

很多同学问我:“老周,我用C语言的rand()不也能生成随机数吗?” 能,但那是伪随机。咱们直接看对比:

对比维度 TRNG(真随机) PRNG(伪随机)
熵源 物理过程(热噪声、抖动等) 算法+种子(确定性)
可预测性 理论上不可预测 已知种子和算法即可预测
周期性 无周期 必然存在周期
输出速率 通常较慢(kbps~Mbps) 极快(Gbps级别)
硬件依赖 必须专用硬件 纯软件即可
典型应用 密钥生成、安全芯片 仿真、游戏、非安全场景

我曾经在一个物联网项目中,客户坚持用PRNG生成设备密钥。结果呢?攻击者通过分析几个密钥样本就反推出了种子,整个产品线的密钥全部沦陷。那次教训让我明白:安全场景必须用TRNG,没得商量。

1.3 熵源的物理基础

TRNG的根基在物理世界。说白了,就是利用自然界那些“不听话”的现象。我挑三个最常见的给大家拆开讲讲。

1.3.1 热噪声(Thermal Noise)

也叫约翰逊-奈奎斯特噪声。电阻里的电子在温度驱动下做无规则热运动,产生随机的电压波动。这个波动幅度很小(微伏级),但频率极宽,从直流到太赫兹都有。

我习惯用运放把热噪声放大到可采样的范围。但要注意——放大电路本身也会引入噪声,你得确保放大器的噪声远小于信号噪声,否则测出来的全是放大器自己的“脾气”。

实战技巧:选电阻时,阻值越大热噪声越强。但阻值太大又会引入寄生电容,影响带宽。我个人习惯用10kΩ~100kΩ的金属膜电阻,温度系数要低。

1.3.2 抖动(Jitter)

时钟信号的边沿不是绝对精确的。每个周期都会有一点点偏差,这就是抖动。利用这个偏差,我们可以提取随机性。

具体做法:用一个慢时钟采样一个快时钟,或者让两个自由振荡的环形振荡器互相采样。由于抖动是随机的,采样结果就是随机的。

我记得在FPGA上实现环形振荡器TRNG时,布局布线稍微不同,抖动特性就变了。所以每次流片后都要重新评估熵源质量,不能照搬前一次的校准参数。

1.3.3 混沌电路(Chaotic Circuit)

混沌电路对初始条件极度敏感。比如一个简单的蔡氏电路,参数稍微变一点,输出就从周期振荡变成混沌状态。这种“蝴蝶效应”非常适合做熵源。

但混沌电路有个坑:参数漂移。温度一变,电阻电容值跟着变,混沌状态可能退化成周期振荡。我曾在-40°C测试时发现熵源几乎“死掉”了,输出全是重复模式。后来加了温度补偿和在线监测才解决。

警告:不要以为混沌电路“看起来随机”就够用。必须通过NIST SP 800-22或AIS-31等统计测试,否则你的TRNG可能只是“看起来很真的伪随机”。

1.4 三种熵源的对比与选择

实际项目中怎么选?我列个表,大家根据场景对号入座:

熵源类型 优点 缺点 典型应用
热噪声 理论成熟、带宽宽、抗干扰强 信号微弱、需高增益放大 安全芯片、密码模块
抖动 易在数字电路中实现、面积小 易受电源噪声影响、速率低 FPGA、MCU内置TRNG
混沌电路 输出速率高、单芯片集成 参数敏感、温度稳定性差 高速随机数需求场景

我个人倾向:安全等级要求高的项目,优先选热噪声。如果成本敏感且速率要求不高,抖动方案更实用。混沌电路嘛……除非你有足够的模拟设计经验,否则慎用。

1.5 TRNG的完整工作流程

一个完整的TRNG系统,不是把熵源信号直接当随机数输出就完事了。它需要经过几个关键步骤。我画了张图,大家一看就明白:

TRNG 典型工作流程 物理熵源 热噪声/抖动/混沌 模拟前端 放大/滤波/偏置 数字化 比较器/ADC/采样 后处理 去偏/压缩/哈希 在线测试 健康监测/告警 随机数输出 密钥/种子/随机比特 状态反馈 ⚠ 注意 在线测试是安全认证 的强制要求 不能省略!

从这张图能看出,TRNG不是“熵源→输出”这么简单。模拟前端要处理微弱信号,数字化要选择合适的采样策略,后处理要消除偏置和相关性,在线测试要实时监控熵源健康状态。任何一个环节出问题,输出的随机数质量都会打折扣。

1.6 为什么我们需要TRNG?

你想想看,现代密码学里,密钥生成、随机数、初始化向量、nonce……哪个不需要真正的随机性?如果攻击者能预测你的随机数,那加密就形同虚设。

我参与过一个银行卡芯片项目,认证机构要求TRNG必须通过AIS-31标准。当时我们用了热噪声方案,前后迭代了三版才通过。那个过程让我深刻理解:TRNG不是“有就行”,而是“够好才行”。

一句话总结:TRNG是密码系统的信任根。如果根不可信,整个安全体系就是空中楼阁。