4. SRAM PUF 原理:上电状态、激励-响应对与可靠性

SRAM PUF 是物理不可克隆函数里最经典、最成熟的一种实现方式。说白了,它利用的就是 SRAM 单元在上电瞬间那种「随机但稳定」的初始状态。我最早接触这个方向是在一个安全芯片的项目里,当时甲方要求密钥不能以明文形式存储在非易失存储器里——嗯,SRAM PUF 正好能解决这个问题。

4.1 SRAM 单元的上电状态

先看最基本的 SRAM 单元结构。一个 6T SRAM 单元由两个交叉耦合的反相器构成,形成正反馈回路。上电时,两个反相器的输出会互相竞争,最终稳定在 0 或 1。

你可能会问:为什么不是每次都稳定在同一个值?

原因在于制造工艺的随机偏差。晶体管阈值电压、沟道长度、氧化层厚度这些参数,在纳米级工艺下会有微小的失配。这种失配是随机的、不可控的,但对每个芯片来说又是固定的。所以同一个 SRAM 单元,每次上电都倾向于同一个初始值——这就是 PUF 的「指纹」来源。

核心要点:SRAM PUF 的熵源来自工艺偏差导致的晶体管失配,不是来自外部输入。每个单元的上电偏好值是随机的,但对特定芯片来说是确定性的。

我在项目中遇到过一个问题:有些 SRAM 单元的上电状态并不稳定,10 次上电里有 3 次是 0、7 次是 1。这种单元不能用于密钥生成,否则密钥会频繁出错。所以实际工程中必须做「稳定性筛选」——只保留那些上电状态重复性 > 99% 的单元。

4.2 SRAM PUF 的激励-响应对

PUF 的激励-响应对(Challenge-Response Pair, CRP)是它的核心工作模式。激励是输入,响应是输出。对 SRAM PUF 来说,激励通常是一组地址选择信号,响应是对应地址的 SRAM 单元上电值。

举个例子:

  • 激励(Challenge):地址 0x00A3
  • 响应(Response):该地址对应的 128 个 SRAM 单元的上电值,组成 128 位二进制串

一个典型的 SRAM PUF 响应生成流程如下:

// 伪代码:SRAM PUF 响应生成
uint8_t generate_response(uint16_t challenge_addr) {
    uint8_t response[16];  // 128 位响应
    power_up_sram();       // 给 SRAM 阵列上电
    for (int i = 0; i < 16; i++) {
        response[i] = read_sram_byte(challenge_addr + i);
    }
    power_down_sram();     // 下电,准备下一次
    return response;
}

这里有个关键点:每次生成响应前,SRAM 必须完全下电,让所有单元回到初始状态。如果只是软复位,单元状态可能被保留,PUF 的随机性就没了。

参数 典型值 说明
单元数量 4K ~ 64K bit 用于生成密钥的 SRAM 阵列大小
响应长度 128 ~ 256 bit 一次 CRP 生成的密钥位数
稳定单元比例 70% ~ 90% 经过筛选后可用于密钥的单元占比
误码率(BER) < 5% 未纠错时的原始误码率

工程经验:我个人习惯在芯片量产测试阶段,对每颗芯片的 SRAM PUF 做一次全地址扫描,记录每个单元的稳定性和偏好值。这些数据会存储在芯片的安全存储区,用于后续的纠错码配置。

4.3 SRAM PUF 的可靠性问题

SRAM PUF 不是完美的。温度变化、电压波动、芯片老化都会影响上电状态。我曾经在一个车规级项目里吃过亏——常温下 PUF 响应完全正确,但到了 -40°C 和 +125°C 的极限温度下,误码率直接飙到了 15%。

主要的可靠性问题有这几个:

  • 温度漂移:晶体管阈值电压随温度变化,导致部分单元的偏好值翻转
  • 电压噪声:上电时的电压斜率不一致,影响单元竞争结果
  • 老化效应:BTI(偏置温度不稳定性)和 HCI(热载流子注入)会改变晶体管特性
  • 随机噪声:热噪声和 flicker 噪声导致单元状态不稳定

怎么解决?工程上常用的方法有:

  1. 稳定性筛选:多次上电测试,只保留重复性高的单元
  2. 纠错码(ECC):使用 BCH 码或 Reed-Muller 码纠正少量比特错误
  3. 模糊提取器(Fuzzy Extractor):结合辅助数据,从有噪声的 PUF 响应中提取稳定密钥
  4. 温度补偿:在芯片内集成温度传感器,根据温度调整参考电压

避坑指南:我曾经在一个项目中只做了常温下的稳定性筛选,结果产品在北方冬季部署时大面积出现密钥恢复失败。后来我强制要求:筛选条件必须覆盖全温度范围(-40°C ~ +85°C),并且留出 10% 的余量。这个教训让我多花了三个月改版,但从此再没出过类似问题。

4.4 SRAM PUF 核心逻辑图

下面这张图展示了 SRAM PUF 从物理单元到密钥输出的完整链路:

SRAM PUF 核心逻辑:从物理单元到密钥输出 6T SRAM 单元阵列 工艺偏差 → 随机上电状态 上电控制逻辑 完全下电 → 重新上电 地址译码器 Challenge → 地址选择 原始响应采集 读取选定地址的 SRAM 单元值 → 128/256 bit 原始响应 稳定性筛选 + 纠错码(ECC) 去除不稳定单元 | BCH/Reed-Muller 纠错 | 模糊提取器 稳定密钥输出 128/256 bit 密钥,可重复生成 关键:每次生成密钥前必须完全下电,确保单元回到初始随机状态

4.5 工程实践中的注意事项

最后聊几个实际项目中容易踩的坑:

  • 上电时序:SRAM 的供电电压必须快速上升(通常 < 1ms),否则单元状态会受电压斜率影响。我见过一个设计用了软启动电源,结果 PUF 响应每次都不一样。
  • 温度补偿:如果芯片工作温度范围很宽(比如 -40°C ~ +125°C),建议在片内集成温度传感器,根据温度动态调整纠错码的纠错能力。
  • 老化监测:芯片运行几年后,部分单元的偏好值可能翻转。我建议在芯片生命周期内定期做一次 PUF 自检,如果误码率超过阈值就触发重新注册流程。
  • 安全考虑:PUF 响应不能直接暴露在外部总线上。所有 CRP 操作应该在安全岛(Secure Enclave)内部完成,防止侧信道攻击。

我的建议:如果你刚开始做 SRAM PUF 项目,先花两周时间把稳定性筛选和 ECC 调好。这两个环节做扎实了,后面温度、电压、老化的问题都能兜住。别一上来就追求高密钥熵,可靠性才是工程落地的第一优先级。