3.18 AES机制详解:对称加密的“瑞士军刀“
一个场景:你需要加密文件
假设你是一个软件开发者,需要加密用户数据。
你打开PKCS#11规范,搜索“AES“——
发现20多种AES机制。
CKM_AES_ECB、CKM_AES_CBC、CKM_AES_GCM、CKM_AES_CTR…
你可能会困惑:
- ECB和CBC有什么区别?
- GCM是什么,为什么推荐使用?
- 密钥生成用什么机制?
更深层的问题是:
为什么AES有这么多模式?
“瑞士军刀“的设计意图
AES就像一把瑞士军刀:
瑞士军刀类比:
瑞士军刀:
├── 一个主体(AES算法)
├── 多种工具(不同模式)
│ ├── 大刀(ECB,简单直接)
│ ├── 小刀(CBC,链式安全)
│ ├── 剪刀(GCM,认证加密)
│ ├── 锯子(CTR,流式加密)
│ └── 开瓶器(XTS,磁盘加密)
├── 根据场景选择工具
└── 不同工具有不同的用途
AES机制:
├── 一个算法(AES加密核心)
├── 多种模式(不同用途)
│ ├── ECB:简单,不安全
│ ├── CBC:经典,需填充
│ ├── GCM:现代,认证加密
│ ├── CTR:流式,无填充
│ └── XTS:磁盘加密专用
├── 根据场景选择模式
└── 不同模式有不同的特性
关键:选择正确的工具(模式)
AES机制概览
AES(Advanced Encryption Standard)是PKCS#11中最常用的对称加密机制,支持多种模式:
AES机制列表:
密钥生成:
CKM_AES_KEY_GEN AES密钥生成(128/192/256位)
基本加密模式:
CKM_AES_ECB ECB模式(电子密码本)
CKM_AES_CBC CBC模式(密码块链接)
CKM_AES_CBC_PAD CBC模式(带PKCS#7填充)
流式加密模式:
CKM_AES_OFB OFB模式(输出反馈)
CKM_AES_CFB8 CFB-8模式(8位密码反馈)
CKM_AES_CFB64 CFB-64模式(64位密码反馈)
CKM_AES_CFB128 CFB-128模式(128位密码反馈)
认证加密模式:
CKM_AES_GCM GCM模式(认证加密)
CKM_AES_CCM CCM模式(认证加密)
CKM_AES_GMAC GMAC(仅认证)
计数器模式:
CKM_AES_CTR CTR模式(计数器)
CKM_AES_CTS CTS模式(密文窃取)
特殊模式:
CKM_AES_XTS XTS模式(磁盘加密)
CKM_AES_KEY_WRAP AES密钥包装
CKM_AES_KEY_WRAP_PAD AES密钥包装(带填充)
MAC模式:
CKM_AES_MAC AES-MAC
CKM_AES_MAC_GENERAL AES-MAC(可变长度)
CKM_AES_CMAC AES-CMAC
CKM_AES_XCBC_MAC AES-XCBC-MAC
AES密钥生成(CKM_AES_KEY_GEN)
AES密钥通过C_GenerateKey生成,支持三种长度:
/* AES密钥生成示例 */
CK_MECHANISM mechanism = {CKM_AES_KEY_GEN, NULL_PTR, 0};
CK_ULONG keyLength = 32; // 256位(推荐)
CK_BBOOL bTrue = CK_TRUE;
CK_ATTRIBUTE template[] = {
{CKA_VALUE_LEN, &keyLength, sizeof(keyLength)}, // 密钥长度
{CKA_ENCRYPT, &bTrue, sizeof(bTrue)}, // 可加密
{CKA_DECRYPT, &bTrue, sizeof(bTrue)}, // 可解密
};
CK_OBJECT_HANDLE hKey;
rv = C_GenerateKey(hSession, &mechanism, template, 3, &hKey);
密钥长度选择:
| 密钥长度 | 位数 | 推荐度 | 安全性 |
|---|---|---|---|
| AES-128 | 128位 | 可用 | 足够安全(2030年前) |
| AES-192 | 192位 | 推荐 | 高安全性 |
| AES-256 | 256位 | 最推荐 | 最高安全性 |
ECB模式:简单但危险
ECB(Electronic Codebook)是最简单的模式:
/* ECB加密示例 */
CK_MECHANISM mechanism = {CKM_AES_ECB, NULL_PTR, 0};
rv = C_EncryptInit(hSession, &mechanism, hKey);
rv = C_Encrypt(hSession, data, dataLen, encrypted, &encLen);
ECB特点:
ECB模式特点:
优点:
├── 简单,不需要IV
├── 可以并行加密
└── 每个块独立加密
缺点:
├── 相同明文块 → 相同密文块
├── 模式可被识别
└── 不安全,不推荐使用
示例:
明文:AAAA AAAA AAAA
密文:XXXX XXXX XXXX ← 相同块产生相同密文!
攻击:可以从密文识别模式
结论:ECB仅用于教学,生产环境禁用
CBC模式:经典但需填充
CBC(Cipher Block Chaining)是经典模式:
/* CBC加密示例 */
CK_BYTE iv[16] = {0}; // 初始向量
CK_MECHANISM mechanism = {CKM_AES_CBC, iv, 16};
rv = C_EncryptInit(hSession, &mechanism, hKey);
rv = C_Encrypt(hSession, data, dataLen, encrypted, &encLen);
CBC特点:
CBC模式特点:
优点:
├── 相同明文 → 不同密文(使用IV)
├── 安全性比ECB好
└── 广泛使用
缺点:
├── 需要IV(不能重复使用)
├── 需要填充(PKCS#7)
├── 不能并行加密
└── 填充oracle攻击风险
IV要求:
├── 每次加密使用新IV
├── IV可以公开传输
└── IV不能预测或重复
GCM模式:现代认证加密
GCM(Galois/Counter Mode)是推荐的模式:
/* GCM加密示例 */
CK_GCM_PARAMS gcmParams = {
.pIv = iv, // IV(12字节推荐)
.ulIvLen = 12,
.ulIvBits = 96,
.pAAD = aad, // 附加认证数据
.ulAADLen = aadLen,
.ulTagBits = 128 // 认证标签长度
};
CK_MECHANISM mechanism = {CKM_AES_GCM, &gcmParams, sizeof(gcmParams)};
rv = C_EncryptInit(hSession, &mechanism, hKey);
rv = C_Encrypt(hSession, data, dataLen, encrypted, &encLen);
GCM特点:
GCM模式特点:
优点:
├── 认证加密(AEAD)
├── 同时保证机密性和完整性
├── 不需要填充
├── 可以验证数据完整性
└── 现代推荐模式
输出:
├── 密文数据
├── 认证标签(Tag)
└── 标签用于验证完整性
AAD(附加认证数据):
├── 不加密,但认证
├── 如:消息头、元数据
└── 用于验证完整性
IV要求:
├── 推荐12字节IV
├── IV绝对不能重复
└── 重复IV会泄露认证密钥
CTR模式:流式加密
CTR(Counter Mode)是流式加密模式:
/* CTR加密示例 */
CK_BYTE ctr[16] = {0}; // 计数器初始值
CK_AES_CTR_PARAMS ctrParams = {128, {0}}; // 128位计数器,初值全零
CK_MECHANISM mechanism = {CKM_AES_CTR, &ctrParams, sizeof(ctrParams)};
rv = C_EncryptInit(hSession, &mechanism, hKey);
rv = C_Encrypt(hSession, data, dataLen, encrypted, &encLen);
CTR特点:
CTR模式特点:
优点:
├── 流式加密,不需要填充
├── 可以并行加密
├── 加密和解密相同操作
└── 适合随机访问
缺点:
├── 计数器绝对不能重复
├── 重用计数器会泄露明文
└── 没有完整性认证
适用场景:
├── 流式数据传输
├── 随机访问加密
└── 网络通信
密钥包装(Key Wrap)
AES Key Wrap用于安全导出密钥:
/* 密钥包装示例 */
CK_MECHANISM mechanism = {CKM_AES_KEY_WRAP, NULL_PTR, 0};
rv = C_WrapKey(hSession, &mechanism, hWrappingKey, hKeyToWrap,
wrappedKey, &wrappedKeyLen);
rv = C_UnwrapKey(hSession, &mechanism, hWrappingKey,
wrappedKey, wrappedKeyLen, template, count, &hUnwrappedKey);
密钥包装用途:
密钥包装用途:
场景:
├── 导出密钥到另一个Token
├── 备份密钥
├── 传输密钥
└── 密钥分发
特点:
├── 加密密钥值
├── 保持密钥属性
├── 只能用对称密钥包装
└── 不泄露明文密钥值
模式选择指南
AES模式选择指南:
场景 推荐模式 原因
───────────────────────────────────────────────────────
一般加密 GCM 认证加密
网络通信 GCM/CTR 高性能
文件加密 CBC-PAD/GCM 经典可靠
磁盘加密 XTS 专门设计
密钥导出 KEY_WRAP 安全包装
流式数据 CTR 无填充
高速并行 ECB(禁用) 不安全
───────────────────────────────────────────────────────
不推荐:
├── ECB:不安全,模式泄露
├── CBC无填充:需要手动处理
└── 原始模式:没有完整性认证
推荐:
├── GCM:现代标准,认证加密
├── CBC-PAD:经典,兼容性好
└── KEY_WRAP:密钥导出专用
本篇小结
AES是对称加密的“瑞士军刀“:
机制数量:
- 约20种AES机制
- 密钥生成、加密、认证、包装
密钥生成:
- CKM_AES_KEY_GEN
- 128/192/256位
加密模式:
- ECB:简单,不安全,禁用
- CBC:经典,需IV和填充
- GCM:现代,认证加密,推荐
- CTR:流式,高性能
密钥包装:
- CKM_AES_KEY_WRAP
- 安全导出密钥
模式选择:
- 一般加密:GCM
- 文件加密:CBC-PAD
- 网络通信:CTR
- 磁盘加密:XTS
下一节,我们将分析RSA机制详解——非对称加密的“门面担当“。
【下集预告】
RSA有多少种机制?
PKCS#1和PSS有什么区别?
OAEP加密如何使用?
RSA密钥如何生成?
下一节,RSA机制详解。