AES-CCM 是什么
AES-CCM 是把 CTR 模式的加密与 CBC-MAC 的认证组合起来的认证加密模式,规范见 NIST SP 800-38C,使用说明见 RFC 3610。它的特点是只用 AES 一种分组运算就能同时提供机密性与完整性,因此在无线与受限设备协议中使用广泛,例如 WPA2 的 CCMP、蓝牙 LE 与面向物联网的 TLS 配置。
基本信息
| 标准 | NIST SP 800-38C、RFC 3610 |
|---|---|
| 运算基础 | 加密用 CTR,认证用 CBC-MAC,均基于 AES |
| nonce 长度 | 7-13 字节,由 L 字段决定 |
| 认证标签 | 常用 8 或 16 字节 |
| 典型平台 | WPA2 CCMP、蓝牙 LE、TLS 1.3 的 CCM 套件 |
典型使用场景
- Wi-Fi:WPA2 的 CCMP 用 AES-CCM 保护 802.11 数据帧
- 蓝牙 LE:链路层加密采用 AES-CCM 变体
- 受限设备 TLS:TLS 1.3 定义 TLS_AES_128_CCM_8_SHA256 供内存紧张场景使用
- 自研二进制协议:希望单一算法同时提供加密与完整性时
- FIPS 合规环境:CCM 属 NIST 认可工作模式,可与 AES 组合使用
TLS 1.3 中的 CCM 套件
TLS 1.3 中的 CCM 套件
TLS_AES_128_CCM_SHA256 # 16 字节标签
TLS_AES_128_CCM_8_SHA256 # 8 字节标签,面向受限环境
# 在 OpenSSL 中枚举
# openssl list -cipher-algorithms | grep -i CCM参数与影响
| 要素 | 取值范围 | 影响 |
|---|---|---|
| nonce | 7-13 字节 | 长度与单密钥可处理数据量上限耦合 |
| 标签长度 | 4 到 16 字节(偶数) | 越短抗伪造能力越弱 |
| AAD | 任意长度 | 参与认证但不加密,可保护头部字段 |
| 密钥 | AES-128/192/256 | 同一密钥下 nonce 绝不能重复 |
CCM 对 nonce 唯一性的要求与 CTR 相同:同一密钥下重复 nonce 会直接造成密钥流复用,明文可被恢复,而不只是认证失败。
CCM 属于「先认证后加密」的两遍处理模式,加密前必须知道数据总长度,因此不能用于长度未知的流式加密,也无法在线逐块输出。
落地注意事项
- 认证与加密共用同一密钥,投产后不要在同一密钥下混用其他模式
- 实现时先算出总长度再调用加密接口,分块调用会破坏认证
- 对接无线或嵌入式协议时核对标签长度,协议层通常另有防重放机制
- TLS 中选用 CCM 套件要确认库版本支持,部分旧实现只做了 GCM
与 GCM 的对比
| 维度 | CCM | GCM |
|---|---|---|
| 分组运算 | 只用 AES 加密 | AES 加密加有限域乘法 |
| nonce 长度 | 7 到 13 字节可选 | 常用 12 字节 |
| 处理方式 | 需预知总长度 | 支持流式 |
| 硬件门槛 | 只需 AES 单元 | 有乘法加速时更有优势 |
WPA2 的 CCMP 会把 802.11 帧头中受保护的部分作为附加认证数据参与计算,篡改帧头同样能被发现;重放计数与密钥更新由 802.11 状态机负责,不由 CCM 本身处理。