Xilinx FPGA 比特流加密指南:量产环境下的 AES256 + eFUSE/BBR + HMAC #
FPGA 项目进入量产阶段后,防止比特流被回读、逆向工程或篡改就变得至关重要。Xilinx 7 系列(Artix-7、Kintex-7、Virtex-7)和 Virtex-6 FPGA 提供 AES256 加密 + HMAC 认证,这是一种硬件安全方案。本指南将介绍加密原理、密钥存储方式(eFUSE 与 BBR 的对比),以及使用 Vivado 的分步实现流程。
1. 基本保护与强加密 #
Xilinx 提供两个级别的安全保护:
- 防止回读: 将 `BITSTREAM.READBACK.SECURITY` 设为 LEVEL1(禁用回读)或 LEVEL2(禁用回读和重新编程)。这能阻止 JTAG 读出,但挡不住高级攻击(例如在上电期间探测配置接口)。
- AES256 加密 + HMAC: 即使比特流被截获,没有密钥也无法解密。HMAC 保证完整性——一旦被篡改,比特流就无法使用。
2. CBC 模式下的 AES256——Xilinx 的加密实现方式 #
AES(高级加密标准)是一种对称分组密码。Xilinx 采用 CBC(密码分组链接) 模式,分组大小 128 位,密钥长度 256 位。加密过程需要:
- AES 密钥(256 位)——用于加密/解密。
- StartCBC(128 位初始向量,IV)——用于随机化第一个分组。
在 CBC 模式下,每个明文分组在加密前先与前一个密文分组进行异或运算。第一个分组使用 StartCBC 作为初始向量。解密需要相同的密钥和 IV。
此外,Xilinx 还包含一个 256 位 HMAC 密钥(基于哈希的消息认证码),用于验证比特流完整性,防止配置文件被恶意替换。
**🔐 三个关键密钥: AES 密钥(256b)+ StartCBC(128b)+ HMAC 密钥(256b)。所有密钥都必须安全存储。.nky 文件将它们打包在一起。**
3. 密钥存储:BBR 与 eFUSE #
加密比特流要求 FPGA 在内部存储解密密钥。Xilinx 提供两种选项:
| 特性 | BBR(电池后备 RAM) | eFUSE(一次性可编程) |
|---|---|---|
| 持久性 | 需要外部电池;断电后丢失 | 永久保存,无需电池 |
| 可重复编程 | 可多次(只要电池有电) | 仅一次,不可逆 |
| 安全级别 | 较低(电池失效时密钥可能被擦除) | 高(编程后物理上不可读取) |
| 典型用途 | 开发、原型设计 | 量产、高安全性产品 |
量产时强烈建议使用 eFUSE。但 eFUSE 一旦烧写且密钥丢失,FPGA 将永久无法使用(变砖)。
4. eFUSE 控制寄存器——关键配置 #
eFUSE 控制寄存器决定安全行为,其中六个位有实际意义。量产推荐设置为 二进制 101100(各位含义参见 Xilinx UG470)。第 0 位尤其危险:一旦置位且 AES 密钥丢失,器件将永久锁定。烧写前务必反复核对。
- 将包含 AES 密钥、StartCBC 和 HMAC 密钥的 .nky 文件备份到安全位置。
- 在支持临时密钥注入(通过 JTAG 或 BBR)的器件上测试加密比特流,确认功能正常。
- 核对 eFUSE 控制位——设置错误会导致器件变砖。
5. 分步实现流程(Vivado) #
步骤 1:生成密钥和加密比特流 #
创建 `.nky` 文件(网表密钥),格式如下(以 xc7a35t 为例):
在 Vivado 中,综合/实现完成后,右键点击 Generate Bitstream → Edit Device Properties,勾选 Enable Encryption,指定 .nky 文件,并选择密钥存储方式(eFUSE 或 BBR),然后生成加密比特流。
步骤 2:烧写 eFUSE(仅一次) #
在 Hardware Manager 中通过 JTAG 连接目标 FPGA。右键点击器件 → Program eFUSE Registers。加载 .nky 文件(Vivado 会从中提取 AES 密钥)。设置 eFUSE 控制寄存器(推荐值 101100)。点击 Program。编程成功后,密钥即永久存储。
步骤 3:加载加密比特流 #
在 Hardware Manager 中选择 Program Device,然后选择步骤 1 生成的加密比特流。FPGA 会自动用 eFUSE 密钥解密并正常配置。若从 QSPI flash 启动,需将加密比特流转换为 MCS 并烧写到 flash。
步骤 4:验证 #
- 回读尝试: 用 Vivado/iMPACT 回读——应失败或返回乱码数据。
- 非加密比特流测试: 尝试加载未加密的比特流——若 eFUSE 控制位要求加密,FPGA 应拒绝加载。
- 篡改测试: 修改加密比特流中的一个字节后尝试加载——HMAC 不匹配会导致配置失败。
6. 采购与工程建议 #
- 密钥管理: 将 .nky 文件存放在安全且访问受控的仓库中。密钥一旦丢失,就无法再更新已加密的器件。
- 备用器件: 保留少量未编程(eFUSE 空白)的 FPGA 库存,以备设计更新或更换密钥之需。
- 支持的器件: 所有 Xilinx 7 系列(A/K/V)、Virtex-6 和 UltraScale 系列均支持 AES256。Spartan-6 不支持加密。
**🔧 LimChip 服务: 我们供应正品 Xilinx FPGA(xc7a35t、xc7k325t 等),并可协助预编程 eFUSE 密钥,或提供未编程器件,供客户在内部自行完成安全编程。**
