第三章:真随机数发生器(TRNG)——熵源设计、数字后处理与FIPS 140-3合规
真随机数发生器,圈里人常叫它TRNG。这东西在安全芯片里有多重要?我打个比方:如果加密引擎是锁,那TRNG就是造钥匙的机器。钥匙造得不好,锁再结实也没用。
我在做第一颗安全芯片时,就吃过TRNG的亏。当时觉得随机数嘛,随便搞个振荡器采采样就行。结果送测FIPS 140-2时,健康检测死活过不去。嗯,从那以后我再也不敢小看TRNG的设计了。
3.1 熵源设计:随机性的物理根基
TRNG的核心是熵源。说白了,就是找一个物理上不可预测的噪声源。常见的方案有几种:
- 环形振荡器抖动采样:利用振荡器相位噪声,这是最经典的做法
- 热噪声放大:直接放大电阻或晶体管的热噪声
- 亚稳态采样:利用触发器的亚稳态特性
- 量子效应:比如光子散粒噪声,但成本高
我个人习惯用环形振荡器方案。为什么?因为它纯数字实现,不需要模拟IP,流片风险低。但要注意——
熵源设计时,我建议关注三个指标:
| 指标 | 含义 | 我的经验值 |
|---|---|---|
| 最小熵 | 每个比特包含的真实随机性 | 至少0.5以上 |
| 采样率 | 每秒能产生多少原始比特 | 根据应用定,一般1-10MHz |
| 相关性 | 相邻比特之间的依赖关系 | 必须接近0 |
3.2 数字后处理:把噪声变成真随机
原始熵源输出的比特,其实质量很差。你想想看,振荡器抖动可能只有几个皮秒,采样出来的比特串里,0和1的比例可能严重失衡。这时候就需要后处理。
后处理的核心任务有两个:去偏和提取。去偏是消除0/1比例偏差,提取是从长串中压缩出高熵比特。
常用的后处理算法:
- 冯·诺依曼校正器:经典但效率低,适合简单场景
- 哈希函数提取:比如SHA-256,安全性高,但面积大
- LFSR后处理:线性反馈移位寄存器,轻量级方案
- 加密算法反馈:用AES做后处理,我比较推荐
后处理的代码示例(伪代码):
// 冯·诺依曼校正器实现
function von_neumann_corrector(raw_bits):
output = []
i = 0
while i < len(raw_bits) - 1:
if raw_bits[i] != raw_bits[i+1]:
output.append(raw_bits[i])
i += 2
return output
// 注意:这个校正器会丢弃约75%的输入比特
// 但能完美消除偏差
3.3 在线健康检测:实时监控随机数质量
TRNG最怕什么?怕它坏了你还不知道。比如温度变化导致振荡器停振,或者电源噪声突然增大。所以必须做在线健康检测。
FIPS 140-3要求TRNG必须包含两种检测:
- 启动检测(Startup Tests):上电时验证TRNG功能正常
- 连续检测(Continuous Tests):运行时持续监控输出质量
连续检测通常包括:
- 重复计数检测:检查是否有连续相同的比特
- 自适应比例检测:统计窗口内的0/1比例
- 游程检测:检查连续相同比特的长度分布
我曾经遇到过一个案例:芯片在低温下,振荡器频率变慢,导致采样率下降。健康检测发现重复计数超标,自动触发了复位。虽然影响了用户体验,但保证了安全性。嗯,这就是健康检测的价值——宁可误报,不可漏报。
3.4 FIPS 140-3合规要求
FIPS 140-3是当前最新的安全标准。对于TRNG,它比上一版严格得多。核心要求包括:
| 要求项 | 具体内容 | 我的解读 |
|---|---|---|
| 熵源验证 | 必须提供熵源的数学模型和测试报告 | 不能只说"我用了振荡器",要给出理论分析 |
| 健康检测 | 必须包含启动检测和连续检测 | 而且检测逻辑本身也要防篡改 |
| 后处理 | 必须使用NIST批准的算法 | SHA-256、AES等都可以 |
| 测试向量 | 必须通过NIST SP 800-22全套测试 | 15项测试,一项都不能少 |
FIPS 140-3还要求TRNG必须有故障注入防护。什么意思?就是攻击者用激光、电磁干扰等手段攻击TRNG时,芯片要能检测到并进入安全状态。
- TRNG输出必须经过后处理才能用于密钥生成
- 健康检测失败时,必须输出错误标志并停止输出
- 所有检测事件必须记录到安全日志中
- TRNG的硬件实现必须通过侧信道攻击评估
我个人建议,在设计阶段就把FIPS 140-3的要求融入进去。不要等流片回来再补测试,那会非常痛苦。我见过一个团队,芯片都做好了才发现TRNG不满足健康检测要求,结果只能做金属层改动,多花了几十万美金。
3.5 TRNG的完整架构
下面这张图是我设计的TRNG架构,已经在三款芯片中验证过:
这个架构的关键在于:健康检测模块独立于主数据路径。它有自己的电源和时钟域,即使主路径被攻击,检测模块还能正常工作。我管这叫"看门狗架构"——让一个简单的电路去监控复杂的电路。
- 熵源是否做了差分设计?
- 后处理是否用了NIST批准的算法?
- 健康检测是否覆盖了启动和连续两种模式?
- 故障注入时,TRNG能否进入安全状态?
- 是否通过了NIST SP 800-22的15项测试?
最后说一句:TRNG设计没有捷径。每一个环节都要经过严格的验证。我见过太多芯片因为TRNG不过关而重新流片。记住,随机数发生器是安全芯片的基石,这块基石不稳,整个安全体系都是空中楼阁。
公众号:蓝海资料掘金营,微信deep3321