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不是“熵源→输出”这么简单。模拟前端要处理微弱信号,数字化要选择合适的采样策略,后处理要消除偏置和相关性,在线测试要实时监控熵源健康状态。任何一个环节出问题,输出的随机数质量都会打折扣。
1.6 为什么我们需要TRNG?
你想想看,现代密码学里,密钥生成、随机数、初始化向量、nonce……哪个不需要真正的随机性?如果攻击者能预测你的随机数,那加密就形同虚设。
我参与过一个银行卡芯片项目,认证机构要求TRNG必须通过AIS-31标准。当时我们用了热噪声方案,前后迭代了三版才通过。那个过程让我深刻理解:TRNG不是“有就行”,而是“够好才行”。
一句话总结:TRNG是密码系统的信任根。如果根不可信,整个安全体系就是空中楼阁。