2. 熵源类型详解:模拟熵源、数字熵源与混合熵源

做TRNG这么多年,我最大的体会就是:选对熵源,项目就成功了一半。很多人一上来就追着指标跑,结果发现噪声不够、偏差太大,最后只能推倒重来。今天咱们就把三种主流熵源掰开揉碎了讲清楚。

核心观点:没有完美的熵源,只有最适合场景的熵源。模拟源噪声纯但怕干扰,数字源好集成但质量参差,混合源取长补短但设计复杂。

TRNG 熵源分类体系 熵源 模拟熵源 数字熵源 混合熵源 电阻热噪声 环形振荡器 亚稳态采样 RO-PUF 模拟+数字组合 选择原则:安全等级要求 → 芯片工艺 → 面积功耗预算 → 量产一致性 没有万能方案,只有最合适的权衡

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 混合熵源:取长补短

混合熵源就是把模拟源和数字源结合起来。为什么要这么做?因为单一熵源总有短板:模拟源怕干扰,数字源熵率低。混合起来就能互相弥补。

常见的混合方案有两种:

  1. 串联混合:模拟源产生原始随机序列,数字源做后处理(比如Von Neumann校正、哈希提取)。这是最常用的方案。
  2. 并联混合:模拟源和数字源各自产生随机数,然后通过异或(XOR)合并。这样即使其中一个源被攻击,另一个还能保证安全性。

我在一个金融安全终端项目里用了并联混合方案。模拟端用电阻热噪声,数字端用亚稳态采样。两个源的输出经过一个FIFO缓冲后做XOR合并。最终通过NIST SP 800-22全部15项测试,而且通过了AIS-31的在线测试要求。

混合方式 优势 劣势 适用场景
串联(模拟→数字后处理) 熵率高、实现简单 后处理可能引入确定性 通用TRNG、安全芯片
并联(模拟⊕数字) 抗攻击性强、冗余设计 面积功耗翻倍 金融安全、国防应用
反馈混合(数字控制模拟) 自适应校准、鲁棒性好 设计复杂、验证困难 高端FPGA、可重构TRNG

最后说一句:混合熵源不是简单的"1+1"。你得考虑两个源的速率匹配问题。如果模拟源每秒产生1Mbit,数字源只有100kbit,那XOR之后的有效熵率会被数字源拖累。我一般会在数字源后面加一个速率匹配FIFO,或者用可编程分频器来对齐。

总结一下我的选型建议:

  • 追求最高安全性 → 模拟热噪声 + 强后处理
  • 追求低成本集成 → 亚稳态采样 + 在线健康检测
  • 追求抗攻击能力 → 并联混合熵源
  • 追求量产一致性 → RO-PUF + 温度补偿