跳转至

不同算法对比

加密算法对比总结


一、对称加密 vs 非对称加密

对比维度 对称加密 非对称加密
密钥数量 单一密钥(加解密共用) 密钥对(公钥 + 私钥)
加密速度 快(适合大数据量) 慢(100~1000 倍于对称加密)
密钥分发 困难,需安全通道传输密钥 公钥可公开,私钥本地保管
典型算法 AES、DES、3DES、SM4、ChaCha20 RSA、ECC、SM2、ElGamal
典型用途 数据加密传输、本地存储 数字签名、密钥交换、身份认证
密钥长度 128/192/256 位(AES) RSA 2048/4096 位,ECC 256 位
安全性基础 混淆与扩散 数学困难问题(大数分解、离散对数)

红队视角:TLS 握手阶段用非对称加密(RSA/ECDHE)交换会话密钥,后续数据传输用对称加密(AES-GCM / ChaCha20-Poly1305)。


二、常见对称加密算法对比

算法 分组长度 密钥长度 轮数 安全性 当前建议
DES 64 位 56 位 16 ⛔ 已破解(暴力枚举可行) 绝对不用
3DES 64 位 112/168 位 48 ⚠️ 弱(Sweet32 攻击) 逐步淘汰
AES 128 位 128/192/256 位 10/12/14 ✅ 安全(量子中等影响) 推荐使用
SM4 128 位 128 位 32 ✅ 安全(国密标准) 国内推荐
Blowfish 64 位 32~448 位 16 ⚠️ 老旧(64位分组有风险) 不推荐新项目
Twofish 128 位 128/192/256 位 16 ✅ 安全 可替代 AES
ChaCha20 —(流密码) 256 位 20 ✅ 安全(移动端友好) 推荐流加密

三、分组密码工作模式详解

3.1 ECB(Electronic Codebook,电子密码本模式)

Text Only
明文分组 → [加密(Key)] → 密文分组
明文分组 → [加密(Key)] → 密文分组  ← 相同明文 → 相同密文!
特性 说明
并行性 加密/解密均可并行
错误传播 单分组错误不影响其他分组
安全缺陷 相同明文块产生相同密文块,保留数据模式
是否需要 IV 否
是否使用 坚决不使用

经典案例:ECB 加密 Tux 企鹅图片,轮廓清晰可见。这就是 ECB 模式不适合加密结构化数据的原因。

红队要点:遇到 ECB 模式可进行重放攻击和块重排攻击;某些应用在 CBC/CTR 不可用时会 fallback 到 ECB,可作为 bypass 思路。

3.2 CBC(Cipher Block Chaining,密文分组链接模式)

Text Only
明文分组[i] XOR 密文分组[i-1] → [加密(Key)] → 密文分组[i]
初始:密文分组[-1] = IV
特性 说明
并行性 加密串行,解密可并行
错误传播 1 位错误影响当前分组和下一分组
是否需要 IV 是,且 IV 必须不可预测
安全缺陷 易受 Padding Oracle 攻击
是否使用 配合 HMAC 可安全使用

Padding Oracle 攻击(红队重点): - 原理:服务器解密后校验 padding 是否合法,返回不同错误信息 - 利用:攻击者逐个字节猜测明文,最终完全解密 - 防御:使用 Encrypt-then-MAC 模式,拒绝返回 padding 错误细节

3.3 CFB(Cipher Feedback,密文反馈模式)

Text Only
密文分组[i] = 明文分组[i] XOR E(Key, 密文分组[i-1])
特性 说明
特点 将分组密码转为流密码
并行性 加密串行,解密可并行
是否需要 IV 是,IV 需唯一
是否使用 较少使用,建议用 CTR 替代

3.4 OFB(Output Feedback,输出反馈模式)

Text Only
输出[i] = E(Key, 输出[i-1])
密文分组[i] = 明文分组[i] XOR 输出[i]
特性 说明
特点 密钥流独立于明文/密文
并行性 密钥流可预计算
错误传播 单比特错误不变,无扩散
是否使用 较少使用

3.5 CTR(Counter,计数器模式)

