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