PUF模拟实战:用行为级Verilog建模APUF并验证唯一性与可靠性

发布时间:2026/10/14 2:37:05
PUF模拟实战:用行为级Verilog建模APUF并验证唯一性与可靠性 简介基于Python的PUF物理不可克隆函数模拟项目面向物联网安全、硬件安全与密码学方向的学习者旨在通过纯软件方式还原PUF的挑战-响应机制与随机不可克隆特性尤其适合在没有专用硬件的情况下开展原型验证与教学实验。压缩包共33个文件以29个Python脚本为主辅以json、txt、js及gitignore整体仅73KB属于轻量级教学原型。脚本模块覆盖线性回归、ANN、GAN等多种模型并实现PUF创建、挑战生成、响应计算、熵与FHD指标计算、攻击模拟及数据库验证等环节目录结构清晰便于按需调用。模拟中利用随机数生成器刻画芯片制造差异通过哈希算法保证应答不可逆同时引入错误容限与稳健性测试以贴近真实场景。目前已有499人学习下载。项目配有数值计算、数据处理和可视化工具可帮助读者系统理解PUF从输入挑战到输出响应的完整流程并为后续硬件实现提供可运行的算法参考。1. PUF_模拟在仿真阶段把物理随机指纹验明白拿到“PUF_模拟”这个任务大多数人第一反应是问物理不可克隆函数Physical Unclonable Function不是要流片之后才能测吗模拟能模拟出什么实际上PUF_模拟解决的是安全芯片、物联网设备和密钥生成方案里最头疼的一环如何在没流片、没上板之前就把PUF的随机性、唯一性、稳定性验证到位。本文会用行为级Verilog建模APUF仲裁器PUF带你完整跑通从CRP采集到唯一性/可靠性指标计算的全流程并给出5个最常见的翻车点。适合做安全认证、硬件信任根、密钥派生的工程师也适合想搞懂PUF到底是什么的验证岗同学。2. 先立住PUF原理CRP模型、延迟偏差与三类PUF结构怎么选PUF不是密码算法它靠的是芯片制造过程中的物理偏差而不是数学难题。这一章把原理讲透后面建模、选参数、分析指标才有依据。2.1 工艺偏差怎么变成数字指纹从晶体管到仲裁器芯片制造中掺杂浓度、氧化层厚度、栅极线宽、金属层刻蚀都会有随机波动。这些波动在数字电路里通常被当成时序余量的一部分设计人员恨不得越小越好。PUF反过来利用它同样一张版图两颗晶圆上造出来的芯片内部延迟、阈值电压、SRAM上电状态都不一样。这种差异无法通过后期编程模拟也无法克隆所以叫“物理不可克隆”。把物理偏差变成0/1输出常见的手段有三类延迟型PUFAPUF是最典型代表让同一个脉冲走两条对称但结构不同的路径路径由挑战输入决定到达先后由仲裁触发器判决输出1或0。路径上的每级延迟都由工艺偏差决定挑战输入负责选择“怎么绕路”。存储型PUFSRAM PUF最著名利用SRAM单元上电时的不确定状态。每个单元在电源爬升瞬间随机落入0或1但同一颗芯片每次上电基本保持同一倾向。振荡型PUFRO-PUF用环形振荡器的频率差做随机源。两个结构完全相同的振荡器频率理论上一致实际会因工艺偏差产生可测的频率差比较频率输出比特。APUF是PUF_模拟最合适的切入点原因有三结构规则适合行为级建模挑战-响应对CRP数量随级数指数增长便于做统计验证仿真工具里延迟参数好控制方便做温度、电压的参数扫描。2.2 CRP模型与理想PUF假设唯一性、可靠性、不可预测性PUF的外在接口是挑战-响应对。给芯片一个挑战输入CPUF内部物理结构决定了一个响应R记为R PUF(C)。这个映射不是靠查表实现的而是靠物理结构自然产生的所以理想情况下攻击者即使拿到一片PUF芯片也无法根据已知的CRP推断未知CRP更无法再造一颗“功能相同”的芯片。工程上把理想PUF归纳成三个可测性质唯一性不同芯片对同一挑战的响应应该明显不同。量化指标是片间汉明距离Inter-chip Hamming Distance理想值是50%。如果两颗芯片的响应过于相似说明它们的工艺偏差相关性太强或者是后端的系统性偏差主导了响应比如布线和封装应力。可靠性同一芯片在不同时间、温度、电压下对同一挑战的响应应该保持一致。量化指标是片内汉明距离Intra-chip Hamming Distance或比特误码率理想值是0%。实际工程里要求BER小于5%密钥生成场景更严格通常要求小于1%。不可预测性给定一定数量的CRP攻击者无法预测未知挑战对应的响应。这个性质在仿真里只能间接验证比如观察响应是否通过随机性测试或者尝试用线性回归建模APUF看预测准确率有没有显著高于50%。这三个指标不只是在芯片成品上测仿真阶段就应当先跑通。原因很直接如果行为模型的统计特性都不满足“唯一性50%、可靠性接近0”那流片出来大概率只会更差。2.3 行为级模拟、电路级仿真与FPGA原型该选哪条路PUF_模拟里的“模拟”在工程实践中至少对应三种不同深度的手段很多人第一轮就选错电路级仿真SPICE类。给MOS管模型加工艺角偏差参数跑瞬态仿真能精确看到仲裁器在两条路径竞争时的亚稳态行为。代价是速度极慢。一个8级APUF加完整寄生参数单次仿真上电就是毫秒级跑几千组CRP几乎不可能。适合在确定PUF单元版图时做小规模验证不适合做统计。行为级Verilog仿真。用数字延迟参数模拟路径延迟差用寄存器比较模拟仲裁判决一个时钟周期就能输出一个响应。速度比SPICE快几个数量级可以做上千组CRP的蒙特卡洛统计。代价是忽略了亚稳态窗口、噪声、温度梯度這些模拟行为。这正是第3章要实现的方案适合系统级验证和算法设计。FPGA原型验证。用真实逻辑单元的布线延迟当随机源速度最快也能真实验证稳定性。但FPGA上APUF的响应很大程度由布线延迟决定而不是晶圆工艺偏差所以FPGA验证结果和ASIC流片结果差别较大需要特殊约束才能拉近。我的建议是设计早期用行为级模型跑统计指标确定PUF结构和参数范围单元定型后补一轮电路级仿真验证仲裁器时序上板验证放最后并且明确区分“FPGA上的PUF”和“真实芯片上的PUF”的差异。下面的内容默认带你走行为级仿真这条主线。3. 用Verilog搭一个APUF行为模型仿真平台与激励设计这一章是全文的动手核心。目标是花一小时左右在任意支持Verilog的仿真工具里跑出一个能输出CRP列表的APUF行为模型。代码不可综合这是刻意的——行为模型的任务是验证PUF的逻辑行为和统计特性不是交给综合工具做网表。3.1 为什么模拟对象先选APUF结构简单、CRP数量可控APUF的建模思路一句话把两条延迟路径的累计延迟差算出来差为正输出1差为负输出0。挑战向量的每一位控制一个“交换开关”挑战位为1时信号在两条路径之间交叉挑战位为0时保持直通。这样一来每一组挑战向量都会让信号走出一组不同的路径组合累计延迟差也随之变化。假设级数为N挑战向量有N位那么可用的挑战数量是2^N。8级APUF就有256组挑战跑一轮仿真毫秒级完成。16级则有65536组全部遍历也就几十秒。这个规模做统计足够又不会让仿真时间失控。实际芯片里的APUF每级延迟差可能只有几十皮秒仲裁器必须在皮秒量级分辨路径快慢。行为模型不需要关心绝对值只需要让延迟差分布合理、训练集统计结果符合预期即可。3.2 APUF行为模型延迟差表与仲裁判决的Verilog实现下面给出一个8级APUF的行为模型。它的核心逻辑是三件事初始化延迟表、按挑战位累加延迟差、在时钟沿做出仲裁判决。// APUF行为级仿真模型8级延迟链 仲裁输出 // 不可综合仅用于CRP统计与指标验证 timescale 1ns / 1ps module apuf_behavior #( parameter STAGES 8, parameter SEED 1 )( input wire clk, input wire rst_n, input wire [STAGES-1:0] challenge, output reg response_out ); // 两条路径的级间延迟用随机数模拟工艺偏差 integer delay_a [0:STAGES-1]; integer delay_b [0:STAGES-1]; integer acc_a, acc_b; integer k; // 固定种子同一SEED代表同一颗PUF实例不同SEED代表不同芯片 initial begin $srandom(SEED); for (k 0; k STAGES; k k 1) begin delay_a[k] 10 ($random % 7); delay_b[k] 10 ($random % 7); end end // 仲裁判决上升沿计算两条路径累计延迟并比较 always (posedge clk or negedge rst_n) begin if (!rst_n) begin acc_a 0; acc_b 0; response_out 1b0; end else begin // 阻塞赋值先算组合逻辑结果 acc_a 0; acc_b 0; for (k 0; k STAGES; k k 1) begin if (challenge[k] 1b1) begin // 挑战位1路径交叉 acc_a acc_a delay_a[k]; acc_b acc_b delay_b[k]; end else begin // 挑战位0路径直通 acc_a acc_a delay_b[k]; acc_b acc_b delay_a[k]; end end // 非阻塞赋值输出仲裁结果 response_out (acc_a acc_b) ? 1b1 : 1b0; end end endmodule逻辑说明delay_a和delay_b数组分别代表两条物理路径上每一级的传输延迟。在真实芯片里这两组延迟差是制造时就固定的任何时序分析工具都无法改变它。行为模型用$random生成它们并用SEED区分不同实例。参数说明STAGES控制级数8级的CRP空间是25616级是65536。SEED是关键参数——要验证“不同芯片”就改SEED再跑一轮仿真要验证“同一芯片在不同条件下”保持SEED不变并调整温度参数。delay的基准值10和波动范围7可以调到更贴近真实时序的比例但统计结论不依赖具体数值。注意$srandom是仿真器内置函数主流仿真工具都支持。如果工具报错可以改成$random(SEED)但要注意不同工具的随机序列差异这会影响复现建议单点固定seed之后不要随意更换工具版本。3.3 Testbench与CRP激励固定种子、逐拍激励、落盘存档有了行为模型还需要一个激励环境来遍历挑战向量并记录响应。Testbench里同时例化两个不同SEED的APUF实例这样后文算片间汉明距离时不需要重新跑一遍仿真。timescale 1ns / 1ps module tb_apuf; reg clk, rst_n; reg [7:0] challenge; reg [7:0] challenge_b; wire resp_a, resp_b; // 两个实例SEED不同代表不同PUF芯片 apuf_behavior #(.STAGES(8), .SEED(1)) u_a ( .clk(clk), .rst_n(rst_n), .challenge(challenge), .response_out(resp_a) ); apuf_behavior #(.STAGES(8), .SEED(2)) u_b ( .clk(clk), .rst_n(rst_n), .challenge(challenge_b), .response_out(resp_b) ); // 时钟与复位 initial begin clk 0; rst_n 0; #20 rst_n 1; end always #5 clk ~clk; integer i; integer f; initial begin f $fopen(crp_table.txt, w); (posedge rst_n); #20; for (i 0; i 256; i i 1) begin challenge i[7:0]; challenge_b i[7:0]; // 等待仲裁结果稳定一个时钟周期 #20; $fdisplay(f, %h %b %b, challenge, resp_a, resp_b); end $fclose(f); $finish; end endmodule逻辑说明每一拍给两个实例喂相同的挑战向量然后把两个响应同时写进crp_table.txt。文件每行三列挑战值、实例A响应、实例B响应。这个表格就是后续所有统计分析的数据源。参数说明时钟周期10ns是随便给的行为模型没有真实的路径延迟约束时钟只起到触发判决的作用。两个实例的SEED分别固定为1和2保证多次仿真结果可复现。如果你要采集多颗“芯片”的数据就增加例化数量并修改SEED。采集到的响应数量等于挑战数量。8级时只有256行做统计略显单薄建议至少用16级APUF收集65536组CRP后续所有指标会更平滑。3.4 仿真参数怎么设级数、延迟差、判决时刻、噪声注入行为模型的参数不是随便填的它需要反映目标工艺的大致特征。以下是我常用的参数设定逻辑级数STAGES决定CRP空间和路径长度。8级适合快速跑通流程16级适合正式统计20级以上的APUF在行为模型里跑一次全遍历要几分钟收益却很低。如果目标场景需要大量CRP优先考虑XOR级联结构而不是无限加级数。延迟差基准值决定唯一性分布。delay_a和delay_b的取值范围如果完全一致且对称那么acc_a acc_b的概率天然接近50%这符合理想PUF的假设。如果希望模拟“有偏芯片”可以给delay_a整体加一个偏置比如delay_a[k] 10 ($random % 5)而delay_b[k] 15 ($random % 5)这样响应会明显偏向0或1后文可以观察汉明重量偏离50%的现象。判决时刻要避开组合逻辑的毛刺。Testbench里等20ns再采样目的就是让仲裁结果完全稳定。真实PUF里仲裁器两侧信号可能几乎同时到达判决结果落在亚稳态窗口内行为模型没法体现这个限制放到第5章避坑部分详细讲。噪声注入是可靠性仿真最关键的参数。行为模型本身是确定性的同一SEED同一挑战的响应永远一样。为了模拟温度和电压波动可以引入一个随机的延迟抖动叠加到acc上比如在仲裁比较前加一个TX_NUM噪声参数它的表现就是BER上升。在第4章的可靠性计算里会给出具体实现。// 在仲裁比较前加入噪声扰动用于可靠性仿真 // 改动位置在3.2模块的always块末尾 // 增加一个参数 NOISE_LEVEL 0表示无噪声 if (acc_a noise_val acc_b) begin response_out 1b1; end else begin response_out 1b0; end参数含义NOISE_LEVEL取0时模拟理想无噪声环境取1~3时模拟电源电压波动或温度变化带来的延迟抖动。noise_val可以用$random再生成一次但要注意同一SEED的响应复现性问题——建议固定一个独立种子给噪声保证可靠性测试可重复。这里有一个常见的认知偏差要提前说行为模型的噪声参数是人为加进去的它的统计结果只能证明“这套CRP采集和指标计算流程是否正确”不能代表真实芯片的BER。真实PUF的可靠性测试只能靠上板后在温箱里跑。仿真阶段的可靠性分析用于选型和设计评审价值在于提前暴露流程问题。4. 从仿真输出到质量指标唯一性与可靠性的计算流程这一章把crp_table.txt变成三个可汇报的数字片间汉明距离、片内汉明距离、汉明重量。每个指标都对应用户文档里的某一行验收标准。为了避免“仿真一时爽汇报火葬场”建议每一步都用脚本固化下来。4.1 把CRP记录解析成可分析的表格仿真输出的文本第一眼都很规整但真实项目里可能混有警告信息、重复采样、甚至仿真中断留下的残缺行。写脚本时先做数据清洗只保留完整三列的行。# parse_crp.py # 读取crp_table.txt返回挑战-响应对列表 def load_crp(path): crps [] with open(path, r) as f: for line in f: line line.strip() if not line: continue parts line.split() if len(parts) ! 3: continue challenge int(parts[0], 16) resp_a int(parts[1], 2) resp_b int(parts[2], 2) crps.append((challenge, resp_a, resp_b)) return crps逻辑说明以空格切分每行跳过空行和不完整行。挑战按十六进制解析响应按二进制解析。返回的结构是(挑战, 实例A响应, 实例B响应)的列表后续所有指标都从这个列表派生。参数说明如果你的Testbench里写的是多位响应拼接成一个整数这里解析方式要对应调整。行为模型输出的响应位需要用二进制解析十六进制会引入解析错误。4.2 片间汉明距离两个PUF实例怎么才算“互不相同”片间汉明距离Inter-chip HD衡量两组响应中相异比特的比例。理想值是50%表示两个实例对同一挑战有接近半数的响应不同。# inter_chip_hd.py def inter_chip_hd(crps): total len(crps) diff sum(1 for _, ra, rb in crps if ra ! rb) return diff / total if total 0 else 0.0 crps load_crp(crp_table.txt) print(Inter-chip HD {:.2f}%.format(inter_chip_hd(crps) * 100))运行一次8级APUF的行为模型这个值通常落在40%到60%之间。如果稳定偏离这个区间说明延迟差的分布不合理或挑战激励没有覆盖全部路径组合。低于40%时先检查delay_a和delay_b的取值是否过于接近比如两者都固定为10那任何挑战下acc_a和acc_b几乎相等仲裁结果趋近于固定值唯一性自然撕裂。补充片间汉明距离理论期望值50%的前提是每比特响应独立且等概率。APUF的行为模型在延迟差分布对称时满足这个假设但如果仲裁阈值有偏唯一性会同时下偏。看到唯一性差时先不要怀疑随机数质量优先检查阈值对称性。4.3 片内汉明距离与误码率温度循环下的稳定性判定片内汉明距离Intra-chip HD衡量同一颗芯片在重复测量中响应变化的程度。最直观的算法跑N轮仿真每轮给相同的挑战集统计同一挑战下响应不一致的轮次比例这就是误码率。下面这段脚本模拟“同一实例在不同噪声条件下重复采集”的场景。对应的仿真做法是保持SEED不变把NOISE_LEVEL分别设为0、1、2、3各跑一轮得到四个响应文件。# intra_chip_hd.py def intra_chip_hd(crp_files): # crp_files: 同一实例在不同噪声条件下的CRP文件列表 # 第一份作为基准其余逐份对比 base load_crp(crp_files[0]) mismatch [0] * len(base) for path in crp_files[1:]: curr load_crp(path) for idx, (_, ra, rb) in enumerate(zip(base, curr)): if ra ! rb: mismatch[idx] 1 total_rounds len(crp_files) - 1 ber sum(1 for m in mismatch if m 0) / len(base) return ber参数说明这里把“发生至少一次翻转”算作该比特不可靠。更严格的算法是统计翻转次数占重测轮数的比例然后对全部比特取平均。工程上两种口径都有人用汇报时务必注明计算方式否则评审会被质疑。可靠性阈值参考商用PUF产品通常要求BER小于5%密钥生成应用要求小于1%。行为模型里由于延迟差是整数且分布较宽BER通常极低0.1%以下都正常。如果你在行为模型里就测出百分之几的BER先检查噪声参数是不是加得过大——NOISE_LEVEL超过累计延迟差的10%仲裁判决会被噪声主导这不代表物理真实。4.4 指标参数速查表指标计算方式理想值工程容忍线仿真阶段常见问题片间汉明距离不同实例同挑战响应相异比例50%40%~60%延迟差分布不对称导致偏低或偏高片内汉明距离同实例重复测量响应变化比例0%5%密钥场景1%噪声参数设置过大BER虚高汉明重量响应中1的比例50%45%~55%仲裁阈值有偏响应整体偏向0或1响应吞吐率单位时间产生的响应比特数越高越好取决于系统时钟与Testbench采样等待时间无关是设计指标汉明重量需要在脚本里单独统计一行就能实现# hamming_weight.py def hamming_weight(crps): ones sum(r for _, r, _ in crps) return ones / len(crps) crps load_crp(crp_table.txt) print(Hamming Weight {:.2f}%.format(hamming_weight(crps) * 100))这四项指标合在一起基本可以判断一个PUF行为模型是否“长得像合格的PUF”。如果唯一性、可靠性、重量三项同时达标只能说明仿真模型自洽。要再进一步可以做随机性检验或简单的建模攻击测试前者验证响应的统计随机性后者验证抗预测能力。这些放在第6章讲。5. PUF模拟避坑指南5个肉眼看不出来的翻车点PUF模拟项目里仿真报告的绿灯和真实验证的红灯之间隔着好几层选择偏差。这章内容来自我自己的经验汇总每一条都是交付现场真实踩过的坑。5.1 现象仿真全过、上板全变路径偏差与路由偏差的混淆你精心调好的APUF行为模型在仿真里唯一性50%、BER接近0高高兴兴做FPGA原型验证结果上板后响应完全不可复现。换一片板子响应全变同一片板子重启后也变。原因行为模型的延迟差是人为设定的“工艺偏差”但FPGA里APUF两条路径的延迟主要由布线决定。FPGA布线器会把两条路径布成完全不同的绕线长度这些布线差异远大于逻辑单元本身的工艺偏差。结果就是响应被路由偏差主导而路由偏差会随布局版本浮动换一个布线种子结果就变化。解决先明确你的目标平台。如果是FPGA原型必须做对称布线约束让两条路径走相同数量级的路由资源并固定布局布线种子如果是ASIC流片在版图阶段做严格的延迟匹配。行为模型阶段就要意识到这一点在仿真报告里注明“路径偏差占比”假设比如delay_a和delay_b的基准值必须相等只允许小范围随机偏差。如果有人想在行为模型里注入一个固定的长路径偏移来模拟布线不匹配那应该把它当成系统性偏差来处理而不是工艺随机偏差。5.2 现象温度循环后同一实例响应漂移没有给延迟偏移留余量可靠性仿真跑了好几轮BER全部为0。评审问“覆盖温度了吗”你才发现仿真的延迟参数根本没变。于是给全部delay加了固定偏移模拟高温结果BER突然飙到百分之十几。原因真实芯片的延迟随温度变化不是均匀的——载流子迁移率在高温下降延迟整体增大但不同晶体管的阈值电压变化不同各路径的延迟漂移并不一致。行为模型里如果只做整体加偏移等于给所有路径同向漂移仲裁结果不会变化如果做随机漂移幅度略大就会覆盖原生的工艺偏差。解决温度建模要分两层。第一层是公共偏移所有延迟加上同一个值模拟载流子迁移率变化这一层几乎不影响响应稳定性第二层是随机扰动每条路径独立随机变化幅度控制在基础延迟的3%~5%以内。NOISE_LEVEL参数建议取1表示3%随机扰动2表示5%超过5%的仿真结果不具备参考意义因为真实芯片的级间偏差不会大到完全翻转累计延迟差的符号。5.3 现象汉明重量偏了仲裁阈值不是自然居中统计完500个挑战的响应发现1的比例只有38%明显偏离50%。检查delay_a和delay_b的初始化代码看起来是对称的但响应还是偏。原因$random生成的随机数序列不是均匀覆盖的。delay_a[k] 10 ($random % 7)的取值范围是10到16但$random % 7的余数分布可能不均匀特别是在某些仿真工具里低位随机性较差。更隐蔽的原因是仿真工具内部随机数种子不同两个实例的随机序列实际不独立。解决换用显式均匀分布的建模方式比如用$urandom_range(10, 16)替代$random % 7并且给delay_a和delay_b各分配一个独立种子。同时增加一个判决偏置参数BIAS显示声明仲裁器阈值偏移。判断汉明重量偏置时先跑1000个挑战的统计如果偏差超过5%优先调整随机数生成方式而不是修改仲裁逻辑。5.4 现象CRP收集多了被线性建模APUF是“透明”模型有人拿着你的CRP表跑了个线性回归用几百组挑战-响应训练预测准确率达到90%以上。这意味着PUF的“不可克隆性”在他手里已经失效了。原因APUF的响应本质是两条路径累计延迟差的符号而累计延迟差是每个挑战位对应级延迟差的线性求和。这决定了APUF的CRP存在解析表达式收集足够多的数据后用线性回归就能估计出各级延迟差进而预测任意挑战的响应。这不是实现缺陷是APUF结构的数学本质。解决行为模型的指标里增加一项“抗建模能力评估”。最简单的方法是从CRP表里随机抽80%训练线性回归模型20%做预测。预测准确率接近50%才算合格。如果发现准确率明显高于50%说明你的CRP空间被线性模型吃透了需要改用XOR APUF或裁剪响应数量。这也是第6章进阶方向的原因。在行为模型阶段对它做评估比流片后才发现被攻破要便宜得多。5.5 现象亚稳态在仿真里看不见判决窗口与仲裁握手行为模型里仲裁就是acc_a acc_b的比较永远有确定输出。真芯片上如果两条路径的延迟差小于仲裁触发器的亚稳态窗口触发器进入亚稳态输出可能是一个中间电平最终锁存成0或1取决于噪声。更麻烦的是同样的挑战第二次测可能锁存出相反结果。原因行为模型的仲裁没有时间维度不知道两条路径到底差了多少皮秒。当延迟差趋近于0时模型应该给出不确定输出但整数比较天然做不到。解决在行为模型里加入“判决窗口”逻辑当|acc_a - acc_b|小于某个阈值时输出随机化。这个阈值对应真实电路中仲裁触发器的分辨时间。实现起来不复杂// 判决窗口内随机化输出避免仿真与实测”完全不一致” if (acc_a acc_b WINDOW) begin response_out 1b1; end else if (acc_b acc_a WINDOW) begin response_out 1b0; end else begin response_out $random; // 亚稳态窗口内随机判决 end参数说明WINDOW的单位是延迟量化单位建议取级间延迟标准差的0.5倍。太小则亚稳态事件几乎不出现太大则可靠性指标虚高因为它把边缘翻转当成随机噪声处理。上板验证时如果发现响应稳定性优于行为模型预测检查是不是WINDOW设得太宽了。6. 进阶路线从单级APUF到XOR结构与稳定性筛选如果前面的流程你已经跑通并且理解了APUF为什么会被线性建模攻破那下一步就是把它改造成工程上可用的抗建模APUF同时解决密钥生成场景里最核心的稳定性问题。6.1 用XOR级联提升抗建模能力XOR APUF的思路很直接例化多个独立的APUF让同一挑战分别产生响应最后把所有响应做异或输出一个组合响应。假设有K个APUF攻击者需要同时估计K组延迟差才能建立预测模型建模复杂度指数上升。8级APUF用4个XOR级联抗线性建模能力显著提升。行为模型的改动很小在Testbench里例化四份APUF把响应异或后写盘即可。需要注意四个实例的延迟表必须独立生成用四个不同SEED。如果为了省事让四个实例共享延迟表异或后响应分布依然接近50%但抗建模能力没有实质提升。6.2 稳定性标记只取“每次都能一致”的响应位密钥生成场景下PUF响应不能出现任何比特翻转否则密钥错误。常见做法是做稳定性筛选在多个温度和电压条件下重复采集响应标记那些在所有条件下都保持一致的比特生成一个稳定位掩码。使用时只从稳定位里提取密钥不稳定比特直接丢弃。行为模型的稳定位筛选流程和真实芯片完全一致固定SEED分别用NOISE_LEVEL0、1、2、3跑四轮逐挑战比较响应四轮一致才标记为稳定。这个流程看起来简单但它决定了后续模糊提取器的纠错开销。稳定位比例越高纠错电路越简单密钥恢复越可靠。6.3 从模拟到密钥生成模糊提取器的位置PUF响应天然不是完美的随机串直接做密钥会面临两个问题一是每次采样的响应有轻微扰动密钥不稳定二是响应分布可能有偏不符合密码学对密钥熵的要求。模糊提取器Fuzzy Extractor就是用来解决这两件事的——它结合稳定位掩码和纠错编码把PUF响应映射成固定长度、分布均匀的密钥。行为模型的价值在于在PUF结构和模糊提取器之前建立明确的接口契约CRP怎么采集、稳定位掩码怎么生成、响应输出格式是什么。这块契约在项目早期定死后面做FPGA验证、驱动开发、上层应用对接都不会来回返工。最后说一点习惯上的建议。我做PUF模拟项目时会先把指标计算脚本写好再开始改Verilog模型——先定义“什么样算通过”再动手调参数避免仿真跑了一大堆却在验收时发现采样方式不对、数据格式对不上。每次改延迟参数、噪声参数都在提交信息里记下SEED和配置这样任何一个异常指标都能回溯到具体代码版本。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询