Text Only
密文分组[i] = 明文分组[i] XOR E(Key, Nonce || Counter[i])
特性 说明
并行性 加解密均可并行
是否需填充 否(流密码模式)
是否需要 IV Nonce(必须唯一,不要求不可预测)
是否使用 ✅ 推荐
安全要点 Nonce 绝不能重用!同一密钥 + 同一 Nonce = 灾难

3.6 GCM(Galois/Counter Mode)

Text Only
CTR 加密 + GHASH 认证标签(AEAD)
特性 说明
认证加密 同时提供机密性和完整性(AEAD)
并行性 加密和认证均可并行
是否需要 IV 12 字节 Nonce(推荐)
是否使用 强烈推荐(TLS 1.3 首选)
安全要点 Nonce 绝不能重用!支持 Associated Data(AAD)

模式对比总结

模式 并行加密 并行解密 需 IV 需填充 认证 推荐
ECB ✅ ✅ 否 是 否 ❌
CBC ❌ ✅ 是 是 否 ⚠️
CFB ❌ ✅ 是 否 否 ⚠️
OFB ❌ ❌ 是 否 否 ⚠️
CTR ✅ ✅ 是 否 否 ✅
GCM ✅ ✅ 是 否 是 ✅✅

四、填充方式详解

分组密码要求明文长度是分组长度的整数倍,不满足时需要填充。

4.1 PKCS#7(最常用)

规范:RFC 5652,PKCS#5 是 PKCS#7 的特例(固定 8 字节)

Text Only
缺 N 字节 → 每个填充字节值为 N(N 取值范围 1~blocksize)

示例(16 字节分组,明文 26 字节,缺 6 字节):
|...明文 26 字节...|0x06 0x06 0x06 0x06 0x06 0x06|
特性 说明
填充范围 1 ~ 255 字节
是否一定填充 是,即使明文正好为块大小,也加一个完整填充块
用途 几乎所有分组密码的默认填充
安全 填充值固定可预测,是 Padding Oracle 攻击的根源

4.2 PKCS#5

本质上是 PKCS#7 在 8 字节分组下的特例。

对比 PKCS#5 PKCS#7
块大小 固定 8 字节 1~255 字节
算法 DES / 3DES AES 等任意分组
现代用法 通常与 PKCS#7 混用

4.3 Zero Padding

Text Only
缺 N 字节 → 填充 N 个 0x00
特性 说明
风险 若明文末尾自身包含 0x00,解密后无法区分
适用 仅当明文编码保证不以 0x00 结尾(如字符串)
不推荐 确定性 padding,信息泄露风险

4.4 ISO 10126

Text Only
缺 N 字节 → 前 N-1 字节随机值,最后一字节为 N
特性 说明
随机性 填充内容含随机值,抵抗部分选择密文攻击
弃用原因 已被 PKCS#7 替代,缺陷类似

4.5 ANSI X.923

Text Only
缺 N 字节 → 前 N-1 字节为 0x00,最后一字节为 N
特性 说明
特点 填充值确定但内容固定,安全性弱

4.6 ISO/IEC 7816-4

Text Only
缺 N 字节 → 第一个填充字节为 0x80,其余为 0x00

填充方式对比

填充方式 最小 最大 确定性 是否推荐
PKCS#7 1 blocksize 是(值固定) ✅ 最常用
Zero 0 blocksize-1 是 ❌
ISO 10126 1 blocksize 部分随机 ⚠️ 已弃用
ANSI X.923 1 blocksize 是 ❌
ISO 7816-4 1 blocksize 是 仅智能卡

五、常见非对称加密算法对比

算法 安全基础 推荐密钥长度 加密 签名 密钥交换 性能
RSA 大整数分解 2048~4096 bit ✅ ✅ ✅ 慢(密钥越长越慢)
ECC 椭圆曲线离散对数 256 bit — — ✅ 快(短密钥高安全)
ECDSA 同上 256 bit — ✅ — 签名/验签快
Ed25519 扭曲爱德华曲线 256 bit — ✅ — ✅ 更快更安全
SM2 椭圆曲线 256 bit ✅ ✅ ✅ ✅ 国密标准
ElGamal 离散对数 2048~4096 bit ✅ ✅ — ⚠️ 密文长度为明文 2 倍
DH/ECDH 离散对数/椭圆曲线 2048/256 bit — — ✅ 仅密钥协商

