GPU Gems 3 · Chapter 36. AES Encryption and Decryption on the GPU
从 128-bit AES state 和轮变换出发,解释 GeForce 8 时代的整数流处理、查表、transform feedback,以及 ECB、CBC、CTR 对 GPU 并行性的不同要求。
学习目标
- 能解释 AES 的 128-bit block、三种 key length、round key schedule 与四个 round operation 如何组合成可逆的整数流变换
- 能修改 AES GPU Mapping Lab 的 key length、cipher mode、操作方向、历史 GPU 路径和 batch size,比较轮数、依赖宽度与查表成本
- 能回答:为什么 ECB/CTR 可以把 block 分开处理,而 CBC 加密不能直接把所有 block 同时交给 GPU
先问:为什么加密会成为 GPU 的整数流问题
一条数据流需要被转换成别人看不懂的字节,但处理结果最终仍要以连续字节流交给网络、文件或纹理。若硬件只擅长浮点和绘制像素,按位异或、移位、整数查表以及原始 buffer 输出都会变成额外的工程负担。
本章展示一个历史转折点:GeForce 8 系列加入整数和位运算、整数索引表、texture-buffer object 与 transform feedback 后,GPU 可以把 AES block 当作数据流处理。重点不是宣称旧 API 仍是今天的最佳密码库,而是看清“算法的哪些部分能并行、数据怎样进出 GPU”。
1. AES 先把明文 block 变成 state,再重复轮变换
↡Advanced Encryption Standard,一种使用对称密钥的 128-bit block cipher;同一把密钥体系用于加密与解密。AES 的数据 block 固定为 128 bits,也就是 16 bytes;支持 128、192、256-bit key。用户 key 先展开成每一轮使用的 round keys,随后对 state 重复相同风格的变换。key 越长,轮数越多,但 block 并不会变成 192 或 256 bits。
每一轮通常包含四种操作:SubBytes 用非线性表替换每个 byte,ShiftRows 改变行的排列,MixColumns 在有限域上混合每一列,AddRoundKey 用 XOR 加入本轮 key。最后一轮省略 MixColumns;解密使用相反方向的表和变换。
2. 4×4 state 是字节算法和寄存器之间的桥
↡AES 在一个 128-bit block 内使用的 4×4 byte 矩阵;实现把连续 16 bytes 解包到四个 32-bit 整数寄存器,再按轮变换更新。GPU 输入是连续 buffer,AES 轮逻辑却需要按 byte、row 和 column 访问。因此实现把每个 16-byte block 解包为 4×4 state,并用四个 32-bit integer registers 保存它。初始化时,unpack 可以和第一次 AddRoundKey 合并;输出时再把 state pack 回连续 block。
这个布局不是密码标准本身,而是实现层的桥梁。它让 XOR、SHL、SHR、OR 处理明确的 bit pattern,也让 ShiftRows 和 MixColumns 有一个可视化的中间状态。调试时应先确认 byte order 和 pack/unpack 对称,再看轮逻辑。
3. 新的整数能力把轮变换变成可查表的 stream kernel
↡AES 用来把一个 input byte 非线性替换成另一个 byte 的固定查找表;加密和解密各有对应的表。GeForce 8 的新能力解决了几类旧障碍:整数寄存器和位操作可以直接表达 AES 的 byte packing;array parameter 和 texture-buffer object 可以用整数索引访问 S-box、MixColumns 等表;transform feedback 可以在光栅化之前把 shader 输出写入 buffer。
MixColumns 的乘法不是普通整数乘法,而是在 AES 的有限域上进行。章节实现把乘以特定系数的结果预先放进表中,shader 根据 byte 查表,再通过旋转、XOR 和 unpack 组合出列混合结果。这样,复杂的有限域乘法被重写为规律的整数取值与位运算。
4. 模式决定 block 之间能否真正并行
↡一种 block-cipher mode:每个明文 block 独立加密,因此适合并行,但相同明文 block 会产生相同密文 pattern。ECB 最容易映射到 GPU:每个 block 都独立执行 AES,多个线程可以同时完成。它也暴露了重要的工程取舍:即使密文不可读,相同输入 block 仍然留下可见的重复 pattern,所以“易并行”不等于“适合所有安全场景”。
↡一种把当前明文 block 与前一密文 block XOR 后再加密的 mode;CBC 加密有前向依赖,CBC 解密可利用已知密文并行。CBC 加密必须先得到前一个 ciphertext,block i 才能开始;GPU 拥有很多线程也不能跳过这条数据依赖。CBC 解密则不同:所有前一 ciphertext 都已在输入中,可以并行解开各 block。CTR 用递增 counter block 生成独立 keystream,再与明文 XOR,因此加密和解密都能独立处理;但 counter 管理和 nonce 约束仍是系统职责。
这就是本章最重要的选型规则:不要只看“每个 block 有多少算术操作”,还要看 block 是否等待别的 block 的结果。模式把密码算法外层的依赖图暴露出来,决定 GPU 能占据多宽的并行表面。
动手走一遍:一个 AES block 如何成为 GPU stream
先展开 key 并解包 state
CPU 生成 encryption/decryption round keys;GPU 把连续 16 bytes 解包到四个 32-bit registers,并完成初始 AddRoundKey。
第 1 / 4 步 · 把 16 字节 block 解包为四个 32-bit state register,并做初始 AddRoundKey
逐步观察 AES block 在 GPU 上如何完成整数状态变换并写回流。
5. transform feedback 与 fragment path 是不同的输出路线
本章的历史测试比较了两种实现:vertex program 通过 transform feedback 输出,fragment program 复用类似 AES 逻辑但把输入/输出寄存器映射到传统渲染路径。测试中 1 MB batch 下 vertex path 约 53 MB/s,fragment path 约 95 MB/s;同一机器上的 CPU 参考约 55 MB/s,所以 fragment path 约为 CPU 的 1.7 倍。
这些数值首先说明一个事实:整数查表是重要成本,输出机制也会改变吞吐;它们不是现代 GPU、现代 CUDA 或生产密码库的基准。今天的工程还必须考虑侧信道、密钥生命周期、认证加密、API 审计和经过验证的密码实现,不能因为一个教学 shader 跑得快就替换成熟库。
6. 用 AES GPU Mapping Lab 比较模式依赖和实现路径
AES GPU Mapping Lab
切换 key length、cipher mode、操作方向、历史 GPU 路径和 batch size,观察轮数、依赖宽度与查表成本如何变化。
先保持 ECB + encrypt,观察 parallel width 等于 block 数;再切到 CBC + encrypt,它会显示 previous ciphertext required 和并行宽度收缩;最后切到 CBC + decrypt 或 CTR,看独立 block 重新出现。把 key length 从 128 调到 256,则轮数从 10 增到 14。
Lab 的吞吐数字是章节历史测量的教学模型,帮助你比较相对方向,不执行真实加密,也不提供安全性证明。真实系统应使用经过审计的 AES/AEAD 库和正确的 nonce、key storage、认证与错误处理。
小结
- AES 固定 128-bit block,key length 128/192/256 决定 10/12/14 轮。
- 4×4 byte state 把连续流数据接到整数寄存器、S-box 和 MixColumns 查表。
- GeForce 8 的整数/位运算、texture-buffer 和 transform feedback 让 GPU 能直接处理整数流。
- ECB 与 CTR 的 block 可独立处理;CBC 加密等待前一密文,CBC 解密可利用已知密文并行。
- 历史吞吐结果说明映射取舍,不等于现代密码库的安全或性能承诺。
练习
练习
问题 1|修改 Demo 代码。 在 Lab 中比较 128-bit 与 256-bit key,分别选择 ECB、CBC encrypt、CBC decrypt 和 CTR。记录 rounds、parallel width 与 table-assisted ops,并解释哪个变化来自 key schedule,哪个来自 mode dependency。
问题 2|诊断解密结果不等于明文。 一个 GPU path 的加密输出能写回 buffer,但解密后只有部分 byte 正确。请按 state layout、round key 和 mode dependency 列出排查顺序。
问题 3|场景选型。 一个只想批量处理独立 block 的离线任务、一个需要安全隐藏重复 pattern 的文件格式、一个需要高吞吐实时加解密的通信流,分别说明 mode 与 GPU 映射上的优先级。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- AES
一种对称 block cipher:固定处理 16-byte 数据块,使用 128、192 或 256-bit key。
- AES state
AES 在一个 block 内使用的 4×4 byte 矩阵,是输入流和轮变换之间的中间布局。
- S-box
把一个 byte 替换为另一个 byte 的固定非线性表,AES 每轮用它打散局部关系。
- ECB mode
每个 block 独立加密的模式,容易并行,但会保留重复明文 block 的 pattern。
- CBC mode
把当前明文与前一密文混合的模式;加密有链式依赖,解密可利用已知密文并行。
- transform feedback
在不必光栅化成图像时,把 shader 输出直接捕获到 buffer attributes 的 GPU 输出模式。