2. 对称加密基础

对称加密是密码学中最古老、最直观的加密方式,也是现代数据加密传输体系的基石。本章将系统阐述对称加密的核心原理、流密码与分组密码的本质区别,并深入剖析 DES 与 AES 两种最具代表性的对称加密算法。

2.1 对称加密原理

对称加密(Symmetric Encryption)使用同一个密钥完成数据的加密与解密操作。发送方使用密钥将明文转换为密文,接收方使用相同的密钥将密文还原为明文。其核心安全假设是:密钥必须在通信双方之间安全共享,且不能被第三方获取。

核心公式:
加密:C = E(K, P)
解密:P = D(K, C)
其中 P 为明文,C 为密文,K 为密钥,E 为加密算法,D 为解密算法。

对称加密具有以下关键特性:

  • 效率高:算法计算量小,适合加密大量数据。
  • 密钥管理挑战:每对通信双方需要共享一个密钥,n 方通信需要 n(n-1)/2 个密钥。
  • 提供机密性:确保未授权方无法读取明文内容。
  • 不提供不可否认性:由于密钥共享,无法唯一确定消息来源。
对称加密通信模型 发送方 明文 P 加密 E(K, P) 密文 C 接收方 密钥 K 密钥 K 必须通过安全信道(如面对面交换、公钥加密传输)预先共享 加密和解密使用完全相同的密钥,这是对称加密的本质特征

2.2 流密码与分组密码的区别

对称加密根据处理数据的方式不同,分为流密码(Stream Cipher)和分组密码(Block Cipher)两大类。两者在加密粒度、实现方式、应用场景上存在本质差异。

对比维度 流密码 分组密码
处理单位 逐比特或逐字节 固定大小的数据块(如 64 位、128 位)
加密方式 密钥流与明文流逐位异或 对每个数据块进行多轮置换与代换
错误传播 无错误传播(单比特错误仅影响对应位) 有错误传播(CBC 模式中错误影响后续块)
实现复杂度 硬件实现简单,速度快 软件实现灵活,安全性分析成熟
典型算法 RC4、ChaCha20 DES、3DES、AES、SM4
适用场景 实时通信、流媒体、资源受限设备 文件加密、数据库加密、网络协议(TLS)
选择建议:流密码适合数据长度不确定或需要低延迟的场景(如语音通话);分组密码适合需要高安全性和标准化支持的场景(如 HTTPS 传输)。现代密码学实践中,分组密码的使用更为广泛。
流密码与分组密码加密流程对比 流密码 密钥 K 密钥流生成器 密钥流 ⊕ 异或 密文流 明文流逐位输入 逐位异或运算 分组密码 密钥 K 明文块 (128位) 多轮迭代 (置换+代换) 密文块 (128位) 密钥扩展生成轮密钥 10/12/14 轮迭代

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
AES 加密单轮结构(SPN 网络) 输入状态 SubBytes S盒代换 ShiftRows 行移位 MixColumns 列混淆 AddRoundKey 轮密钥加 输出状态 轮密钥 状态矩阵(4×4 字节) a₀₀ a₀₁ a₀₂ a₀₃ a₁₀ a₁₁ a₁₂ a₁₃ a₂₀ a₂₁ a₂₂ a₂₃ a₃₀ a₃₁ a₃₂ a₃₃ 最后一轮省略 MixColumns 步骤,仅执行 SubBytes → ShiftRows → AddRoundKey AES-128 共 10 轮,AES-192 共 12 轮,AES-256 共 14 轮

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())  # 输出:这是需要加密传输的敏感数据