3. 真随机数发生器(TRNG)设计
真随机数发生器,简称TRNG,是安全芯片的“心脏起搏器”。
为什么这么说?你想想看,密钥生成、签名、认证协议,哪个环节离得开随机数?如果随机数能被预测,那整个安全体系就形同虚设。伪随机数发生器(PRNG)虽然快,但它是确定性的——只要知道种子,就能复现整个序列。TRNG不一样,它从物理过程中提取熵,比如热噪声、时钟抖动、混沌电路。说白了,TRNG产生的数,连芯片自己都不知道下一个会是什么。
3.1 TRNG原理
TRNG的核心是“熵源”。熵源来自物理世界的随机现象。我习惯把TRNG分成三部分:
- 熵源:产生原始随机信号,比如热噪声、振荡器抖动。
- 采样与量化:把模拟的随机信号转成数字比特流。
- 后处理:去除偏差,提高统计质量,比如用冯·诺依曼校正器或哈希函数。
嗯,这里要注意:熵源的质量直接决定TRNG的安全性。如果熵源不够“乱”,后处理也救不回来。我在项目中遇到过,有人用简单的环形振荡器做熵源,结果输出序列有明显的周期性——说白了,就是熵不够。
核心指标:
- 熵率:每比特携带的随机信息量,理想值为1。
- 吞吐率:每秒能产生多少随机比特。
- 鲁棒性:对工艺、电压、温度(PVT)变化的容忍度。
3.2 基于振荡器的TRNG
这是最经典的TRNG结构。原理很简单:利用振荡器的相位噪声(jitter)作为熵源。
具体做法:两个振荡器,一个慢速,一个快速。慢速振荡器作为采样时钟,快速振荡器作为被采样信号。由于慢速时钟的边沿位置受jitter影响,每次采样到的快速振荡器周期数会随机变化。
我个人习惯用这种结构做低成本TRNG。它面积小,功耗低,适合IoT芯片。但有个坑:振荡器容易受电源噪声和温度影响。我曾经调试过一款芯片,高温下jitter变小,随机性急剧下降。后来加了稳压器和温度补偿,才算搞定。
避坑指南:
我曾经在28nm工艺上设计过环形振荡器TRNG。一开始直接用了标准单元的反相器链,结果后仿发现输出有偏。后来改成电流饥饿型振荡器,通过调节偏置电流控制振荡频率,jitter特性好了很多。
// 简单的振荡器TRNG Verilog模型
module osc_trng (
input clk_slow, // 慢速采样时钟
input rst_n,
output reg rnd_bit
);
wire osc_fast; // 快速振荡器输出
// 快速振荡器:奇数个反相器环
assign osc_fast = ~osc_fast; // 实际需要延迟单元
always @(posedge clk_slow or negedge rst_n) begin
if (!rst_n)
rnd_bit <= 1'b0;
else
rnd_bit <= osc_fast; // 采样快速振荡器
end
endmodule
3.3 基于混沌的TRNG
混沌电路是另一种有趣的熵源。混沌系统对初始条件极度敏感——微小的差异会指数级放大。你想想看,这天然就是随机数的好材料。
常见的混沌TRNG基于混沌映射,比如Logistic映射、Bernoulli映射。在电路层面,可以用开关电容电路或跨导放大器实现混沌振荡器。
我记得有一次评估一个混沌TRNG方案。它的优点是熵率高,一个周期就能产生多个随机比特。但缺点是电路复杂,对工艺偏差敏感。说白了,混沌TRNG更适合高性能场景,比如服务器安全芯片。
注意事项:
混沌TRNG的初始条件需要精心设计。如果初始状态落在混沌吸引子的“窗口”内,输出可能退化为周期序列。我建议在设计中加入自检电路,实时监测输出熵率。
3.4 TRNG在安全协议中的应用
TRNG在安全协议中无处不在。我挑几个典型的场景说说。
3.4.1 密钥生成
无论是对称密钥(AES)还是非对称密钥(RSA、ECC),密钥都必须随机生成。TRNG提供种子,PRNG负责扩展。但注意:如果TRNG熵不够,密钥空间会缩小,攻击者可以暴力破解。
3.4.2 挑战-响应协议
在身份认证中,服务器发送一个随机挑战(challenge),设备用密钥加密后返回响应。挑战必须是一次性的、不可预测的。TRNG就是生成挑战的最佳选择。
3.4.3 掩码与防护
在抗侧信道攻击中,TRNG用于生成掩码。比如在AES的S盒计算中,用随机掩码掩盖中间值,让功耗和电磁辐射与真实数据无关。
实际案例:
我在设计一款金融安全芯片时,TRNG同时服务于三个模块:密钥管理、交易签名、以及抗DPA(差分功耗分析)掩码。当时最头疼的是资源冲突——三个模块同时请求随机数,TRNG吞吐不够。后来加了FIFO缓冲和优先级仲裁,才算解决。
3.5 知识体系结构图
下面这张图概括了TRNG设计的核心逻辑。从熵源到后处理,再到安全协议应用,一条线串起来。
3.6 总结与经验
TRNG设计,说白了就是跟“不确定性”打交道。你越想控制它,它越不听话。我做了十几年芯片,最大的体会是:
- 熵源要冗余:别只依赖一种物理现象。多源融合更可靠。
- 后处理要保守:宁可降低吞吐,也要保证输出无偏。
- 测试要全面:NIST SP 800-22、Diehard测试,一个都不能少。
个人建议:
如果你刚开始设计TRNG,先从振荡器结构入手。它简单、可控,适合练手。等摸透了jitter的特性,再挑战混沌TRNG。记住:安全芯片里,TRNG不是功能模块,它是信任的基石。