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,再重复轮变换

AES 的数据 block 固定为 128 bits,也就是 16 bytes;支持 128、192、256-bit key。用户 key 先展开成每一轮使用的 round keys,随后对 state 重复相同风格的变换。key 越长,轮数越多,但 block 并不会变成 192 或 256 bits。

one symmetric key, two inverse directionskey schedule128/192/256-bit keyround keys10 / 12 / 14 roundsAES block000102030405060708090a0b0c0d0e0f4 × 4 bytes128-bit fixed blockstream resultciphertextsame keyinverse round logicAES fixes the block at 128 bits; the key length changes the round count

每一轮通常包含四种操作:SubBytes 用非线性表替换每个 byte,ShiftRows 改变行的排列,MixColumns 在有限域上混合每一列,AddRoundKey 用 XOR 加入本轮 key。最后一轮省略 MixColumns;解密使用相反方向的表和变换。

2. 4×4 state 是字节算法和寄存器之间的桥

GPU 输入是连续 buffer,AES 轮逻辑却需要按 byte、row 和 column 访问。因此实现把每个 16-byte block 解包为 4×4 state,并用四个 32-bit integer registers 保存它。初始化时,unpack 可以和第一次 AddRoundKey 合并;输出时再把 state pack 回连续 block。

pack the stream, work on a 4 × 4 byte state, pack it backinput stream00 0102 0304 0506 0708 090a 0b16 bytes / blockstate registers000102030405060708090a0b0c0d0e0fs0, s1, s2, s3four 32-bit integersround logicunpacktransformpack outputthe state is an implementation layout; AES still defines byte-level transformations

这个布局不是密码标准本身,而是实现层的桥梁。它让 XORSHLSHROR 处理明确的 bit pattern,也让 ShiftRows 和 MixColumns 有一个可视化的中间状态。调试时应先确认 byte order 和 pack/unpack 对称,再看轮逻辑。

3. 新的整数能力把轮变换变成可查表的 stream kernel

GeForce 8 的新能力解决了几类旧障碍:整数寄存器和位操作可以直接表达 AES 的 byte packing;array parameter 和 texture-buffer object 可以用整数索引访问 S-box、MixColumns 等表;transform feedback 可以在光栅化之前把 shader 输出写入 buffer。

the implementation needs an integer stream, not a rendered pictureinteger ALUAND / ORSHL / SHRXOR32-bit lanesbitwise state workindexed tablesinteger index → S-boxbuffer → MixColumnsarray parameterstexture-buffer objectstream outtransformfeedbackbuffer attributesrasterizer discardthese are historical GeForce 8/OpenGL capabilities, not a claim about the best modern AES API

MixColumns 的乘法不是普通整数乘法,而是在 AES 的有限域上进行。章节实现把乘以特定系数的结果预先放进表中,shader 根据 byte 查表,再通过旋转、XOR 和 unpack 组合出列混合结果。这样,复杂的有限域乘法被重写为规律的整数取值与位运算。

each AES round composes four different kinds of mixingSubBytes000102030405060708090a0b0c0d0e0fS-box lookupnonlinearShiftRows000102030405060708090a0b0c0d0e0frotate row offsetsMixColumns000102030405060708090a0b0c0d0e0ffinite fieldtable-assisted mixXORroundkeynextroundthe final round omits MixColumns; the implementation keeps round count from the key schedule

4. 模式决定 block 之间能否真正并行

ECB 最容易映射到 GPU:每个 block 都独立执行 AES,多个线程可以同时完成。它也暴露了重要的工程取舍:即使密文不可读,相同输入 block 仍然留下可见的重复 pattern,所以“易并行”不等于“适合所有安全场景”。

CBC 加密必须先得到前一个 ciphertext,block i 才能开始;GPU 拥有很多线程也不能跳过这条数据依赖。CBC 解密则不同:所有前一 ciphertext 都已在输入中,可以并行解开各 block。CTR 用递增 counter block 生成独立 keystream,再与明文 XOR,因此加密和解密都能独立处理;但 counter 管理和 nonce 约束仍是系统职责。

the mode, not just AES, decides the parallel surfaceECBP0C0P1C1P2C2independent blockspattern leakageCBC encryptP0C0P1C1P2C2previous C requiredencryption chainCTRctr0P0ctr1P1ctr2P2independent keystreamsencrypt or decryptCBC decryption can parallelize from known ciphertext; CBC encryption cannot start block i early

这就是本章最重要的选型规则:不要只看“每个 block 有多少算术操作”,还要看 block 是否等待别的 block 的结果。模式把密码算法外层的依赖图暴露出来,决定 GPU 能占据多宽的并行表面。

动手走一遍:一个 AES block 如何成为 GPU stream

分步1 / 4

先展开 key 并解包 state

CPU 生成 encryption/decryption round keys;GPU 把连续 16 bytes 解包到四个 32-bit registers,并完成初始 AddRoundKey。

pack the stream, work on a 4 × 4 byte state, pack it backinput stream00 0102 0304 0506 0708 090a 0b16 bytes / blockstate registers000102030405060708090a0b0c0d0e0fs0, s1, s2, s3four 32-bit integersround logicunpacktransformpack outputthe state is an implementation layout; AES still defines byte-level transformations
from 16 input bytes to 16 output bytes1 · unpack000102030405060708090a0b0c0d0e0fstate + keyfour registers2 · roundsS / R / MXOR key10–14 roundskey length decides3 · pack000102030405060708090a0b0c0d0e0fcipher block16 bytes out4feedbackbufferstreamthe shader has no reason to rasterize a picture when its output is a byte stream

第 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 比较模式依赖和实现路径

GPU Gems 3 · Chapter 36

AES GPU Mapping Lab

可交互

切换 key length、cipher mode、操作方向、历史 GPU 路径和 batch size,观察轮数、依赖宽度与查表成本如何变化。

input blocks → AES rounds → stream output000102030405060708090a0b0c0d0e0f65,536 blocks10 roundsS / R / M / XORcipherstreamfragmentpathindependent blocks · parallel width 65,5361,966,080 table-assisted byte operations · 95 MB/s referencesame block → same ciphertext patterneducational model of the chapter's historical GeForce 8 measurementsnot a modern cryptographic benchmark or security claim
rounds10
parallel width65,536
table-assisted ops1,966,080
reference throughput95 MB/s

先保持 ECB + encrypt,观察 parallel width 等于 block 数;再切到 CBC + encrypt,它会显示 previous ciphertext required 和并行宽度收缩;最后切到 CBC + decryptCTR,看独立 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-bit256-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 输出模式。

资料与写作方式声明

本章以GPU Gems 3 · Chapter 36. AES Encryption and Decryption on the GPU权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…