3. 物理不可克隆函数(PUF)
各位同学,咱们今天聊点硬核的——PUF。这玩意儿在芯片安全里,可以说是「天生我材必有用」的典型代表。
什么叫物理不可克隆函数?说白了,就是利用芯片制造过程中不可避免的工艺偏差,给每一颗芯片一个独一无二的「指纹」。你想想看,就算是同一片晶圆上相邻的两颗芯片,它们的晶体管阈值电压、栅氧厚度、互连线电阻这些参数,都会有微小的差异。这些差异,就是我们做PUF的原材料。
核心思想:PUF不是把密钥存进去,而是把密钥「长」在芯片里。密钥不是存储的,而是每次上电时「生成」的。
3.1 PUF的工作原理
PUF的输入叫「挑战」(Challenge),输出叫「响应」(Response)。一组挑战-响应对,就是CRP(Challenge-Response Pair)。
理想情况下,同一个PUF,给同样的挑战,每次都应该输出同样的响应。但不同PUF,即使给同样的挑战,输出也应该完全不同。这就是PUF的「不可克隆」特性。
我当年做第一个PUF项目时,犯过一个低级错误——以为只要工艺偏差够大,PUF就能稳定工作。结果测试下来,同一颗芯片在不同温度下,响应比特的翻转率高达15%。嗯,这里要注意:PUF的稳定性,才是工程落地的最大挑战。
3.2 基于SRAM的PUF
SRAM PUF是最经典、也是最容易实现的PUF类型。为什么?因为几乎每颗SoC里都有SRAM,不需要额外硬件。
SRAM单元在上电瞬间,两个交叉耦合的反相器会进入一个亚稳态。由于工艺偏差,其中一个反相器会「赢」,另一个会「输」。这个上电初值,就是PUF的响应。
// SRAM PUF 上电初值提取伪代码
for each SRAM cell at address addr:
power_on_chip()
read_value = sram_read(addr)
if read_value == 0:
puf_bit = 0
else:
puf_bit = 1
power_off_chip()
wait_for_discharge()
我在项目中遇到过一个问题:有些SRAM单元的上电初值并不稳定,每次上电结果都不一样。后来我们加了一个「稳定位筛选」的步骤——多次上电,只取那些每次都输出相同值的单元。这个筛选过程,我们叫它「PUF enrollment」。
实战技巧:SRAM PUF的稳定位比例通常在60%-80%之间。剩下的20%-40%怎么办?用纠错码(ECC)来修正。我个人习惯用BCH码,开销适中,纠错能力够用。
3.3 基于环形振荡器的PUF
环形振荡器PUF(RO PUF)是另一种主流方案。它的原理是利用环振的频率差异来生成响应。
同一颗芯片上,放置N个结构完全相同的环形振荡器。由于工艺偏差,每个环振的频率会有微小差异。比较两个环振的频率,谁高谁低,就产生1比特响应。
// RO PUF 响应生成逻辑
// 选择两个RO: RO_A 和 RO_B
count_A = count_oscillations(RO_A, measurement_time)
count_B = count_oscillations(RO_B, measurement_time)
if count_A > count_B:
response_bit = 1
else:
response_bit = 0
RO PUF的好处是:它不受上电初值不稳定的困扰。只要供电稳定,环振的频率就是确定的。但坏处也很明显——它需要额外的硬件开销,而且对环境温度很敏感。
避坑指南:我曾经在一个项目里,把RO PUF放在芯片角落,结果因为片上温度梯度,相邻RO的频率差异被温度漂移淹没了。后来我学乖了:RO PUF的布局一定要对称,最好放在芯片温度相对均匀的区域。
3.4 PUF在密钥生成中的应用
PUF最核心的应用,就是密钥生成。传统的密钥存储方式,是把密钥写在NVM(如eFuse、Flash)里。但NVM有个致命弱点——容易被物理攻击读取。
PUF的方案是:密钥不在芯片里存储,而是每次上电时从PUF的物理特性中「重建」出来。攻击者即使拿到芯片,也无法读出密钥,因为密钥根本不存在于任何存储介质中。
具体流程是这样的:
- Enrollment阶段:在安全环境下,读取PUF的原始响应,用纠错码生成辅助数据(Helper Data)。
- Reconstruction阶段:每次上电,读取PUF响应,结合Helper Data,通过纠错算法恢复出原始密钥。
这里有个关键点:Helper Data本身不泄露密钥信息。它只是纠错用的「提示」,攻击者拿到Helper Data也无法反推出密钥。
| PUF类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SRAM PUF | 零硬件开销,实现简单 | 稳定性差,需要筛选和纠错 | 低成本IoT设备 |
| RO PUF | 稳定性好,频率可测量 | 硬件开销大,对温度敏感 | 中高端安全芯片 |
| Arbiter PUF | CRP数量多,安全性高 | 易受建模攻击 | 认证场景 |
我的建议:如果你做的是消费级产品,SRAM PUF就够了,成本低、集成方便。但如果是金融安全芯片或车规芯片,我建议用RO PUF或者混合PUF方案。稳定性是第一位的,密钥重建失败一次,整个系统就瘫了。
最后说一句:PUF不是万能的。它解决的是密钥存储的安全问题,但密钥使用过程中的侧信道攻击、故障注入攻击,PUF是防不住的。安全是一个系统工程,PUF只是其中一块拼图。