第三章:真随机数发生器(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做后处理,我比较推荐
💡 我的推荐: 对于FIPS 140-3级别的应用,直接用SHA-256做后处理。虽然面积大一点,但安全性有保障。我曾经在项目中用LFSR后处理,结果NIST测试的某些子项总是擦边过,换成SHA-256后一次通过。

后处理的代码示例(伪代码):

// 冯·诺依曼校正器实现
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必须包含两种检测:

  1. 启动检测(Startup Tests):上电时验证TRNG功能正常
  2. 连续检测(Continuous Tests):运行时持续监控输出质量

连续检测通常包括:

  • 重复计数检测:检查是否有连续相同的比特
  • 自适应比例检测:统计窗口内的0/1比例
  • 游程检测:检查连续相同比特的长度分布
🔧 实战技巧: 健康检测的阈值设置很关键。太严了容易误报,太松了又漏报。我一般把阈值设为理论值的3倍标准差。比如重复计数,理论上1024比特中最多连续10个相同,我就设阈值为30。这样既不会误报,又能检测到异常。

我曾经遇到过一个案例:芯片在低温下,振荡器频率变慢,导致采样率下降。健康检测发现重复计数超标,自动触发了复位。虽然影响了用户体验,但保证了安全性。嗯,这就是健康检测的价值——宁可误报,不可漏报。

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架构,已经在三款芯片中验证过:

TRNG完整架构图 熵源模块 环形振荡器 热噪声放大 采样模块 D触发器采样 时钟管理 后处理模块 SHA-256提取 冯·诺依曼校正 输出 在线健康检测 重复计数检测 自适应比例检测 监控信号 报警/复位 图:TRNG核心架构,包含熵源、采样、后处理和健康检测四大模块 健康检测实时监控采样输出,异常时触发后处理复位

这个架构的关键在于:健康检测模块独立于主数据路径。它有自己的电源和时钟域,即使主路径被攻击,检测模块还能正常工作。我管这叫"看门狗架构"——让一个简单的电路去监控复杂的电路。

📌 设计检查清单:
  • 熵源是否做了差分设计?
  • 后处理是否用了NIST批准的算法?
  • 健康检测是否覆盖了启动和连续两种模式?
  • 故障注入时,TRNG能否进入安全状态?
  • 是否通过了NIST SP 800-22的15项测试?

最后说一句:TRNG设计没有捷径。每一个环节都要经过严格的验证。我见过太多芯片因为TRNG不过关而重新流片。记住,随机数发生器是安全芯片的基石,这块基石不稳,整个安全体系都是空中楼阁。


公众号:蓝海资料掘金营,微信deep3321