首页/安全/加密与证书速查/AES-CTR 计数器模式
加密算法基础95 条

AES-CTR 计数器模式

把 AES 当作流密码:用 nonce + counter 生成密钥流与明文异或,支持并行加密与随机访问,常用于协议数据面与缓存加密;本身无完整性保护。

加密与证书速查安全更新于 2026-10-13

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 的独特优势,也带来状态管理要求:偏移量与计数器必须被完整记录并能还原,否则解密端计数器对不齐会得到乱码。分块存储场景建议把每个块的起始偏移写进元数据。

易错点

  • 计数器空间回绕:单密钥加密量超过计数器容量后会与早期密钥流重叠,需要限制单密钥数据量或按块换密钥
  • 偏移量记录不完整:解密端计数器对不齐,表现为部分数据乱码而非报错
  • 把 CTR 当完整的加密方案:没有完整性保护,密文可被静默篡改
  • 先解密再验 MAC:处理顺序错误会引入错误分类与侧信道风险,正确顺序是先验 MAC
  • 同一密钥下计数器重叠:多进程或多设备共用计数器区间,导致密钥流重复使用

数据来源与参考

  • NIST SP 800-38A(CTR 模式)
  • OpenSSL 官方文档 openssl-enc(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