FPGA/ASIC真随机数生成器(TRNG)原理、实现与安全集成实战

张开发
2026/5/14 8:36:15 15 分钟阅读

分享文章

FPGA/ASIC真随机数生成器(TRNG)原理、实现与安全集成实战
1. 项目概述从“伪随机”到“真随机”的硬件之路那天翻看行业旧闻看到一篇2012年EE Times的文章标题是“How random is random?”作者Brian Bailey聊到了IP Cores Inc发布的一款真随机数生成器TRNGIP核。这个话题一下子戳中了我这个老工程师的神经。在数字世界里“随机”是个既基础又奢侈的概念。我们写代码、做验证、搞加密天天和随机数打交道但有多少人真正停下来想过我们用的那些rand()函数或者SystemVerilog里的$random到底有多“随机”尤其是在FPGA或者ASIC里当你的系统需要最高级别的安全密钥时你还能信任一个由确定性算法生成的“伪随机”种子吗这篇文章就像一颗石子扔进了十多年后的今天激起的涟漪依然值得我们深思。它探讨的核心是在硅片的世界里如何从物理层面“无中生有”地创造出真正的随机性尤其是针对那些资源受限、却又对安全性命攸关的嵌入式与片上系统SoC应用。简单来说这关乎信任的基石。无论是你的智能门锁、支付终端还是物联网设备间的通信其安全性的起点往往就是一个或一串随机数用作加密密钥的种子。如果这个起点可以被预测或重现那么建立在它之上的整个安全大厦就如同沙上筑塔。伪随机数生成器PRNG通过一个数学公式和初始种子seed产生数列只要种子相同序列就完全可复现——这对功能验证是福音但对密码学却是噩梦。因此真随机数生成器TRNG的价值就在于它的随机性源于不可预测、不可重现的物理过程例如半导体中的热噪声、振荡器的相位抖动等。文中提到的IP Cores公司声称其TRNG设计能在FPGA甚至标准单元ASIC中实现且无需后端物理设计的特殊处理这无疑勾起了所有硬件安全设计者的兴趣它到底是怎么做到的它的“随机”够“真”吗这篇文章我就结合自己多年在数字设计和安全领域的踩坑经验来一次深度的拆解和延伸。我们不只停留在概念讨论我会带你深入到TRNG常见的实现原理、关键指标以及在实际FPGA项目中集成此类IP时那些数据手册里不会写的注意事项和性能验证“骚操作”。无论你是正在为下一个安全芯片项目选型的架构师还是好奇如何在自己FPGA设计里增加一个可靠熵源的工程师抑或是单纯对硬件如何创造“混沌”感兴趣的技术爱好者相信这篇来自一线实战的总结都能给你带来实实在在的参考。1.1 核心需求解析为什么嵌入式系统如此渴求真随机在展开技术细节之前我们必须先厘清一个根本问题在资源往往捉襟见肘的嵌入式或SoC环境里为什么我们非得大费周章地去搞硬件TRNG而不是用一个精心设计的软件PRNG算法首先是种子危机。任何PRNG的质量都极度依赖于其初始种子。如果你用一个固定的值比如全0或者一个容易猜测的值如系统启动时间戳作为种子那么产生的整个密钥序列几乎是透明的。在嵌入式系统中获取高质量种子本身就是个难题。系统可能没有丰富的熵源如用户输入、网络事件。文中Brian Bailey也提到了有些方案会使用大气噪声或依赖工艺偏差但这些往往需要外部组件或特殊制造增加了复杂性和成本。其次是环境与攻击面。一个运行在通用CPU上的软件PRNG其状态种子和内部寄存器存在于系统内存中。在复杂的操作系统环境下它可能通过侧信道攻击如缓存计时攻击或内存扫描被窃取或污染。而一个设计良好的硬件TRNG其熵源和核心逻辑可以作为一个独立的、隔离的模块存在于芯片内部与软件运行环境物理隔离显著缩小了攻击面。再者是性能与确定性的悖论。在高性能加密操作中如一次性的会话密钥生成需要快速产生大量随机比特。纯软件的熵收集和随机数生成可能成为瓶颈。而硬件TRNG一旦启动通常能以稳定的速率提供随机比特流。另一方面在安全启动或设备唯一标识PUF等场景中需要的随机比特量不大但对“不可克隆性”和“唯一性”要求极高这更是硬件熵源的用武之地。所以TRNG的核心价值在于提供密码学意义上强健的随机性作为整个系统安全链的信任根。它不是要取代所有场景下的PRNG而是为PRNG提供那个至关重要的、不可预测的初始种子或者直接为最敏感的关键操作提供随机数。2. TRNG的实现原理硅片中的“混沌”引擎那么如何在规整、确定的数字电路中酿造“混沌”呢主流的硬件TRNG设计思路可以归结为利用并放大集成电路中固有的、微观的物理噪声。这些噪声在宏观上是随机的并且对于每一颗芯片、每一个瞬间都是独一无二的。2.1 主流熵源技术剖析常见的物理熵源主要有以下几类每种都有其优缺点和适用场景1. 基于环形振荡器Ring Oscillator, RO的抖动采样这是FPGA和ASIC中最常见、最易于集成的方案之一。其核心思想是利用奇数个反相器首尾相连构成一个环路产生自激振荡。但由于半导体材料的热噪声和电源噪声每个反相器的延迟并非恒定导致振荡周期存在随机抖动Jitter。典型实现设计两个频率接近但略有差异的环形振荡器RO A 和 RO B。用较慢的RO B的时钟边沿去采样较快RO A的信号。由于两者频率不成整数倍关系且各自存在抖动采样结果0或1在亚稳态区域附近表现出随机性。优点纯数字逻辑实现无需模拟模块移植性好。在FPGA中利用查找表LUT和布线资源即可搭建。缺点随机性质量对PVT工艺、电压、温度变化敏感需要后期处理电路如冯·诺依曼校正器或哈希函数来消除偏差。如果两个振荡器因耦合而同步会导致熵值下降。2. 基于亚稳态Metastability的仲裁器利用数字电路中D触发器在建立/保持时间窗口内采样数据时会进入亚稳态一种非0非1的中间状态最终稳定到0或1具有随机性的特性。典型实现将两个异步或同频但不同相的信号输入到一个仲裁电路如一个D触发器。当两个信号几乎同时到达时触发器的输出由内部微小的噪声和失配决定从而产生随机比特。优点电路极其简单。缺点比特生成速率低且需要精心设计以避免确定性输出。对路径延迟匹配要求高在实际芯片中受工艺偏差影响大。3. 基于电阻/二极管热噪声的模拟采样这是更接近物理本质的方法。直接放大一个高阻值电阻或二极管反向饱和电流产生的热噪声约翰逊-奈奎斯特噪声然后通过一个比较器与一个参考电压可以是另一个噪声源也可以是直流偏置进行比较输出随机比特流。优点理论上随机性质量很高熵源是基础物理现象。缺点需要模拟电路设计放大器、比较器对噪声敏感可能占用较大面积且功耗相对较高。在纯数字工艺的FPGA中难以原生实现通常需要外部分立元件或特殊的混合信号FPGA。4. 基于SRAM/PUF的上电状态严格来说这更多用于生成唯一密钥PUF但也可作为熵源。深亚微米工艺下SRAM单元在上电瞬间的初始状态由晶体管阈值电压的微小随机失配决定呈现出随机性。优点无需额外电路利用现有存储器。缺点通常只在第一次上电时具有较好随机性且需要复杂的后处理来应对环境变化。比特率低更适合生成静态种子。文中IP Cores公司提到的“内部熵源”且“无需特殊物理设计处理”极有可能采用的是基于环形振荡器抖动的增强型数字方案或者一种对工艺偏差不敏感的数字混沌电路设计。这类设计通过巧妙的电路结构将多个弱熵源如多个轻微不同的振荡器进行组合、交织再经过后处理能在标准数字流程下产出质量达标的随机数这正是其产品吸引人的地方。注意不要迷信“真随机”这个词。所有物理TRNG的输出都需要经过严格的健康测试和后处理以确保其统计特性符合标准如NIST SP 800-90B。一个未经测试的TRNG其输出可能包含可预测的偏差或固定模式比一个好的PRNG更危险。2.2 关键性能指标如何衡量“随机”的质量当我们评估或测试一个TRNG时不能光看它宣称的“真随机”必须关注以下几个硬指标熵值Entropy这是核心指标表示每个输出比特中所包含的“不确定性”的多少。理想情况下每个比特应提供1比特的熵。实际中由于偏差和相关性熵值会小于1。例如一个熵值为0.98 bits/bit的源意味着每输出100个比特大约包含98比特的“真随机”信息。比特率Bit RateTRNG每秒能产生多少随机比特。这取决于熵源物理过程和后处理电路的速度。高带宽加密应用需要高比特率Mbps级别而密钥生成可能只需要几kbps。统计测试通过率使用标准测试套件如NIST STS、Dieharder、TestU01对长序列的随机数进行测试。一个健康的TRNG应在所有或绝大多数测试项目中达标。切记这些测试主要用于检测明显的缺陷通过测试是必要条件而非充分条件。一个精心设计的PRNG也能通过这些测试。鲁棒性Robustness在变化的电压、温度、工艺角PVT下TRNG的熵值和统计特性是否能保持稳定。这是产品级TRNG IP的关键。抗攻击能力是否考虑了对抗性攻击例如攻击者通过注入电源噪声、外部时钟干扰或温度骤变试图影响或控制TRNG输出。好的设计应包含在线健康测试能实时监测熵源是否失效或遭受攻击。3. 在FPGA中集成TRNG的实战指南假设我们现在有一个FPGA项目需要集成一个TRNG模块来为AES加密引擎提供密钥种子。我们该如何操作以下是我从多次项目中总结出的步骤和心法。3.1 方案选择与IP评估首先根据项目需求选择TRNG实现方案纯FPGA逻辑实现使用环形振荡器或亚稳态仲裁器方案自己编写RTL。优点是灵活、零成本。缺点是设计、验证和稳定性调优耗时极长且结果难以保证风险高。仅适用于学习研究或对随机性要求不高的场景。使用FPGA厂商提供的硬核或软核IP如XilinxAMD的Zynq UltraScale MPSoC中的DRBG其种子来源于硬件TRNG或Intel FPGA的一些参考设计。优点是经过厂商验证与器件特性结合较好。缺点可能是灵活性受限或仅在高端器件中提供。使用第三方商业IP如文中提到的IP Cores Inc的产品。优点是通常提供全面的验证报告、性能数据和跨平台支持。缺点是需要授权费用。评估IP时务必向供应商索要或审查以下材料详细架构文档明确熵源原理、后处理算法如采用AES-CBC-MAC、SHA哈希或简单的异或链。全面的验证报告包括在不同PVT条件下的NIST测试结果、熵评估报告最好遵循NIST SP 800-90B标准。面积、功耗和性能数据在你的目标器件和工况下的预估数据。集成指南时钟、复位接口初始化序列状态标志如“随机数就绪”、“健康测试错误”等。在线健康测试方案了解其如何实现以及错误恢复机制。3.2 集成设计与验证要点一旦选定IP集成过程需格外小心1. 时钟与复位设计TRNG模块通常需要一个干净的、低抖动的时钟。避免使用经过复杂时钟网络或由动态配置的PLL产生的时钟以免引入相关性。复位信号必须稳定确保TRNG能完成完整的上电初始化序列。异步复位需做好同步释放处理。2. 接口与数据消费TRNG输出通常是一个“有效-数据”握手接口。消费逻辑如密钥生成模块必须能够及时读取数据避免FIFO溢出。如果TRNG比特率高于消费速率可以考虑增加一个缓冲FIFO但FIFO深度不宜过大以免随机数“老化”。关键技巧不要直接使用TRNG输出的原始比特作为密钥正确的做法是将TRNG输出作为一个高熵种子输入到一个密码学安全的确定性随机数生成器DRBG也称为PRNG如CTR_DRBG或HMAC_DRBG算法在NIST SP 800-90A中定义再由DRBG生成实际使用的密钥。这样做有两个好处一是可以按需快速产生大量随机数二是即使TRNG的输出在某个瞬间质量稍差经过DRBG的“搅拌”最终输出依然强健。3. 健康测试与故障处理必须实现IP提供的健康测试状态监控。通常TRNG内部会有“重复计数测试”检查连续相同的比特是否过多和“自适应比例测试”检查0和1的比例是否偏离预期太远。在顶层设计中需要定义一个清晰的故障处理策略。一旦健康测试报错系统应能安全地停止使用随机数停止加密操作并触发警报或进入安全状态如复位TRNG模块、切换至备份方案等。这个状态机要简单可靠。4. 后仿真与板级测试数字仿真对TRNG不友好因为仿真环境是确定性的。供应商通常会提供一个行为模型在仿真时输出预定义的测试序列。集成仿真主要验证接口逻辑和状态机是否正确。真正的考验在板级上电后你需要编写一个简单的测试固件连续读取大量TRNG输出例如数GB的数据将其保存到文件然后在PC上运行NIST测试套件。这是验证该TRNG在你特定板卡、特定环境温度、电源下性能的唯一可靠方法。实操心得板级测试时尝试给FPGA芯片吹热风或冷风观察随机数输出的统计特性是否发生剧烈变化。同时可以用示波器监测TRNG模块的电源纹波尝试注入轻微噪声看健康测试是否能及时告警。这些“破坏性”测试能增强你对模块鲁棒性的信心。3.3 一个简化的自研RO-TRNG设计示例与陷阱为了更深入理解我们来看一个极度简化的、用于教育目的的自研环形振荡器TRNG的Verilog描述并指出其中的陷阱// 注意这是一个高度简化的示例仅供原理说明不具备实际密码学强度 module simple_ro_trng ( input wire clk, // 系统时钟用于采样 input wire rst_n, // 异步复位低有效 output reg random_bit, // 输出的随机比特 output reg valid // 随机比特有效信号 ); // 两个环形振荡器用LUT和反相器构成实际中需要手动布局布线以避免被优化 wire ro_a_out, ro_b_out; // 模拟环形振荡器行为在实际中这是通过组合逻辑环路产生的真实振荡信号 // 此处为仿真用快速时钟分频模拟 reg [2:0] ro_a_counter, ro_b_counter; always (posedge clk or negedge rst_n) begin if (!rst_n) begin ro_a_counter 3b0; ro_b_counter 3b1; // 初始相位不同 end else begin ro_a_counter ro_a_counter 1; // 模拟~clk/8频率 ro_b_counter ro_b_counter 1; // 模拟~clk/8频率但存在微小差异 end end assign ro_a_out ro_a_counter[2]; // 取最高位作为振荡输出 assign ro_b_out ro_b_counter[2]; // 采样逻辑用RO B的边沿采样RO A reg ro_a_sampled; always (posedge ro_b_out or negedge rst_n) begin // 注意这是异步时钟域 if (!rst_n) begin ro_a_sampled 1b0; end else begin ro_a_sampled ro_a_out; end end // 将采样结果同步到系统时钟域并产生有效信号 reg ro_a_sampled_sync1, ro_a_sampled_sync2; always (posedge clk or negedge rst_n) begin if (!rst_n) begin ro_a_sampled_sync1 1b0; ro_a_sampled_sync2 1b0; valid 1b0; random_bit 1b0; end else begin ro_a_sampled_sync1 ro_a_sampled; // 第一级同步 ro_a_sampled_sync2 ro_a_sampled_sync1; // 第二级同步 valid (ro_a_sampled_sync2 ! random_bit); // 简单去重仅当值变化时才输出有效 random_bit ro_a_sampled_sync2; end end endmodule这个设计存在诸多严重问题恰恰是实战中的陷阱仿真无效ro_a_counter和ro_b_counter在仿真中是确定性的无法模拟真实的物理抖动。真实RO需要在综合时加(* keep true *)等属性防止优化并依赖实际门延迟。异步时钟域处理粗糙ro_b_out是异步时钟直接用于触发寄存器在实际硬件中可能导致亚稳态但这里我们恰恰希望利用亚稳态的随机性。然而后续的同步器可能会过滤掉这种随机性或引入新的问题。后处理过于简单仅通过“变化检测”来输出这只是一个最简单的去偏方法类似冯·诺依曼校正器效率极低丢弃大量比特且无法消除相邻比特间的相关性。无健康测试完全无法监测RO是否停止振荡或陷入同步状态。对PVT极度敏感两个RO的频率差可能因温度电压变化而改变导致采样点偏离亚稳态区域输出偏向0或1。这个例子旨在说明一个可用的TRNG设计远比看上去复杂。强烈建议在量产项目中使用经过验证的商业或开源IP。4. 常见问题、调试技巧与安全考量在实际集成TRNG的过程中你一定会遇到各种问题。下面是我总结的一些典型故障场景和排查思路问题1NIST测试套件多项不通过。可能原因A熵源后处理不足。原始熵源的偏差和相关性太强简单的后处理如单个异或或去偏无法消除。排查尝试获取TRNG原始熵源后处理前的数据进行测试。如果原始数据就很差可能是熵源设计问题或环境干扰。如果原始数据尚可但处理后变差需加强后处理例如采用密码学哈希函数如SHA-256对原始熵进行压缩和“搅拌”。可能原因B采样速率过快。熵源的物理噪声需要时间积累不确定性。如果采样时钟太快相邻采样点之间的噪声相关性会很强。排查降低采样时钟频率重新测试。观察通过率是否提高。这有助于确定熵源的有效带宽。可能原因C电源或时钟噪声干扰。共享的嘈杂电源或时钟会将确定性噪声耦合进熵源。排查在板级尝试为TRNG模块使用独立的线性稳压器LDO供电并使用独立的时钟晶振。检查PCB布局确保模拟/噪声敏感部分远离数字开关电源和高速数据线。问题2TRNG上电初期输出固定模式一段时间后才“随机”起来。可能原因初始化时间不足。物理噪声电路如振荡器需要时间达到稳定状态。后处理电路如熵累积池也需要填充足够的数据才能开始输出。解决查阅IP数据手册确保满足其规定的上电复位后的最小初始化等待时间。在设计中加入一个足够长的计时器在此期间不读取TRNG输出。问题3在极端温度下随机数质量下降。可能原因熵源特性随温度漂移。例如环形振荡器的频率随温度变化可能导致两个RO的频率关系发生变化影响采样点的随机性。解决这是衡量TRNG IP质量的关键。优秀的IP会通过自适应校准电路如动态调整RO的使能数量或采样相位来补偿PVT变化。在选型时务必审查供应商提供的在不同温度下的测试报告。安全考量超越功能正确性旁路攻击防护TRNG的功耗、电磁辐射是否与输出随机比特相关高级攻击可能通过分析这些旁路信息来推测密钥。一些安全级IP会包含对抗措施如内部使用恒定功耗逻辑或在输出前进行掩码。确定性故障攻击攻击者能否通过电压毛刺或时钟抖动使TRNG在特定时刻输出固定值如全0设计应包含传感器检测电源电压或时钟频率的异常偏离并锁定输出。后门风险这是使用第三方IP最敏感的问题。你需要评估供应商的可信度。对于最高安全等级的应用可能需要审查RTL代码或采用开源的、经过广泛审计的设计尽管这类设计较少。5. 总结与个人体会回顾从Brian Bailey那篇文章引发的思考到如今TRNG在安全芯片中的普及其核心挑战始终未变如何在确定性的硅基世界里经济、可靠地开采出物理世界的“混沌”金矿。经过多个项目的实践我个人最深刻的体会是将TRNG视为一个“模拟-数字混合系统”来对待尽管它可能完全由数字门电路实现。这意味着你需要像关心时序收敛一样去关心它的噪声环境、电源质量和温度稳定性。它的验证不能停留在RTL仿真必须包含大量的、在各种极端条件下的板级实测和数据统计分析。对于大多数项目我的建议是不要重复造轮子但要对轮子有透彻的理解。优先选择经过硅验证、有完备测试报告和成熟集成案例的TRNG IP。在集成过程中严格遵循供应商的指南并设计周全的监控和容错机制。同时一定要在自己的目标硬件上用标准测试套件进行验收测试这是确保安全性的最后一道也是最重要的一道关卡。最后记住TRNG只是安全拼图中的一块。一个强大的随机数源必须与安全的密钥管理、防篡改存储、以及无漏洞的加密算法实现相结合才能构建起真正坚固的安全防线。在硬件安全的世界里链条的强度取决于它最薄弱的一环而TRNG往往是这条链条的起点。确保它的坚实可靠是我们工程师对产品安全最基本的责任。

更多文章