AES 与 SHA 硬件:把密码算法做成又快又稳的电路
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**进阶层(intermediate)**数字逻辑第八十八篇。安全岛提到硬件加密引擎比软件快、密钥不出安全区,PUF/TRNG负责根密钥和随机数。这一篇看两个最常见的密码算法在 RTL 里到底长什么样——它们极好地展示了「把规范里的一轮运算映射成组合数据通路,再用复用/流水线换面积或速度」。
本文要回答的问题
- AES 一轮里 SubBytes/ShiftRows/MixColumns/AddRoundKey 各是什么运算、硬件怎么实现?
- S 盒为什么能用一块 ROM 或一片逻辑实现?GF(2⁸) 乘法怎么只用移位异或?
- 10 轮是复用一个轮电路循环 10 拍,还是展开成 10 级流水?吞吐差多少?
- CBC/CTR/GCM 工作模式为什么影响能不能并行?
- SHA-256 的压缩函数和 AES 有什么不同?侧信道防护为什么和数据相关运算有关?
一、AES 的状态与四个轮操作
AES-128 把 16 字节明文排成 4×4 字节状态矩阵,和 128bit 轮密钥异或后,做 10 轮几乎相同的变换(最后一轮无 MixColumns):
- SubBytes:每个字节独立过一个 S 盒(双射非线性替换)。硬件上 S 盒就是一张 256×8 的查找表(ROM/分布式 RAM),或用 GF(2⁸) 求逆 + 仿射变换的组合逻辑实现(省面积、可做毛刺防护)。它是整个算法唯一的非线性,也是安全核心;
- ShiftRows:状态矩阵第 1/2/3 行分别循环左移 1/2/3 字节——纯布线重排,零逻辑;
- MixColumns:每一列在 GF(2⁸)(有限域)上左乘一个固定常数矩阵。域内「乘 2」的
xtime操作只是左移一位再条件异或0x1B,乘 3=乘2再异或自身,所以整列混合只用移位和异或、无进位加法器; - AddRoundKey:整列状态与本轮 128bit 轮密钥逐位异或。
轮密钥不是全部存下,而由主密钥经 **key schedule(密钥扩展)**用一个字递归(SubWord+RotWord+异或轮常数 Rcon)逐轮生成,硬件是一小块复用的字变换逻辑。
二、面积/速度的三个设计点
同一份算法可映射成差别极大的电路,这是数据通路设计的经典权衡(呼应资源复用 vs 并行):
- 迭代型(最小面积):只做一套轮函数 + 状态寄存器,一组数据循环 10 拍,吞吐 ≈ 128bit/(10 周期);
- 轮内流水线(均衡):在轮内插寄存器提频率、或多组数据交替喂入(unrolled feedback 不易插流水,故多用「外部多任务」填满延迟);
- 全展开 + 流水(最高速):把 10 轮展开成 10 级组合流水线,每周期吐出一组 128bit,频率×128bit,面积约 10 倍——用于线速加密盘/网卡;
- 每周期处理位宽还可做 128/256/512bit 宽,与 AXI 数据宽度对齐。
三、工作模式决定可并行性
- ECB 每块独立,可无限并行,但相同明文块产生相同密文、泄露模式,不安全;
- CBC 每块密文依赖前一块(有反馈环),加密无法跨块流水、性能低,硬件可并行做解密;
- CTR/GCM 把块密码当伪随机流:加密 = 明文异或 AES(nonce+counter),各计数器块完全独立、可任意并行,GCM 的认证 GHASH 也主要是 GF(2¹²⁸) 乘,因此现代高速 IPsec/SSD 几乎都做 CTR/GCM;
- 实现要保证每块 IV/nonce 不重复(用 TRNG 或计数器)。
四、SHA-256:一条带模加的串行压缩链
哈希是单向的(无密钥、无逆运算)。SHA-256 把消息填充后按 512bit 分块,对每块跑 64 轮压缩函数,维护 8 个 32bit 工作变量(a..h)和 8 个链接字(H0..H7):每轮做几个循环右移(ROTR)、与/或/异或、选择/多数逻辑,再加两个消息/常量字做模 2³² 加法,更新工作变量;消息调度 W[t] 由前 16 字扩展到 64 字(右移异或+模加)。硬件上它几乎全是 32 位加法器和连线移位,关键路径是多级串联模加,优化靠**进位保留加法(CSA)**重排加法链、或一次迭代做 2 轮(unroll by 2)。与 AES 不同,压缩函数是强串行的(后一轮依赖前一轮),单流很难流水,但可开多条独立消息流并行。
五、吞吐、侧信道与防护
- 吞吐 = 工作频率 × 每周期处理比特,延迟看一个分组要几拍;密码 IP 常带 DMA、内部 FIFO,用 valid-ready 对接总线,密钥存专用寄存器且不读出;
- 侧信道防护:软件查表缓存在数据相关时间上会泄露(cache timing)。硬件也要防功耗/毛刺攻击:S 盒用复合域恒常逻辑而非大 ROM、避免数据相关分支,让功耗尽量与密钥无关(掩码 masking、阈值实现 TI);关键算法做常量时间/常量功耗;
- 密钥管理由 PUF/OTP/安全岛负责,引擎本身不长期持有可被读出的密钥。
与现有篇目的衔接
- 前置:安全岛/加密引擎概念、查找表/寄存器堆、加法器/算术
- 配套:PUF/TRNG/密钥、eFUSE/OTP、LFSR 流密码思想
- 工程:AXI/DMA、valid-ready/FIFO、数据通路编码风格
总结
一句话总结:硬件密码引擎把算法规范映射为可流水的数据通路:AES-128 把 16 字节明文排成 4×4 状态矩阵,初始异或密钥后迭代 10 轮,每轮包含可由 256×8 查找表或 GF(2⁸) 求逆逻辑实现的唯一非线性 S 盒替换 SubBytes、纯布线循环移行的 ShiftRows、在有限域上只靠移位和异或(xtime)完成列矩阵乘的 MixColumns、以及与轮密钥异或的 AddRoundKey,轮密钥由主密钥经 SubWord/RotWord/Rcon 递归在线扩展;同一份算法可在只放一套轮函数循环十拍的最小面积迭代型、轮内/任务并行的均衡型和展开成十级流水每周期吐一组的全展开型之间按频率乘每周期位宽的吞吐公式取舍;工作模式决定并行度,CBC 因块间反馈难并行而 CTR/GCM 各计数器块独立可任意并行,成为高速加密盘和网络的主流;SHA-256 则对填充后的 512bit 消息块跑 64 轮由 ROTR、逻辑函数和多入模 2³² 加法构成的串行压缩函数,维护 8 个工作变量并用右移异或加模加扩展消息字,关键路径靠进位保留加法和双轮展开优化、单流难流水但可多流并行;工程上密码引擎用 DMA 和 FIFO 经 valid-ready 对接总线、密钥只存不可读寄存器,且必须做侧信道防护——避免数据相关分支和大 ROM 查表带来的时序/功耗泄露,采用常量时间、复合域恒常逻辑、掩码和阈值实现,密钥生命周期交由 TRNG、PUF、OTP 和安全岛管理。