安全等价性(对称密钥 → RSA/ECC): - AES-128 ≈ RSA-3072 ≈ ECC-256 - AES-256 ≈ RSA-15360 ≈ ECC-512


六、加密填充 vs 签名填充(RSA 重点)

RSA 操作有两种完全不同的填充体系:

填充方案 用途 标准 安全性
PKCS#1 v1.5 加密 RFC 2313 ⚠️ 存在 Bleichenbacher 攻击
OAEP 加密 RFC 8017 ✅ 推荐用于加密
PKCS#1 v1.5 签名 签名 RFC 2313 ✅ 仍可安全使用
PSS 签名 RFC 8017 ✅ 推荐用于签名

Bleichenbacher 攻击(红队重点):利用 PKCS#1 v1.5 加密填充的服务器错误响应,可恢复 RSA 加密的会话密钥(如 TLS 降级攻击 ROBOT)。


七、AEAD 认证加密算法对比

传统模式(CBC + HMAC)易出错,现代推荐 AEAD 模式:

AEAD 算法 加密核心 认证方式 并行 标准化 推荐
AES-GCM AES-CTR GHASH(二进制域乘法) ✅ TLS 1.2+ ✅
AES-CCM AES-CTR CBC-MAC ❌ IEEE 802.11 (WPA2) 嵌入式
ChaCha20-Poly1305 ChaCha20 Poly1305 ✅ TLS 1.3 ✅ 移动端
AES-GCM-SIV AES-CTR POLYVAL ✅ RFC 8452 ✅ Nonce 重用抵抗

Nonce 重用问题:GCM/CCM 重用 Nonce 会严重破坏安全性——攻击者可恢复认证密钥,进而伪造任意密文。


八、哈希算法对比

算法 输出长度 块大小 安全性 当前建议
MD5 128 bit 512 bit ⛔ 碰撞已破解 绝对不用
SHA-1 160 bit 512 bit ⛔ SHAttered 攻击 绝对不用
SHA-256 256 bit 512 bit ✅ 安全(量子降低 50%) 推荐
SHA-512 512 bit 1024 bit ✅ 安全 推荐(64位平台更快)
SHA-3 可变 — ✅ 安全 替代备选
BLAKE⅔ 可变 — ✅ 安全,速度更快 推荐
SM3 256 bit 512 bit ✅ 国密标准 国内推荐

HMAC 长度建议:RFC 2104 允许截断,但建议不低于 128 bit。HMAC-SHA256(256 bit)是安全默认选择。


九、红队实战知识点

9.1 常见识别方法

密文特征 可能算法
Base64 编码,长度 16 的倍数 AES-CBC/PKCS7
Base64,长度 44(32 字节原始) AES-256-ECB(无 IV)
Base64,以 = 结尾,短 可能是 DES/3DES
Base64,前几字节/后几字节重复 ECB 模式
Hex,长度固定 576+ RSA-2048
$2a$ / $2b$ 开头 bcrypt
$argon2 开头 Argon2

9.2 攻击面总结

脆弱点 攻击方法
ECB 模式 块重排攻击、已知明文推断
CBC + 无 MAC Padding Oracle、CBC 比特翻转
固定 IV / 可预测 IV CBC 选择密文攻击、BEAST 攻击
Nonce 重用(CTR/GCM) 密钥流恢复、伪造密文
PKCS#1 v1.5 加密填充 Bleichenbacher / ROBOT 攻击
弱密钥 DES 半弱密钥、固定常量
缺少 MAC/认证 密文修改(比特翻转)不被检测
不安全的哈希 MD5/SHA1 碰撞伪造签名
SQL 注入 + 加密字段 必须关注加密操作在哪个层进行

9.3 安全设计原则

  1. 避免自创算法:始终使用标准库,不要自己实现加密
  2. 优先 AEAD:AES-GCM 或 ChaCha20-Poly1305,数据完整性和机密性一步到位
  3. CBC 需配 HMAC:Encrypt-then-MAC 顺序,不同密钥
  4. 随机 IV/Nonce:由 CSPRNG 生成,绝不复用
  5. 密钥独立原则:加密密钥 ≠ MAC 密钥 ≠ 签名密钥
  6. 不要在代码中硬编码密钥:使用 KMS / HSM / 环境变量
  7. 禁用不安全的算法和模式:ECB、DES、RC4、MD5、SHA-1