# AES 加密详解：模式、填充与最佳实践

> AES 加密完整指南——密钥长度、ECB/CBC/CTR/GCM 模式、填充、IV 最佳实践及常见错误。

Canonical: https://hsmkit.com/zh/guides/aes-encryption-explained/

Last updated: 2026-04-03

AES（高级加密标准）是全球使用最广泛的对称加密算法。无论是加密数据库、保护文件，还是保障网络传输安全，AES 几乎无处不在。本文介绍 AES 的工作原理及正确使用方法。

## 什么是 AES？

AES 由 NIST 于 2001 年选定，用于替代老化的 DES 算法。它是一种**分组密码**——使用密钥对固定大小的数据块（128 位 / 16 字节）进行加密。

基本参数：
- 分组大小：**128 位**（固定）
- 密钥长度：**128、192 或 256 位**
- 结构：置换-排列网络（SPN）
- 轮数：10 轮（AES-128）、12 轮（AES-192）、14 轮（AES-256）

## AES 密钥长度对比

| 密钥长度 | 安全级别 | 适用场景 |
|----------|---------|---------|
| AES-128 | ~128 位安全 | 通用场景，速度快 |
| AES-192 | ~192 位安全 | 较高安全需求 |
| AES-256 | ~256 位安全 | 政府、长期保密数据 |

AES-128 对所有已知攻击都是安全的。对于需要保密数十年的数据，推荐使用 AES-256。

## AES 工作原理（简化版）

AES 通过多个**轮次**处理数据，每轮包含四个操作：

### 1. 字节替换（SubBytes）
每个字节通过固定查找表（S-Box）替换，提供**混淆性**——使密钥与密文之间的关系变得复杂。

### 2. 行移位（ShiftRows）
4×4 状态矩阵的各行循环移位，提供**扩散性**——将每个字节的影响扩散开来。

### 3. 列混淆（MixColumns）
每列在 GF(2⁸) 中与固定多项式相乘，进一步扩散数据。

### 4. 轮密钥加（AddRoundKey）
当前轮密钥（由主密钥派生）与状态进行 XOR 运算。这是密钥真正参与运算的步骤。

## 工作模式

AES 每次加密一个 16 字节的分组。对于更长的数据，需要选择**工作模式**：

### ECB（电子密码本）—— 大多数场景应避免使用
- 每个分组独立加密
- 相同明文分组总产生相同密文分组
- **问题**：数据中的规律在密文中可见（著名的"ECB 企鹅"问题）
- **仅适用于**：单分组加密、密钥封装

### CBC（密码分组链接）—— 最常见的传统模式
- 每个分组加密前先与前一个密文分组 XOR
- 需要**初始化向量（IV）**
- IV 必须随机且每次加密唯一
- **适用于**：文件加密、数据库字段加密

### CTR（计数器模式）—— 流密码模式
- 加密计数器值后与明文 XOR
- 将 AES 转化为流密码
- 可并行化，无需填充
- **适用于**：高性能加密、流数据

### GCM（Galois/计数器模式）—— 新系统推荐
- CTR 模式 + 认证标签
- 同时提供**机密性和完整性**
- 自动检测篡改
- **适用于**：TLS、API 加密、所有现代系统

## 填充

由于 AES 处理 16 字节分组，非 16 字节倍数的数据需要填充。

**PKCS#7 填充**（最常见）：
- 添加 N 个值为 N 的字节以达到分组边界
- 示例：13 字节数据 → 添加 3 个 `0x03` 字节

```
数据:    48 65 6C 6C 6F（5 字节）
填充后:  48 65 6C 6C 6F 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B（16 字节）
```

GCM 模式不需要填充（流密码模式）。

## IV / Nonce 最佳实践

初始化向量（IV）或 Nonce 对安全性至关重要：

- **绝不重用**同一密钥的 IV
- CBC 模式：使用**随机 16 字节 IV**，与密文一起存储
- GCM 模式：使用**随机 12 字节 Nonce**，与密文一起存储
- CTR 模式：使用唯一的计数器/Nonce 组合

重用 IV 会彻底破坏加密安全性。

## 常见错误

| 错误 | 后果 | 修复方案 |
|------|------|---------|
| 使用 ECB 模式 | 数据规律可见 | 使用 CBC 或 GCM |
| 重用 IV/Nonce | 安全性被破坏 | 每次加密生成新的随机 IV |
| 硬编码密钥 | 密钥泄露 | 使用密钥管理系统 |
| 无认证 | 篡改无法检测 | 使用 GCM 或添加 HMAC |
| 弱密钥派生 | 暴力破解风险 | 基于密码的密钥使用 PBKDF2/bcrypt |

## AES 在支付系统中的应用

在支付行业，AES 用于：
- **PIN 块加密**（AES Format 4，ISO 9564）—— 参见 [PIN 块指南](/zh/guides/pin-block-formats-iso9564/)
- **DUKPT AES**——每笔交易的密钥派生 —— 参见 [DUKPT 指南](/zh/guides/dukpt-key-derivation-tutorial/)
- **TR-31 密钥块**（Version D 使用 AES-256）—— 参见 [TR-31 指南](/zh/guides/what-is-tr31-key-block/)
- **MAC 计算**（AES-CMAC）

## 在线工具

使用我们的 [AES 加密工具](/aes-encryption)：

- 使用 AES-128/192/256 加密和解密数据
- 测试所有模式：ECB、CBC、CFB、OFB、CTR
- 可视化 IV 和填充行为
- 以十六进制或 Base64 格式导出结果

所有处理均在浏览器中完成——您的密钥和数据不会离开您的设备。
