加密算法:AES介绍

当然可以 👍

下面是对 AES 各种加密模式(AES Modes of Operation) 的系统性介绍,包括原理、特点、优缺点和适用场景。



🧠 一、AES 是什么?

AES(Advanced Encryption Standard,高级加密标准)是一种 对称加密算法

加密和解密使用相同的密钥。
  • 分组长度:固定为 128 位(16 字节)
  • 密钥长度:支持 128 / 192 / 256 位
  • 当明文超过 16 字节时,需要通过“加密模式(Mode of Operation)”来分块加密。


⚙️ 二、AES 常见加密模式一览表

模式全称是否需要 IV是否支持并行是否能检测篡改说明
ECBElectronic Codebook❌ 否✅ 是❌ 否每块独立加密,不安全
CBCCipher Block Chaining✅ 是❌ 否❌ 否经典模式,块链式依赖
CFBCipher Feedback✅ 是✅ 是❌ 否流加密方式,可逐字节加密
OFBOutput Feedback✅ 是✅ 是❌ 否流模式,错误不会传播
CTRCounter✅ 是(nonce)✅ 是❌ 否高性能流模式,安全高效
GCMGalois/Counter Mode✅ 是(nonce)✅ 是✅ 是同时加密+认证(AEAD)


🔍 三、各模式详解



1️⃣ ECB(Electronic Codebook)

每个 16 字节块独立加密

原理:

C1 = E(P1)
C2 = E(P2)
C3 = E(P3)

特点:

  • 简单,但相同明文块 → 相同密文块。
  • 容易泄露数据结构(如图像或模式)。

优点:

  • 实现简单。

缺点:

  • 不安全(相同明文块有相同密文块)。

用途:

  • 测试、教育演示用,不推荐生产使用。


2️⃣ CBC(Cipher Block Chaining)

每个明文块先与前一密文块异或后再加密

原理:

C1 = E(P1 ⊕ IV)
C2 = E(P2 ⊕ C1)
C3 = E(P3 ⊕ C2)

特点:

  • 依赖前一块密文,需初始向量(IV)。
  • 解密时也需相同 IV。

优点:

  • 安全性高于 ECB。
  • 不同 IV 可确保加密结果不同。

缺点:

  • 不可并行。
  • 解密时一旦出错会影响两块。

用途:

  • 文件加密、数据库字段加密。


3️⃣ CFB(Cipher Feedback)

将 AES 块加密变为流加密,可逐字节处理。

原理:

C1 = P1 ⊕ E(IV)
C2 = P2 ⊕ E(C1)

优点:

  • 无需填充(padding)。
  • 可用于实时数据流。

缺点:

  • 加密错误会传播。

用途:

  • 网络流、实时加密通信。


4️⃣ OFB(Output Feedback)

将输出反馈到下一个加密过程,生成伪随机流。

原理:

O1 = E(IV)
O2 = E(O1)
O3 = E(O2)
C1 = P1 ⊕ O1
C2 = P2 ⊕ O2

优点:

  • 错误不会传播。
  • 流模式,速度快。

缺点:

  • IV 不能重复(否则密钥流泄露)。

用途:

  • 流式加密场景(如语音或视频)。


5️⃣ CTR(Counter Mode)

使用自增计数器,将 AES 转换为流加密。

原理:

C1 = P1 ⊕ E(nonce + 1)
C2 = P2 ⊕ E(nonce + 2)
C3 = P3 ⊕ E(nonce + 3)

优点:

  • 支持并行加密,性能极高。
  • 无需填充。
  • 加解密过程对称。

缺点:

  • 计数器(nonce)绝对不能重复,否则泄露密钥流。

用途:

  • 高性能通信系统、加密传输、磁盘加密。


6️⃣ GCM(Galois/Counter Mode)

在 CTR 模式基础上增加“认证”机制(AEAD 模式)。

原理:

  • 使用计数器生成密钥流。
  • 同时用 Galois 乘法生成“认证标签”(tag)防止篡改。

输出:

密文 + 认证标签(Tag)

优点:

  • 加密 + 防篡改,一步完成。
  • 性能优异(可并行)。

缺点:

  • IV/nonce 必须唯一。

用途:

  • HTTPS / TLS / JWT / REST API。


✅ 四、总结推荐

场景推荐模式原因
文件或本地数据加密CBC兼容性好、安全
网络通信、APIGCM加密+认证
高性能并行加密CTR快速、灵活
流式加密(视频/音频)CFB / OFB支持任意长度
仅教学/测试ECB简单但不安全


🧪 五、Python 实现举例(使用 cryptography

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

# AES-256 CBC 示例
key = urandom(32)  # 256-bit key
iv = urandom(16)   # 128-bit IV

cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
encryptor = cipher.encryptor()
decryptor = cipher.decryptor()

# 加密 / 解密
ciphertext = encryptor.update(b"secret message 1234") + encryptor.finalize()
plaintext = decryptor.update(ciphertext) + decryptor.finalize()


文章标签:

评论(0)