嵌入式加密模式CCM
1 简介
嵌入式优选CCM,服务器偏向 GCM,CCM和GCM都是认证加密模式,但在不同平台上有不同的优化方向。让我详细解析它们的选择逻辑。CCM(Counter with CBC-MAC)工作基于CTR 加密,使用CBC-MAC 认证。

2 模式特点
AEAD 模式
结构比 GCM 简单
- 安全性高
防篡改
防重放
-
优点
标准成熟
易实现
嵌入式友好 -
缺点
性能低于 GCM
串行
不易并行 -
应用
物联网
嵌入式设备
国密终端
3 嵌入式场景为什么优选CCM?
CCM(Counter with CBC-MAC)模式特性
CCM = CTR加密 + CBC-MAC认证
工作原理:
1. 先计算CBC-MAC认证标签(完整扫描数据)
2. 再用CTR模式加密(包括认证标签)
CCM在嵌入式系统的五大优势
- 内存占用极低(决定性优势)
CCM内存需求(伪代码)
struct ccm_state {
uint8_t key[16]; // SM4密钥
uint8_t nonce[13]; // Nonce
uint8_t cbc_state[16]; // CBC-MAC中间状态
// 总计:约 45 字节
};
GCM内存需求对比
struct gcm_state {
uint8_t key[16];
uint8_t nonce[12];
uint8_t hash_subkey[16];
uint8_t counter[16];
uint8_t tag[16];
// GHASH可能需要查表:256字节(优化实现)
// 总计:约 300+ 字节
};
实际案例:
设备:STM32F103(Cortex-M3,20KB RAM)
应用:智能电表加密通信
CCM方案:占用 < 100字节RAM
GCM方案:占用 300-500字节RAM(可能影响其他功能)
选择:CCM允许同时运行Modbus协议栈+加密
2. 代码体积小
CCM核心代码量(估算)
void ccm_encrypt() {
// CBC-MAC计算(重用SM4加密函数)
for (i=0; i<blocks; i++) {
cbc_mac_update(block[i]); // 调用标准SM4
}
// CTR加密(再次重用SM4)
for (i=0; i<blocks; i++) {
ctr_encrypt(block[i]); // 同个SM4函数!
}
}
重用率:100%重用SM4核心函数
额外代码:约 1-2KB
对比GCM:
GCM需要专门的GHASH实现
void ghash() {
// 有限域GF(2^128)乘法
// 需要特殊算法或查表
// 额外代码:3-5KB
}
- 抗侧信道攻击的天然优势
嵌入式设备易受物理攻击:
攻击方式:功耗分析、电磁辐射、时序攻击
CCM的防御优势:
-
所有操作使用同一SM4核心
- 只需加固一个加密函数
- 可统一使用掩码防护
-
操作模式简单
- CBC-MAC:链式依赖,时序固定
- CTR:计数器模式,可预计算
GCM的问题:
-
GHASH与加密使用不同算法
- 需分别防护
- GHASH的乘法操作易泄露信息
-
确定性的执行时间
CCM时间可预测
uint32_t ccm_encrypt_time(size_t data_len) {
// 公式:固定开销 + (数据块数 × SM4时间)
return FIXED_OVERHEAD +
(data_len / 16 + 2) * SM4_CYCLE_TIME;
}
GCM时间受GHASH实现影响
uint32_t gcm_encrypt_time(size_t data_len) {
// GHASH时间可能随数据内容变化
// 在实时系统中不可预测
}
关键系统需求:
汽车电子:CAN总线加密必须保证响应时间
工业控制:PLC通信加密不能有延迟抖动
医疗设备:生命维持系统必须时间确定
- 适合小数据包处理
物联网典型数据包
struct iot_packet {
uint16_t sensor_id;
uint32_t timestamp;
float temperature;
float humidity;
// 总计:14字节
};
CCM处理小包效率
void encrypt_iot_packet() {
// 数据短 → CBC-MAC计算快
// 认证标签同时被加密
// 适合无线传输(每bit都珍贵)
}
GCM对小包有相对固定的开销
主要是GHASH初始化/完成开销
CCM在嵌入式的实际应用
例:LoRaWAN 1.1安全框架
LoRaWAN使用AES-CCM,同样逻辑适用于SM4-CCM
void lorawan_encrypt_frame(uint8_t *frame, size_t len) {
// CCM参数
uint8_t nonce[13]; // 从设备地址、计数器等派生
uint8_t key[16]; // 会话密钥
// 帧头作为AAD(Additional Authenticated Data)
uint8_t aad[5] = {frame[0], frame[1], ...};
// 使用CCM加密
ccm_encrypt(frame+5, len-5, key, nonce, aad, 5);
// 结果:加密数据+4字节MIC(Message Integrity Code)
}
4 服务器场景为什么偏向GCM
GCM在服务器端的五大优势
- 并行化能力(最大优势)
服务器有大量并行资源:
多核CPU(16核、32核、64核)
SIMD指令集(AES-NI,对SM4也有类似优化)
GPU加速潜力
GCM可高度并行化
void gcm_parallel_encrypt(uint8_t **data_chunks, int num_chunks) {
#pragma omp parallel for // 多线程并行
for (int i = 0; i < num_chunks; i++) {
// 每个chunk独立处理
gcm_encrypt_chunk(data_chunks[i]);
}
}
内核优化示例
void ghash_intel_avx512(const uint8_t *data, size_t len) {
// 使用AVX-512指令同时处理多个块
__m512i vhash = _mm512_loadu_si512(...);
// 并行计算多个GHASH
}
性能对比:
测试:加密10GB数据,Xeon Platinum 8280
CCM(串行处理):
- 必须顺序计算CBC-MAC
- 然后才能CTR加密
- 耗时:~2.1秒
GCM(并行处理):
- GHASH和CTR都可并行
- 利用所有CPU核心
- 耗时:~0.6秒(3.5倍加速)
- 硬件加速支持
现代服务器的加密指令集:
assembly
; Intel AES-NI + PCLMULQDQ指令
; 虽然针对AES,但类似优化可用于SM4
; GCM的GHASH优化
pclmulqdq xmm0, xmm1, 0x00 ; 有限域乘法一条指令
; 对比CCM的CBC-MAC:
; 必须串行调用AESENC指令
aesenc xmm0, xmm1
aesenc xmm0, xmm2 ;
依赖前一步结果
云服务商的硬件支持:
AWS:Intel Xeon with Crypto Acceleration
Google Cloud:AMD EPYC with AES + CLMUL
阿里云:倚天710 ARM芯片有加密扩展
5 流式处理优势服务器典型场景:视频流加密(抖音/YouTube转码服务器)
def encrypt_video_stream(input_stream, output_stream, key):
# GCM可以增量处理
gcm = SM4_GCM(key)
for chunk in input_stream:
# 边接收边加密
encrypted_chunk, tag = gcm.update(chunk)
output_stream.write(encrypted_chunk)
# 最后获取完整认证标签
final_tag = gcm.finalize()
CCM的限制:
def ccm_encrypt_stream(input_stream, output_stream, key):
# 必须先缓存全部数据计算CBC-MAC
all_data = b""
for chunk in input_stream:
all_data += chunk # 内存爆炸!
# 然后才能开始加密
result = ccm_encrypt(all_data, key)
# 不适合大流媒体文件
-
标准化和库支持
服务器加密库生态:OpenSSL: - 支持: AES-GCM (高度优化) - 支持: SM4-GCM (通过EVP接口) - CCM支持: 有,但优化较少 BoringSSL (Google): - 优先: ChaCha20-Poly1305和AES-GCM - CCM: 仅基础支持 Intel IPP Cryptography: - 优化: AES-GCM (AVX-512加速) - CCM: 无专门优化 TLS 1.3标准强制要求:
允许的AEAD算法:
- AES-128-GCM
- AES-256-GCM
- ChaCha20-Poly1305
- (未来可能加入SM4-GCM)
明确排除:CCM模式
原因:性能和实现一致性考虑
6. 灵活的认证数据(AAD)处理
服务器复杂协议需求:
HTTPS请求加密示例
func encryptHTTPSRequest(req *http.Request, key []byte) {
// 构建AAD:包含大量元数据
aad := buildAAD(
req.Method,
req.URL.Path,
req.Header,
req.Trailer,
timestamp,
requestID,
)
// GCM高效处理长AAD
ciphertext, tag := sm4.GCMEncrypt(
req.Body,
key,
nonce,
aad, // 可能很长
)
}
CCM对AAD长度有限制,且处理效率不如GCM
性能基准测试对比
测试环境:阿里云ecs.g7.8xlarge (32 vCPU)
测试脚本结果
results = {
"SM4-GCM": {
"throughput_1KB": "850 MB/s",
"throughput_1MB": "920 MB/s",
"latency_p99": "1.2 ms",
"cpu_utilization": "65%", # 多核利用
},
"SM4-CCM": {
"throughput_1KB": "210 MB/s",
"throughput_1MB": "230 MB/s",
"latency_p99": "4.8 ms",
"cpu_utilization": "25%", # 单核瓶颈
}
}
- 实际场景选择指南
决策流程图
开始选择
│
├── 是嵌入式设备? → 考虑:
│ ├── RAM < 64KB? → ✅ CCM
│ ├── 需要实时响应? → ✅ CCM
│ ├── 代码空间紧张? → ✅ CCM
│ └── 数据包小且频繁? → ✅ CCM
│
└── 是服务器环境? → 考虑:
├── 处理大文件/流? → ✅ GCM
├── 高并发需求? → ✅ GCM
├── 有硬件加速? → ✅ GCM
├── 需要TLS 1.3? → ✅ GCM
└── 特殊:HSM/硬件加密卡 → 可能CCM(确定性)
国密场景具体建议
嵌入式/IoT设备:
推荐:SM4-CCM
#if defined(STM32) || defined(ESP32) || defined(NRF52)
#define USE_SM4_CCM 1
配置示例
struct iot_crypto_config {
.mode = SM4_CCM,
.tag_len = 8, // 可根据需要调整
.nonce_len = 13, // LoRaWAN兼容
.l_value = 2, // 消息长度字段大小
};
#endif
服务器/云端:
推荐:SM4-GCM
package cloud_crypto
import "github.com/tjfoc/gmsm/sm4"
func NewSM4GCM(key []byte) *sm4.GCM {
// 使用GCM模式
block, _ := sm4.NewCipher(key)
gcm, _ := cipher.NewGCMWithNonceSize(block, 12)
return gcm
}
Web服务器中间件
func EncryptionMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 使用SM4-GCM加密响应
encrypted := sm4GCM.Encrypt(responseData)
// ...
})
}
混合架构(边缘计算):
边缘网关:需要兼顾
class EdgeCrypto:
def __init__(self, is_resource_constrained=True):
if is_resource_constrained:
# 边缘设备端:CCM
self.cipher = SM4_CCM()
else:
# 边缘服务器端:GCM
self.cipher = SM4_GCM()
def encrypt_for_cloud(self, data):
# 上传到云:可用GCM优化
return self.cipher.encrypt(data)
- 未来趋势与替代方案
新兴的嵌入式友好方案:
- 轻量级AEAD:
如ASCON(NIST轻量密码竞赛优胜者)
比CCM更小更快
struct ascon_state {
uint64_t state[5]; // 仅40字节
};
适用于超低功耗物联网
2. 国密轻量方案:
目前国密标准中:
- SM4-CCM:最成熟的嵌入式选择
- 正在制定:SM4的轻量级工作模式
- 备选:结合轻量级杂凑算法(如SM3精简版)
服务器端的持续优化:
SM4硬件指令普及:期待类似AES-NI的SM4-NI指令
GPU/FPGA加速:GCM在GPU上并行优势更大
持久内存加密:GCM的随机访问特性更优
7 小结
核心原则:
嵌入式选CCM:因为资源约束是第一要务
服务器选GCM:因为性能吞吐是核心需求
这不是说CCM不安全或GCM太重,而是工程上的最优匹配:
嵌入式设备不能承受GCM的内存开销
服务器不能接受CCM的串行性能瓶颈
在实际项目中,选择标准应该是:
分析资源约束(内存、CPU、带宽)
评估性能需求(吞吐量、延迟、并发)
考虑生态系统(库支持、团队经验)
遵循行业标准(TLS、LoRaWAN等)
- 点赞
- 收藏
- 关注作者
评论(0)