4. SRAM PUF 原理:上电即生的指纹

好,咱们进入 SRAM PUF 的世界。这是目前最成熟、应用最广的 PUF 类型之一。为什么?因为它几乎不增加额外成本——你用的每一颗芯片里,本来就有 SRAM。

说白了,SRAM PUF 就是利用 SRAM 单元在上电瞬间的“混沌状态”来生成芯片的唯一 ID。这个 ID 不是写进去的,是“长出来”的。

4.1 SRAM 单元的上电状态随机性

先看一个最基本的 SRAM 单元——6T 结构(6 个晶体管)。它由两个交叉耦合的反相器构成,本质上是一个双稳态电路。

核心概念:SRAM 单元在上电时,会进入一个亚稳态。由于制造工艺的微观差异(晶体管阈值电压 Vth 的失配),这个亚稳态会迅速“坍缩”到 0 或 1。这个初始值,就是 PUF 的原始指纹。

为什么会随机?你想想看,两个反相器的驱动能力不可能完全一样。哪怕只有千分之一的偏差,上电时强的那一边就会把节点拉向自己。这个偏差是随机的、不可预测的,而且芯片与芯片之间完全不同。

我在项目中遇到过一个问题:有些 SRAM 单元的上电偏好特别强,每次都是 0;有些则摇摆不定。这其实反映了工艺偏差的分布——我们后面会讲怎么处理。

我的经验:SRAM PUF 的随机性来源,本质上是晶体管级的工艺失配。温度、电压、老化会影响它,但芯片之间的差异远大于环境变化。所以,它适合做身份认证,不适合做密钥存储(除非加纠错)。

4.2 SRAM PUF 的激励-响应对(CRP)

PUF 不是直接输出所有 SRAM 单元的初始值。那样太长了,也不安全。我们需要一个“挑战-响应”机制——Challenge-Response Pair,简称 CRP。

怎么理解?你把 SRAM 阵列看作一个黑盒子。你给它一个输入(Challenge),它根据内部状态计算出一个输出(Response)。这个映射关系,就是芯片的“指纹”。

概念 说明 类比
Challenge(激励) 输入地址或控制信号,指定读取哪些 SRAM 单元 问问题
Response(响应) 从指定单元读出的上电初始值序列 答案
CRP 空间 所有可能的 Challenge-Response 对 题库

举个例子。假设我们有 1KB 的 SRAM,共 8192 个 bit。Challenge 可以是 13 位的地址(0~8191),Response 就是该地址对应的 8 位数据。但实际应用中,Challenge 往往更复杂——比如指定一组地址、一个掩码、甚至一个哈希函数。

注意:CRP 空间不是无限的。SRAM 单元数量固定,可用的 Challenge 数量受限于阵列大小。而且,同一个 Challenge 在不同温度下可能得到略有差异的 Response——这就是可靠性问题。

我建议在设计 CRP 时,不要直接用原始 SRAM 数据。加一层哈希或纠错,能大幅提升安全性。我曾经见过一个方案,直接用 SRAM 地址作为 Challenge,结果被侧信道攻击破解了——因为地址和响应之间有线性关系。

4.3 SRAM PUF 的可靠性问题

SRAM PUF 最大的痛点是什么?不稳定。同一个芯片,同一个 Challenge,今天测和明天测,结果可能不一样。

原因有三个:

  1. 温度漂移:晶体管阈值电压随温度变化,上电偏好的平衡点会移动。
  2. 电压波动:供电电压不同,亚稳态的坍缩速度不同。
  3. 老化效应:BTI(偏置温度不稳定性)和 HCI(热载流子注入)会改变晶体管特性。

我遇到过最头疼的情况:一颗芯片在 25°C 下测试,错误率只有 0.1%;到了 85°C,错误率飙升到 5%。这意味着,如果直接拿原始 SRAM 数据做密钥,认证会频繁失败。

关键数据:典型的 SRAM PUF 单元,上电状态的稳定性在 90%~99% 之间。也就是说,有 1%~10% 的单元是不稳定的。这些“摇摆位”必须被处理掉。

怎么处理?两个思路:

  • 筛选法:多次上电,标记那些总是不一致的单元,直接丢弃。代价是损失一部分 SRAM 容量。
  • 纠错法:用纠错码(ECC)来修复错误。这是更通用的方案。

4.4 纠错码(ECC)在 SRAM PUF 中的应用

纠错码不是新鲜事——通信领域用了多少年了。但在 PUF 里,它的角色有点特殊。

传统 ECC 是“发送方编码,接收方解码”。PUF 里呢?我们是在“注册阶段”和“重构阶段”之间做纠错。

流程是这样的:

  1. 注册(Enrollment):芯片在理想条件下(比如 25°C,标称电压)读取 SRAM 初始值,生成一个“参考响应”。同时,计算并存储一份“辅助数据”(Helper Data)。
  2. 重构(Reconstruction):芯片在实际使用中读取 SRAM 初始值,结合辅助数据,用 ECC 解码出原始的参考响应。

辅助数据是什么?说白了,就是纠错码的校验信息。它不泄露原始响应,但能帮助纠正错误。

我的建议:常用的 ECC 方案有 BCH 码、Reed-Muller 码、以及更轻量的重复码(Repetition Code)。对于 SRAM PUF,我推荐 BCH 码——纠错能力强,硬件开销适中。

举个例子,用 BCH(127, 64, 10) 码:

  • 数据位 64 bit
  • 码字长度 127 bit
  • 可以纠正最多 10 个错误

这意味着,如果 SRAM 的原始错误率是 5%,经过 BCH 纠错后,错误率可以降到 10^-6 以下。够用了吧?

注意:ECC 不是万能的。如果错误率太高(比如超过 15%),纠错码会失效。这时候需要先做筛选,把最不稳定的单元去掉。我曾经在一个项目里,先筛选掉 20% 的单元,再用 BCH 码,最终实现了 99.999% 的可靠性。

另外,辅助数据的安全性也要考虑。虽然它不直接泄露响应,但攻击者可以通过分析辅助数据来推断部分信息。我建议对辅助数据做一次哈希或加密,或者使用模糊提取器(Fuzzy Extractor)来保证安全性。

4.5 知识体系总览

下面这张图,把 SRAM PUF 的核心逻辑串起来了。从物理根源到应用方案,一目了然。

SRAM PUF 知识体系 SRAM PUF 核心逻辑 工艺失配 → 上电随机性 Challenge → SRAM 阵列 → Response 温度漂移 | 电压波动 | 老化效应 → 不稳定位 筛选法(丢弃不稳定位) + ECC 纠错(BCH/Reed-Muller) 稳定、唯一的硬件指纹 关键点 • 不增加额外成本 • 芯片间差异大 • 需 ECC 保证可靠性

嗯,这张图把整个流程串起来了。从工艺失配开始,到 CRP 机制,再到可靠性问题,最后用筛选和 ECC 收尾。每一步都有坑,但每一步也都有成熟的解决方案。