AES-CTR 是什么
CTR(Counter Mode)把分组密码当流密码用:对 nonce 与递增计数器拼接后的值做 AES 加密得到密钥流,再与明文异或。它不需要填充、支持并行加密与随机访问,常用于协议数据面、存储加密与需要按偏移读取的场景;但它本身没有任何完整性保护,需要搭配 MAC 或改用 GCM。
基本信息
| 标准 | NIST SP 800-38A |
|---|---|
| 计数器 | nonce 加递增值,同一密钥下不得重叠 |
| 填充 | 无需填充,密文与明文等长 |
| 并行性 | 加密与解密均可并行,可随机访问 |
| 完整性 | 无,需另加 HMAC 或改用 GCM |
| 典型用途 | 协议数据面、分块存储、需要偏移定位的加密 |
典型使用场景
- 随机访问存储:按块偏移直接解密,无需从头解密
- 高吞吐数据面:可并行处理,适合多核与流水线实现
- 等长加密:密文与明文长度一致,报文格式无需预留填充空间
- 作为 GCM 的基础:理解 CTR 有助于理解 GCM 的加密部分
- 协议实现:部分协议在应用层自行组合 CTR 与 MAC
OpenSSL 示例
OpenSSL 示例
# 口令模式:使用 pbkdf2 派生密钥,salt 随文件保存
openssl enc -aes-256-ctr -pbkdf2 -salt -in plain.txt -out data.ctr
# 显式指定密钥与 IV(16 字节 IV 通常为 12 字节 nonce 加 4 字节计数器)
openssl enc -aes-256-ctr -K 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff -iv 00000000000000000000000000000001 -in plain.txt -out data2.ctr
# 解密:密钥与 IV 必须一致,且计数器必须与加密时对齐
openssl enc -d -aes-256-ctr -K 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff -iv 00000000000000000000000000000001 -in data2.ctr -out plain2.txt
# 对比长度:CTR 不填充,密文与明文长度相同
ls -l plain.txt data2.ctr特性与风险
| 特性 | 说明 | 风险 |
|---|---|---|
| 无填充 | 密文与明文等长 | 长度信息可能泄漏明文长度 |
| 可定位 | 可按偏移随机解密 | 偏移或计数器记录不全则解密出错 |
| 可并行 | 加密解密都可并行 | 实现中重复使用计数器会重叠密钥流 |
| 无完整性 | 密文比特翻转直接影响明文 | 需另加 HMAC,且必须先验 MAC 再解密 |
| 计数器回绕 | 计数器空间有限 | 单密钥加密量过大时密钥流重叠 |
CTR 的密文比特翻转会一对一反映到明文:攻击者不需要密钥就能可控破坏数据。需要完整性时必须搭配 HMAC,并遵循「先验 MAC 再解密」的顺序;更简单的做法是直接使用 AES-GCM 或 ChaCha20-Poly1305。
随机访问是 CTR 的独特优势,也带来状态管理要求:偏移量与计数器必须被完整记录并能还原,否则解密端计数器对不齐会得到乱码。分块存储场景建议把每个块的起始偏移写进元数据。