前置知识: 网络安全

对称加密

00:00
5 min Intermediate 2026/6/14

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

1. 对称加密基础

1.1 基本概念

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

其中 为加密函数, 为解密函数, 为密钥, 为明文, 为密文。

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 网络:

2.3 3DES(Triple DES)

使用三次 DES 加密:

  • 双密钥模式:,有效密钥 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 盒基于有限 上的乘法逆和仿射变换

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

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式