2. 熵源类型详解:模拟熵源、数字熵源与混合熵源
做TRNG这么多年,我最大的体会就是:选对熵源,项目就成功了一半。很多人一上来就追着指标跑,结果发现噪声不够、偏差太大,最后只能推倒重来。今天咱们就把三种主流熵源掰开揉碎了讲清楚。
核心观点:没有完美的熵源,只有最适合场景的熵源。模拟源噪声纯但怕干扰,数字源好集成但质量参差,混合源取长补短但设计复杂。
2.1 模拟熵源:最纯粹的随机性
模拟熵源,说白了就是直接利用物理世界的随机噪声。这类源产生的随机性最"天然",但也是最难伺候的。
2.1.1 电阻热噪声
电阻里的电子在热运动下会随机碰撞,产生一个宽频带的噪声电压。这个噪声的功率谱密度是平坦的——理论上从DC到太赫兹都一样强。我当年第一次用示波器看热噪声波形时,那种"毛茸茸"的感觉至今记忆犹新。
实战技巧:电阻热噪声的幅度很小,典型值在微伏量级。你需要一个低噪声放大器把它放大到几百毫伏才能采样。我建议用两级放大:第一级用超低噪声运放(比如AD797),第二级用普通运放做增益调整。
关键参数就两个:
- 噪声功率:Pn = 4kTRB,其中k是玻尔兹曼常数,T是绝对温度,R是电阻值,B是带宽
- 信噪比:热噪声的"信号"就是噪声本身,所以SNR=0dB——这反而是好事,说明没有确定性成分
我在一个车规项目中用过这种方案。当时客户要求通过AEC-Q100认证,温度范围-40°C到125°C。你想想看,温度变了,噪声功率也跟着变。最后我们加了一个温度补偿电路,才把输出熵率稳定住。
避坑指南:我曾经因为PCB布局不当,把电源纹波耦合进了热噪声放大链路。结果采集出来的数据有明显的50Hz周期性分量,NIST测试死活过不了。后来加了屏蔽罩和π型滤波才解决。记住:模拟熵源对PCB布局极其敏感,电源和地平面必须干净。
2.1.2 环形振荡器
环形振荡器(RO)是另一种常见的模拟熵源。它由奇数个反相器首尾相连构成,输出一个方波。但为什么方波会有随机性呢?
原因在于:每个反相器的传播延迟不是固定的。晶体管沟道里的载流子运动、热噪声、闪烁噪声都会让延迟产生微小抖动(jitter)。这些抖动累积起来,就会让振荡器的周期产生随机波动。
我习惯把RO熵源分成两类:
| 类型 | 结构 | 熵率 | 典型应用 |
|---|---|---|---|
| 自由振荡型 | 奇数级反相器环 | 中等(~10-100 kbps) | 低成本MCU内置TRNG |
| 差分延迟型 | 两个RO+相位比较 | 较高(~100 kbps-1 Mbps) | FPGA实现、安全芯片 |
自由振荡型最简单,但有个问题:它的振荡频率会随工艺角和温度漂移。我记得有一次流片回来,同一批芯片的RO频率差了30%。后来我们加了频率锁定环(FLL)才把偏差控制在5%以内。
2.2 数字熵源:集成友好的选择
数字熵源完全用标准单元库搭建,不需要模拟IP。这对SoC集成来说太友好了——你不需要额外的工艺步骤,也不需要模拟设计工程师。但代价是什么?随机性质量通常不如模拟源。
2.2.1 亚稳态采样
这个原理很有意思。当一个D触发器的建立/保持时间被违反时,它会进入一个"中间状态"——既不是0也不是1。最终它会随机地塌缩到0或1。这个塌缩过程受热噪声驱动,所以结果是随机的。
但这里有个坑:亚稳态的塌缩不是完全均匀的。如果触发器的内部电路有偏移(offset),它会更倾向于塌缩到某一侧。我见过一个极端案例:某款FPGA的触发器偏移太大,导致输出偏差达到0.6/0.4,完全没法用。
解决方案:用两个触发器做"亚稳态检测+采样"的级联结构。第一个触发器故意违反时序产生亚稳态,第二个触发器在足够长的时间后采样稳定结果。这样可以把偏移影响降到最低。
代码实现其实很简单:
// 亚稳态熵源核心电路(Verilog描述)
module metastable_entropy(
input clk,
input rst_n,
output reg random_bit
);
wire async_signal;
reg meta_flop, sample_flop;
// 故意产生异步信号
assign async_signal = ~async_signal; // 自由振荡
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
meta_flop <= 1'b0;
sample_flop <= 1'b0;
end else begin
meta_flop <= async_signal; // 这里必然违反建立时间
sample_flop <= meta_flop; // 等一个周期再采样
end
end
always @(posedge clk) begin
random_bit <= sample_flop;
end
endmodule
注意:上面的代码在综合时一定要关掉hold time fixing。我曾经忘了加约束,工具自动插了缓冲器把亚稳态"修复"了——结果输出全是0,排查了两天才发现。
2.2.2 RO-PUF
RO-PUF(环形振荡器物理不可克隆函数)本质上是用工艺偏差来产生随机性。同一片晶圆上,不同位置的RO频率会有细微差异——这个差异就是熵的来源。
具体做法是:在芯片上放N个相同的RO,两两比较频率。频率高的输出1,低的输出0。因为每个芯片的工艺偏差是随机的,所以每个芯片的"频率指纹"都是独一无二的。
但RO-PUF有个致命弱点:环境敏感性。温度和电压变化会改变所有RO的频率,但改变量不是完全一致的。我做过一个实验:把芯片从25°C加热到85°C,RO-PUF的输出有12%的位发生了翻转。这在TRNG里是不能接受的。
我的改进方案:用差分比较代替绝对比较。把RO分成两组,每组内部做差分,然后比较两个差分的值。这样共模的温度/电压变化会被抵消,输出稳定性大幅提升。
2.3 混合熵源:取长补短
混合熵源就是把模拟源和数字源结合起来。为什么要这么做?因为单一熵源总有短板:模拟源怕干扰,数字源熵率低。混合起来就能互相弥补。
常见的混合方案有两种:
- 串联混合:模拟源产生原始随机序列,数字源做后处理(比如Von Neumann校正、哈希提取)。这是最常用的方案。
- 并联混合:模拟源和数字源各自产生随机数,然后通过异或(XOR)合并。这样即使其中一个源被攻击,另一个还能保证安全性。
我在一个金融安全终端项目里用了并联混合方案。模拟端用电阻热噪声,数字端用亚稳态采样。两个源的输出经过一个FIFO缓冲后做XOR合并。最终通过NIST SP 800-22全部15项测试,而且通过了AIS-31的在线测试要求。
| 混合方式 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| 串联(模拟→数字后处理) | 熵率高、实现简单 | 后处理可能引入确定性 | 通用TRNG、安全芯片 |
| 并联(模拟⊕数字) | 抗攻击性强、冗余设计 | 面积功耗翻倍 | 金融安全、国防应用 |
| 反馈混合(数字控制模拟) | 自适应校准、鲁棒性好 | 设计复杂、验证困难 | 高端FPGA、可重构TRNG |
最后说一句:混合熵源不是简单的"1+1"。你得考虑两个源的速率匹配问题。如果模拟源每秒产生1Mbit,数字源只有100kbit,那XOR之后的有效熵率会被数字源拖累。我一般会在数字源后面加一个速率匹配FIFO,或者用可编程分频器来对齐。
总结一下我的选型建议:
- 追求最高安全性 → 模拟热噪声 + 强后处理
- 追求低成本集成 → 亚稳态采样 + 在线健康检测
- 追求抗攻击能力 → 并联混合熵源
- 追求量产一致性 → RO-PUF + 温度补偿