2. 物理不可克隆函数(PUF)

物理不可克隆函数,圈里人常叫它 PUF。这名字听着玄乎,其实说白了——它就是芯片的「指纹」。每颗芯片在制造时,由于工艺偏差,都会产生独一无二的物理特性。PUF 就是利用这种天然差异,生成一个不可预测、不可复制的唯一标识。

我早年做安全芯片时,第一次接触 PUF 就觉得这东西很妙。传统密钥存在非易失存储器里,攻击者可以用探针、FIB 等手段直接读出来。但 PUF 不一样——密钥不是「存」在芯片里的,而是「长」在芯片上的。断电就消失,上电才重现。这种特性,让很多硬件攻击手段直接失效。

核心要点: PUF 不是函数,而是一个物理结构。它利用制造过程中的随机偏差(如掺杂浓度、氧化层厚度、线宽变化)产生响应。同一激励输入不同芯片,输出完全不同;同一芯片在不同时间、温度下,输出应保持稳定。

2.1 PUF 的工作原理

PUF 的工作流程可以拆成三步:

  1. 激励输入(Challenge): 给 PUF 电路一个输入信号,比如一组电压或地址。
  2. 物理响应(Response): 电路内部的物理特性(如延迟、电压、电流)产生一个输出。
  3. 响应提取(Response Extraction): 将模拟信号量化成二进制比特串,作为最终输出。

这里有个关键点——激励和响应的组合,构成了所谓的「挑战-响应对」(CRP)。理论上,PUF 的 CRP 空间可以非常大,甚至指数级。但实际设计中,我们通常只取其中一小部分稳定的 CRP 来用。

我的经验: 选 CRP 时别贪多。我曾经在一个项目中试图用满整个 CRP 空间,结果发现很多响应在温度变化后就不稳定了。后来我学乖了——只选那些经过老化测试和温度循环后依然稳定的 CRP,数量少一点,但可靠性高得多。

2.2 基于 SRAM 的 PUF 设计

SRAM PUF 是目前最成熟、应用最广的一种 PUF 结构。为什么选 SRAM?因为几乎每颗芯片里都有 SRAM,不需要额外工艺,成本几乎为零。

SRAM PUF 的原理其实很简单。SRAM 的每个存储单元由两个交叉耦合的反相器组成。上电瞬间,两个反相器会互相竞争,最终稳定在 0 或 1。由于制造偏差,每个单元天生就「偏向」某一边。这种偏向性,就是 PUF 的熵源。

我画了一张图,帮你理解这个过程:

SRAM PUF 上电初始化过程 反相器 A 反相器 B 上电竞争 工艺偏差决定 胜负方向 输出 1(胜出) 输出 0(落败) 关键说明 每个 SRAM 单元上电时,由于晶体管阈值电压的随机偏差, 两个反相器会以极高概率稳定在同一个方向。 这个方向就是该单元的「出生偏向」,也是 PUF 的熵来源。

设计 SRAM PUF 时,有几个参数需要仔细权衡:

参数 影响 我的建议值
单元数量 决定密钥长度和熵 至少 2 倍于目标密钥长度
上电稳定时间 影响响应可靠性 ≥ 100 μs(视工艺而定)
温度补偿 减少温度漂移 使用差分读取 + 纠错码
老化补偿 延长使用寿命 定期刷新 + 冗余位
避坑指南: 我曾经在一个 28nm 项目里,直接用 SRAM 的默认上电值做 PUF 响应。结果发现,某些地址的单元在多次上电后,有 5%~8% 的比特会翻转。后来排查才知道——那些单元刚好处于「亚稳态」边界,工艺偏差不够大。解决方案是:先做一轮筛选,只保留偏向性足够强的单元。

2.3 PUF 在密钥生成中的应用

PUF 最实际的应用,就是生成密钥。传统做法是把密钥写进 eFuse 或 Flash,但这种方式有个致命弱点——密钥是静态存储的,攻击者可以用物理手段读取。PUF 密钥生成则完全不同:密钥不在芯片里「存着」,而是每次上电时「算出来」。

具体流程是这样的:

  1. 注册阶段(Enrollment): 在安全环境下,给 PUF 输入一组激励,读取响应,然后生成辅助数据(Helper Data)。这个辅助数据可以公开存储,不会泄露密钥信息。
  2. 重构阶段(Reconstruction): 每次上电时,用同样的激励输入 PUF,得到带噪声的响应,再结合辅助数据,通过纠错码恢复出原始密钥。

这里有个关键组件——模糊提取器(Fuzzy Extractor)。它的作用是把有噪声的 PUF 响应,转换成稳定的、均匀分布的密钥。我常用的结构是:

PUF 响应(128 位,含噪声)
        ↓
  纠错编码(BCH 或 Reed-Muller)
        ↓
  哈希函数(SHA-256)
        ↓
  最终密钥(128 位,稳定且均匀)
我的习惯: 纠错码的纠错能力别选太强,也别选太弱。太强了会暴露太多辅助信息,太弱了又纠不回噪声。我一般选能纠 10%~15% 错误位的 BCH 码,配合 128 位 PUF 响应,生成 128 位密钥。这个组合在大多数工艺下都能稳定工作。

最后,我整理了一个对比表,帮你理解 PUF 密钥和传统密钥的区别:

特性 传统密钥存储 PUF 密钥生成
存储方式 非易失存储器(Flash/eFuse) 物理结构(不存储,上电生成)
抗物理攻击 弱(探针、FIB 可读取) 强(断电后无痕迹)
抗侧信道攻击 弱(功耗/电磁可分析) 中等(需额外防护)
密钥更新 需重新烧录 更换激励即可
成本 需要额外存储单元 利用现有 SRAM,几乎零成本
可靠性 高(存储值不变) 中等(需纠错码辅助)