物理不可克隆函数(PUF)基础

各位同学,咱们今天聊点硬核的——物理不可克隆函数。说实话,我第一次听到这个名字的时候,觉得这玩意儿像是科幻片里的东西。但干这行久了你会发现,PUF 其实是解决设备身份认证最优雅的方案之一。

为什么叫「不可克隆」?因为每个芯片的 PUF 响应,就像人的指纹一样,是独一无二的。你没法用另一颗芯片复制出完全一样的响应。我当年在做一个安全芯片项目时,甲方要求「防抄板」做到极致,传统的密钥存储方案怎么都不放心。后来我们上了 PUF,问题迎刃而解。

PUF 的工作原理

说白了,PUF 就是利用芯片制造过程中不可避免的物理差异。晶圆掺杂浓度、氧化层厚度、金属线宽——这些参数在理论上应该一致,但实际上每颗芯片都有微小的随机偏差。

PUF 的工作流程分两步:

  1. 激励输入(Challenge):给 PUF 电路一个输入信号
  2. 响应输出(Response):电路基于物理差异产生一个唯一输出

这个 Challenge-Response Pair(CRP)就是 PUF 的核心。你想想看,同一颗芯片,每次给相同的激励,理论上应该得到相同的响应。但不同芯片,即使给相同的激励,响应也完全不同。

关键点:PUF 不存储密钥,它「生成」密钥。密钥在需要时才出现,用完就消失。这让物理攻击者无从下手——你撬开芯片封装,看到的只是一堆逻辑门,没有存储密钥的 ROM 或 Flash。

PUF 的数学基础与物理实现

数学上,PUF 可以看作一个函数 f: C → R。C 是挑战空间,R 是响应空间。这个函数必须满足:

  • 确定性:同一芯片,同一挑战,输出相同响应
  • 唯一性:不同芯片,同一挑战,输出不同响应
  • 不可预测性:给定部分 CRP,无法推断其他 CRP

我在项目中遇到过一种情况:甲方要求 PUF 的响应必须通过 NIST 随机性测试。这其实是个硬指标,因为 PUF 的「随机性」来源于物理噪声,而不是伪随机数生成器。两者有本质区别。

常见的物理实现方式

类型 物理原理 典型结构 我个人的评价
硅 PUF IC 制造工艺偏差 环形振荡器、SRAM 最成熟,量产首选
光学 PUF 介质散射特性 随机微粒涂层 安全性高,但部署麻烦
涂层 PUF 介电常数随机性 掺杂颗粒的涂层 防拆解效果好
磁性 PUF 磁畴随机排列 磁性隧道结 还在实验室阶段

实际工程中,环形振荡器 PUF(RO PUF)和 SRAM PUF 用得最多。RO PUF 的原理很简单:芯片上有多个结构完全相同的环形振荡器,但受工艺偏差影响,它们的振荡频率略有不同。通过比较这些频率的差异,就能生成唯一的响应。

// RO PUF 响应生成伪代码示例
// 实际项目中用 Verilog 实现,这里用 C 风格示意

uint64_t generate_response(int challenge) {
    // 根据 challenge 选择两个 RO
    int ro_a = select_oscillator(challenge & 0xFF);
    int ro_b = select_oscillator((challenge >> 8) & 0xFF);
    
    // 计数两个 RO 的振荡次数
    uint32_t count_a = count_cycles(ro_a, SAMPLE_TIME);
    uint32_t count_b = count_cycles(ro_b, SAMPLE_TIME);
    
    // 比较频率,输出 1 bit
    return (count_a > count_b) ? 1 : 0;
}

避坑指南:我曾经在 RO PUF 项目里踩过一个坑——温度和电压变化会导致振荡频率漂移。同一个 RO,在 25°C 和 85°C 下频率能差 5%。后来我们加了温度补偿电路和纠错码(ECC),才把误码率压到可接受范围。

PUF 的关键性能指标

评价一个 PUF 好不好,不能光看它能不能工作。我一般从四个维度来评估:

1. 唯一性(Uniqueness)

不同芯片之间的响应差异有多大。用「片间汉明距离」来衡量,理想值是 50%。

公式:Uniqueness = (2 / (k*(k-1))) * Σ HD(R_i, R_j)

其中 k 是芯片数量,HD 是汉明距离。我见过最差的 PUF 唯一性只有 12%,那基本等于所有芯片的响应都差不多——这玩意儿就没法用了。

2. 可靠性(Reliability)

同一芯片在不同环境条件下,响应的一致性。用「片内汉明距离」来衡量,理想值是 0%。

环境因素包括:温度(-40°C ~ 85°C)、电压(±10%)、老化效应。我做过一个测试,某款 SRAM PUF 在高温下误码率飙到 8%,后来加了模糊提取器(Fuzzy Extractor)才降到 0.5% 以下。

3. 随机性(Randomness)

响应比特流是否满足统计随机性。用 NIST SP 800-22 测试套件来验证。

这里有个坑:PUF 的随机性来源于物理过程,不是算法。如果芯片设计有系统性偏差(比如 RO 布局不对称),响应就会出现偏置。我建议在流片前做蒙特卡洛仿真,提前评估随机性。

4. 防篡改性(Tamper Resistance)

物理攻击者能否提取或预测 PUF 响应。

常见的攻击手段包括:

  • FIB 探针:聚焦离子束直接探测内部节点
  • 侧信道分析:通过功耗、电磁辐射推断响应
  • 机器学习建模:收集部分 CRP,训练模型预测未知 CRP

注意:别以为上了 PUF 就万事大吉。我见过一个案例,攻击者用机器学习模型,只收集了 10% 的 CRP 就预测出了 85% 的剩余响应。所以 PUF 的挑战空间必须足够大,而且 CRP 不能暴露太多。

PUF 性能指标对比表

指标 理想值 RO PUF 典型值 SRAM PUF 典型值 工程容忍上限
唯一性 50% 48% ~ 52% 49% ~ 51% > 45%
可靠性 0% < 3% < 5% < 10%
随机性 P > 0.01 P > 0.05 P > 0.01 通过 NIST 测试
能耗 越低越好 ~10 pJ/bit ~1 pJ/bit 视应用而定
面积 越小越好 ~5000 μm² ~1000 μm² 视芯片预算而定

嗯,这里要注意:表格里的数据是我基于多个量产项目统计的,不同工艺节点会有差异。比如 28nm 的 SRAM PUF 可靠性就比 180nm 的好,因为先进工艺的器件匹配性更好。

PUF 知识体系结构图

下面这张图是我自己整理的 PUF 知识框架,方便你理解各个概念之间的关系:

PUF 知识体系结构图 物理不可克隆函数 (PUF) 工作原理 数学基础 物理实现 工艺偏差 CRP 映射 确定性 唯一性 RO PUF SRAM PUF 关键性能指标 唯一性 可靠性 随机性 防篡改性 核心:利用制造偏差 → 生成唯一指纹 → 不存储密钥 → 抗物理攻击

这张图把 PUF 的三大核心——工作原理、数学基础、物理实现——串起来了。底部是四个关键性能指标,顶部是它们共同支撑的 PUF 概念。你仔细看会发现,所有箭头都指向性能指标,这说明什么?说明不管你的 PUF 原理多巧妙,最终都要用这四个指标来检验它好不好用。

我个人习惯在项目初期就把这四个指标定好目标值。比如可靠性要求误码率低于 3%,那就得提前规划纠错码和温度补偿。别等到芯片回来了再测,那时候改设计就晚了。