前置知识: 网络安全

对称加密

5 minIntermediate2026/6/14

对称加密原理:AES、DES、3DES、ChaCha20 等算法详解与对比。

1. 对称加密基础

1.1 基本概念

对称加密使用同一密钥进行加密和解密,核心优势是速度快、效率高。

EK(M)=C,DK(C)=ME_K(M) = C, \quad D_K(C) = M

其中 EE 为加密函数,DD 为解密函数,KK 为密钥,MM 为明文,CC 为密文。

1.2 工作模式

模式全称特点并行随机访问
ECBElectronic Codebook相同明文→相同密文
CBCCipher Block Chaining需要 IV解密
CTRCounter流式加密
GCMGalois/Counter认证加密
CFBCipher Feedback流式加密解密
OFBOutput Feedback流式加密

推荐:GCM 模式(提供加密+认证),CTR 模式(仅需加密时)。

1.3 填充方式

方式描述
PKCS#7每个填充字节值为填充长度
Zero Padding填充零字节
ISO 10126随机填充+最后一字节为长度
ANSI X.923零填充+最后一字节为长度

Padding Oracle 攻击:CBC 模式下,若服务器泄露填充验证结果,可逐字节解密密文。

2. DES 算法

2.1 算法概述

参数
密钥长度56 位(64 位含 8 位校验)
分组长度64 位
轮数16 轮
安全性已不安全,仅教学用途

2.2 Feistel 结构

DES 采用 Feistel 网络:

Li=Ri1L_i = R_{i-1}

Ri=Li1f(Ri1,Ki)R_i = L_{i-1} \oplus f(R_{i-1}, K_i)

2.3 3DES(Triple DES)

使用三次 DES 加密:

C=EK3(DK2(EK1(M)))C = E_{K_3}(D_{K_2}(E_{K_1}(M)))

  • 双密钥模式:K1=K3K_1 = K_3,有效密钥 112 位
  • 三密钥模式:有效密钥 168 位
  • 速度慢,已逐步被 AES 替代

3. AES 算法

3.1 算法概述

参数AES-128AES-192AES-256
密钥长度128 位192 位256 位
分组长度128 位128 位128 位
轮数101214
安全性安全安全高安全

3.2 AES 加密流程

每轮包含四个操作:

  1. SubBytes:字节替换(S 盒)
  2. ShiftRows:行移位
  3. MixColumns:列混合(最后一轮省略)
  4. AddRoundKey:轮密钥加
明文 → AddRoundKey → [SubBytes → ShiftRows → MixColumns → AddRoundKey] × (Nr-1) → SubBytes → ShiftRows → AddRoundKey → 密文

3.3 S 盒

AES 的 S 盒基于有限域 GF(28)GF(2^8) 上的乘法逆元和仿射变换:

sij=Affine(x1)在 GF(28) 上s_{ij} = \text{Affine}(x^{-1}) \quad \text{在 } GF(2^8) \text{ 上}

3.4 代码示例

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
import os

# AES-256-GCM 加密
def aes_gcm_encrypt(plaintext, key):
    nonce = os.urandom(12)
    cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
    encryptor = cipher.encryptor()
    ciphertext = encryptor.update(plaintext) + encryptor.finalize()
    return nonce, ciphertext, encryptor.tag

# AES-256-GCM 解密
def aes_gcm_decrypt(ciphertext, key, nonce, tag):
    cipher = Cipher(algorithms.AES(key), modes.GCM(nonce, tag))
    decryptor = cipher.decryptor()
    return decryptor.update(ciphertext) + decryptor.finalize()

4. ChaCha20

4.1 算法概述

参数
密钥长度256 位
Nonce96 位
流密码
轮数20 轮

4.2 优势

  • 纯软件实现速度优于 AES(无 AES-NI 时)
  • 常数时间执行,抗侧信道攻击
  • ChaCha20-Poly1305 提供认证加密

4.3 与 AES 对比

对比项AES-GCMChaCha20-Poly1305
硬件加速AES-NI 支持无专用指令
软件性能较慢更快
侧信道安全需注意实现天然安全
TLS 支持广泛Chrome/Google 主推

5. 密钥管理

5.1 密钥生成

import os

# 安全随机密钥
key = os.urandom(32)  # AES-256 密钥

5.2 密钥派生

from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes

kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=600000,  # OWASP 推荐
)
key = kdf.derive(password.encode())

5.3 密钥存储

方式安全等级适用场景
硬编码极低绝对禁止
配置文件开发环境
环境变量容器化部署
KMS生产环境
HSM最高金融/合规

6. 算法选择指南

场景推荐算法
通用加密AES-256-GCM
移动/嵌入式ChaCha20-Poly1305
大文件加密AES-256-CTR + HMAC
兼容旧系统3DES(仅过渡)
禁止使用DES、RC4、Blowfish