2. 物理不可克隆函数(PUF)
物理不可克隆函数,圈里人常叫它 PUF。这名字听着玄乎,其实说白了——它就是芯片的「指纹」。每颗芯片在制造时,由于工艺偏差,都会产生独一无二的物理特性。PUF 就是利用这种天然差异,生成一个不可预测、不可复制的唯一标识。
我早年做安全芯片时,第一次接触 PUF 就觉得这东西很妙。传统密钥存在非易失存储器里,攻击者可以用探针、FIB 等手段直接读出来。但 PUF 不一样——密钥不是「存」在芯片里的,而是「长」在芯片上的。断电就消失,上电才重现。这种特性,让很多硬件攻击手段直接失效。
2.1 PUF 的工作原理
PUF 的工作流程可以拆成三步:
- 激励输入(Challenge): 给 PUF 电路一个输入信号,比如一组电压或地址。
- 物理响应(Response): 电路内部的物理特性(如延迟、电压、电流)产生一个输出。
- 响应提取(Response Extraction): 将模拟信号量化成二进制比特串,作为最终输出。
这里有个关键点——激励和响应的组合,构成了所谓的「挑战-响应对」(CRP)。理论上,PUF 的 CRP 空间可以非常大,甚至指数级。但实际设计中,我们通常只取其中一小部分稳定的 CRP 来用。
2.2 基于 SRAM 的 PUF 设计
SRAM PUF 是目前最成熟、应用最广的一种 PUF 结构。为什么选 SRAM?因为几乎每颗芯片里都有 SRAM,不需要额外工艺,成本几乎为零。
SRAM PUF 的原理其实很简单。SRAM 的每个存储单元由两个交叉耦合的反相器组成。上电瞬间,两个反相器会互相竞争,最终稳定在 0 或 1。由于制造偏差,每个单元天生就「偏向」某一边。这种偏向性,就是 PUF 的熵源。
我画了一张图,帮你理解这个过程:
设计 SRAM PUF 时,有几个参数需要仔细权衡:
| 参数 | 影响 | 我的建议值 |
|---|---|---|
| 单元数量 | 决定密钥长度和熵 | 至少 2 倍于目标密钥长度 |
| 上电稳定时间 | 影响响应可靠性 | ≥ 100 μs(视工艺而定) |
| 温度补偿 | 减少温度漂移 | 使用差分读取 + 纠错码 |
| 老化补偿 | 延长使用寿命 | 定期刷新 + 冗余位 |
2.3 PUF 在密钥生成中的应用
PUF 最实际的应用,就是生成密钥。传统做法是把密钥写进 eFuse 或 Flash,但这种方式有个致命弱点——密钥是静态存储的,攻击者可以用物理手段读取。PUF 密钥生成则完全不同:密钥不在芯片里「存着」,而是每次上电时「算出来」。
具体流程是这样的:
- 注册阶段(Enrollment): 在安全环境下,给 PUF 输入一组激励,读取响应,然后生成辅助数据(Helper Data)。这个辅助数据可以公开存储,不会泄露密钥信息。
- 重构阶段(Reconstruction): 每次上电时,用同样的激励输入 PUF,得到带噪声的响应,再结合辅助数据,通过纠错码恢复出原始密钥。
这里有个关键组件——模糊提取器(Fuzzy Extractor)。它的作用是把有噪声的 PUF 响应,转换成稳定的、均匀分布的密钥。我常用的结构是:
PUF 响应(128 位,含噪声)
↓
纠错编码(BCH 或 Reed-Muller)
↓
哈希函数(SHA-256)
↓
最终密钥(128 位,稳定且均匀)
最后,我整理了一个对比表,帮你理解 PUF 密钥和传统密钥的区别:
| 特性 | 传统密钥存储 | PUF 密钥生成 |
|---|---|---|
| 存储方式 | 非易失存储器(Flash/eFuse) | 物理结构(不存储,上电生成) |
| 抗物理攻击 | 弱(探针、FIB 可读取) | 强(断电后无痕迹) |
| 抗侧信道攻击 | 弱(功耗/电磁可分析) | 中等(需额外防护) |
| 密钥更新 | 需重新烧录 | 更换激励即可 |
| 成本 | 需要额外存储单元 | 利用现有 SRAM,几乎零成本 |
| 可靠性 | 高(存储值不变) | 中等(需纠错码辅助) |