2. 对称加密基础
对称加密是密码学中最古老、最直观的加密方式,也是现代数据加密传输体系的基石。本章将系统阐述对称加密的核心原理、流密码与分组密码的本质区别,并深入剖析 DES 与 AES 两种最具代表性的对称加密算法。
2.1 对称加密原理
对称加密(Symmetric Encryption)使用同一个密钥完成数据的加密与解密操作。发送方使用密钥将明文转换为密文,接收方使用相同的密钥将密文还原为明文。其核心安全假设是:密钥必须在通信双方之间安全共享,且不能被第三方获取。
核心公式:
加密:C = E(K, P)
解密:P = D(K, C)
其中 P 为明文,C 为密文,K 为密钥,E 为加密算法,D 为解密算法。
加密:C = E(K, P)
解密:P = D(K, C)
其中 P 为明文,C 为密文,K 为密钥,E 为加密算法,D 为解密算法。
对称加密具有以下关键特性:
- 效率高:算法计算量小,适合加密大量数据。
- 密钥管理挑战:每对通信双方需要共享一个密钥,n 方通信需要 n(n-1)/2 个密钥。
- 提供机密性:确保未授权方无法读取明文内容。
- 不提供不可否认性:由于密钥共享,无法唯一确定消息来源。
2.2 流密码与分组密码的区别
对称加密根据处理数据的方式不同,分为流密码(Stream Cipher)和分组密码(Block Cipher)两大类。两者在加密粒度、实现方式、应用场景上存在本质差异。
| 对比维度 | 流密码 | 分组密码 |
|---|---|---|
| 处理单位 | 逐比特或逐字节 | 固定大小的数据块(如 64 位、128 位) |
| 加密方式 | 密钥流与明文流逐位异或 | 对每个数据块进行多轮置换与代换 |
| 错误传播 | 无错误传播(单比特错误仅影响对应位) | 有错误传播(CBC 模式中错误影响后续块) |
| 实现复杂度 | 硬件实现简单,速度快 | 软件实现灵活,安全性分析成熟 |
| 典型算法 | RC4、ChaCha20 | DES、3DES、AES、SM4 |
| 适用场景 | 实时通信、流媒体、资源受限设备 | 文件加密、数据库加密、网络协议(TLS) |
选择建议:流密码适合数据长度不确定或需要低延迟的场景(如语音通话);分组密码适合需要高安全性和标准化支持的场景(如 HTTPS 传输)。现代密码学实践中,分组密码的使用更为广泛。
2.3 常见的对称加密算法
2.3.1 DES(数据加密标准)
DES(Data Encryption Standard)由 IBM 于 1977 年提出,是美国联邦信息处理标准(FIPS 46-3)。DES 采用 56 位密钥,对 64 位数据块进行 16 轮 Feistel 网络迭代加密。
| 参数 | DES | 3DES |
|---|---|---|
| 密钥长度 | 56 位 | 112 位 或 168 位 |
| 分组大小 | 64 位 | 64 位 |
| 轮数 | 16 轮 | 48 轮(3×16) |
| 安全强度 | 已不安全(可被暴力破解) | 中等(逐渐被淘汰) |
| 当前状态 | 已废弃 | 建议迁移至 AES |
安全警告:DES 的 56 位密钥空间(约 7.2×10¹⁶ 种组合)在 1999 年已被电子前哨基金会(EFF)的专用硬件在 22 小时内破解。任何新的系统设计都不应使用 DES 或 3DES。
2.3.2 AES(高级加密标准)
AES(Advanced Encryption Standard)由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计(原称 Rijndael),于 2001 年被 NIST 采纳为 FIPS 197 标准。AES 是目前全球使用最广泛的对称加密算法。
AES 的核心设计特点:
- 非 Feistel 结构:采用 SPN(Substitution-Permutation Network)结构,每轮同时处理整个数据块。
- 可变密钥长度:支持 128 位、192 位、256 位三种密钥长度,对应 10、12、14 轮迭代。
- 固定分组大小:数据块固定为 128 位(16 字节),以 4×4 字节矩阵形式组织。
- 四步轮函数:SubBytes(字节代换)、ShiftRows(行移位)、MixColumns(列混淆)、AddRoundKey(轮密钥加)。
| AES 变体 | 密钥长度 | 轮数 | 安全级别 | 典型应用 |
|---|---|---|---|---|
| AES-128 | 128 位 | 10 轮 | 足够安全 | Wi-Fi(WPA2/WPA3)、TLS 1.3 |
| AES-192 | 192 位 | 12 轮 | 高安全 | 政府机密级 |
| AES-256 | 256 位 | 14 轮 | 最高安全 | 顶级机密、区块链、VPN |
2.3.3 算法对比与选型建议
| 算法 | 密钥长度 | 分组大小 | 结构 | 安全状态 | 性能(软件) |
|---|---|---|---|---|---|
| DES | 56 位 | 64 位 | Feistel | 已破解 | 慢(已过时) |
| 3DES | 112/168 位 | 64 位 | Feistel | 不推荐 | 慢(3 倍 DES) |
| AES | 128/192/256 位 | 128 位 | SPN | 安全 | 快(硬件加速) |
| SM4 | 128 位 | 128 位 | Feistel | 安全(国标) | 快 |
| ChaCha20 | 256 位 | 流密码 | ARX | 安全 | 极快(无硬件加速时) |
选型建议:对于绝大多数现代应用,AES-256 是最佳选择——安全性经过全球密码学家 20 年验证,硬件加速指令(AES-NI)使其性能优异。移动端或嵌入式场景可考虑 ChaCha20-Poly1305 组合。国内合规场景需使用 SM4 国密算法。
2.4 对称加密的工作模式
分组密码需要配合工作模式(Mode of Operation)来处理超过一个分组的数据。常见模式包括:
- ECB(电子密码本模式):每个分组独立加密,相同明文产生相同密文,不安全。
- CBC(密码分组链接模式):每个分组与前一个密文分组异或后再加密,需要初始化向量(IV)。
- CFB(密码反馈模式):将分组密码转换为流密码,适合实时数据流。
- OFB(输出反馈模式):生成密钥流与明文异或,错误不传播。
- CTR(计数器模式):使用递增计数器生成密钥流,支持并行加密,推荐使用。
- GCM(伽罗瓦/计数器模式):在 CTR 基础上增加认证标签,同时提供机密性和完整性。
重要提醒:ECB 模式不应在任何新系统中使用。CBC 模式需要安全的 IV 生成机制。GCM 模式是当前最推荐的认证加密模式,同时提供加密和完整性校验。
// AES-256-GCM 加密示例(Python + cryptography 库)
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
# 生成 256 位密钥(32 字节)
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
# 生成 96 位 nonce(12 字节)
nonce = os.urandom(12)
# 待加密数据
plaintext = b"这是需要加密传输的敏感数据"
# 关联数据(可选,用于认证但不加密)
aad = b"header"
# 加密:返回密文 + 认证标签(16 字节)
ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
# 解密
decrypted = aesgcm.decrypt(nonce, ciphertext, aad)
print(decrypted.decode()) # 输出:这是需要加密传输的敏感数据