4、物理不可克隆函数(PUF):PUF的工作原理(SRAM PUF、环形振荡器PUF),PUF在密钥生成中的应用

各位同学,咱们今天聊点硬核的——物理不可克隆函数,简称PUF。

这玩意儿,说白了就是芯片的「指纹」。你想想看,每个人的指纹都是独一无二的,对吧?PUF也是这个道理。它利用芯片制造过程中不可避免的工艺偏差,给每一颗芯片一个独一无二的身份标识。

我当年第一次接触PUF,是在一个安全芯片的项目里。甲方要求密钥必须「生于芯片,死于芯片」,不能在任何非易失性存储器里明文存储。当时我就想,这不就是给PUF量身定制的场景吗?

4.1 PUF的工作原理

PUF的核心思想很简单:利用物理实体的微观结构差异来生成唯一响应

芯片制造时,光刻、掺杂、刻蚀这些工艺,总会有那么一丁点儿的随机偏差。这些偏差小到连最先进的工艺设备都无法完全控制。但正是这些「不完美」,成就了PUF的「完美」。

打个比方,你让一百个工匠做一百把一模一样的锁,每把锁的弹子高度、弹簧力度总会有些微差别。这些差别,就是PUF的「不可克隆性」来源。

核心要点:PUF不是存储密钥,而是「生成」密钥。每次上电,它根据物理特性实时计算出密钥。断电后,密钥就消失了。这才是真正的「零存储」安全方案。

4.2 SRAM PUF

SRAM PUF是我个人最喜欢的一种实现方式,因为它简单、直接,而且几乎每个芯片里都有SRAM。

SRAM单元由两个交叉耦合的反相器组成。上电瞬间,这两个反相器会进入一个「拔河」状态——谁先抢到优势,谁就决定这个单元存储的是0还是1。

理论上,这个状态应该是随机的。但实际呢?由于工艺偏差,每个SRAM单元都有自己「偏好」的初始值。有的单元天生爱存1,有的天生爱存0。

我在项目中遇到过一个问题:有些SRAM单元在上电时并不稳定,今天偏向0,明天偏向1。这怎么办?

解决方案是「稳定筛选」。我们会对每个芯片做多次上电测试,只选取那些每次上电结果都一致的单元。这些「靠谱」的单元,才用来生成密钥。

实用技巧:SRAM PUF的响应质量,可以用「片内汉明距离」和「片间汉明距离」来评估。理想情况下,片内距离接近0%(同一芯片每次结果一致),片间距离接近50%(不同芯片结果差异大)。

4.3 环形振荡器PUF

环形振荡器PUF,简称RO PUF。它利用的是门延迟的随机偏差。

一个环形振荡器,就是奇数个反相器首尾相连。信号在环里转一圈,频率取决于每个门的延迟。由于工艺偏差,不同芯片上相同设计的RO,振荡频率会有细微差别。

RO PUF的典型做法是这样的:

  1. 在芯片上放置N个完全相同的环形振荡器
  2. 两两比较它们的频率
  3. 如果A的频率大于B,输出1;否则输出0
  4. 重复比较,生成一串二进制响应

你可能会问:为什么不直接用频率值,而是用比较结果?

嗯,这里要注意。频率值本身受温度、电压影响很大。但两个RO的频率比值,相对来说稳定得多。这就是RO PUF的聪明之处——用相对比较代替绝对测量。

避坑指南:我曾经在一个项目中,RO PUF的响应在低温下完全变了样。排查后发现,不同RO的温度系数并不完全一致。后来我们加入了温度补偿电路,才解决了这个问题。所以,做PUF一定要考虑环境鲁棒性。

4.4 PUF在密钥生成中的应用

好了,原理讲完了。咱们聊聊实际怎么用。

PUF生成密钥,一般分三步走:

步骤 操作 说明
1. 注册 采集PUF原始响应,生成辅助数据 在安全环境下完成,辅助数据可以公开存储
2. 重构 每次上电,用PUF响应+辅助数据恢复密钥 使用纠错码(ECC)纠正PUF响应的微小变化
3. 使用 用重构出的密钥进行加密、签名等操作 密钥只在芯片内部短暂存在,用完即焚

这里有个关键点:纠错码

PUF的响应不是100%稳定的。温度变了、电压变了、芯片老化了,响应都可能出现几位翻转。如果不做纠错,今天生成的密钥和明天生成的密钥可能不一样。

我建议使用BCH码或Reed-Muller码来做纠错。具体选哪种,要看你的PUF误码率和密钥长度要求。

实际案例:在我参与的一个IoT安全芯片项目中,我们用了128位SRAM PUF + BCH(127, 64, 10)纠错码。最终生成的密钥通过NIST随机性测试,且芯片生命周期内的密钥重构成功率达到了99.999%以上。

最后,说一个很多人容易忽略的点:PUF的熵源评估

不是所有PUF响应都适合做密钥。你得先评估它的随机性、唯一性、稳定性。我习惯用以下指标:

  • 均匀性:0和1的比例是否接近50%
  • 唯一性:不同芯片的响应差异是否足够大
  • 可靠性:同一芯片在不同环境下的响应一致性
  • 比特误码率:原始响应的错误比特比例

只有这些指标都达标了,PUF才能真正用于密钥生成。否则,你就是在用一个「伪随机」的指纹,那跟没用PUF有什么区别?

好了,这一章的内容就到这里。PUF是个好东西,但用起来也有不少坑。希望我的这些经验,能帮你少走一些弯路。