Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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-128128位可用足够安全(2030年前)
AES-192192位推荐高安全性
AES-256256位最推荐最高安全性

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机制详解。