深色模式
按原语类型组织:分组密码 → 流密码 → 分组模式 → AEAD。
分组密码
参考:FIPS 197 AES · CTF Wiki
结构类型
- Feistel:DES、3DES;轮函数不必可逆
- SPN:AES——SubBytes(S 盒)、ShiftRows、MixColumns、AddRoundKey
主要算法
| 算法 | 分组/密钥 | 状态 |
|---|---|---|
| DES / 3DES | 64 / 56 bit | 已弃用(密钥过短) |
| AES | 128 / 128·192·256 | 通用标准 |
| IDEA | 64 / 128 | 历史;PGP 曾用 |
| Simon / Speck | 轻量级 | IoT 场景 |
<p class="kb-note-inline">练习:CryptoHack · AES;理解 AES S 盒的 GF(2^8) 求逆构造。</p>
流密码
参考:CTF Wiki · 流密码 · RFC 8439 ChaCha20
- RC4:已被攻破(偏差攻击);禁止在新系统中使用
- LFSR:线性反馈移位寄存器;组合多个 LFSR 增强非线性
- ChaCha20:ARX 设计;与 Poly1305 组合为 AEAD;TLS 1.3 可选
- 流密码生成密钥流,与明文异或;Nonce 重用 → 密钥流重用 → 灾难
分组模式
| 模式 | 需要 IV | 并行 | 主要风险 |
|---|---|---|---|
| ECB | 否 | 是 | 相同明文块 → 相同密文块(企鹅图) |
| CBC | 是 | 解密可并行 | Padding Oracle;IV 须随机 |
| CTR | Nonce | 是 | Nonce 重用 → 密钥流重用 |
| GCM | Nonce | 是 | 见 AEAD 节 |
<ul>
<li><strong>PKCS#7 填充</strong>:CBC 常用;解密错误反馈可被利用(Padding Oracle)</li>
<li>生产环境优先 AEAD,避免手写 CBC + HMAC 组合</li>
</ul>
<p class="kb-note-inline">练习:复现 ECB 企鹅图;Cryptopals Set 2。</p>
认证加密(AEAD)
- 同时提供机密性与完整性;解密前验证 MAC,防篡改
- AES-GCM:硬件加速广泛;Nonce 96 bit 唯一,重用可泄露密钥
- ChaCha20-Poly1305:软件实现快;移动端与 TLS 常用
- AES-GCM-SIV:Nonce 误用抗性(RFC 8452)
- AAD:关联数据参与认证但不加密(如 TLS 记录头)
组合顺序(非 AEAD 场景)
- Encrypt-then-MAC 通常最安全
- MAC-then-Encrypt 曾引发历史漏洞
工程实践
- 禁止自研分组模式;使用高层 API
- 密钥分层:CEK 轮换,KEK 驻留 HSM/KMS
| 语言 | 库 | API |
|---|---|---|
| Python | PyNaCl | SecretBox、crypto_aead |
| Python | cryptography | AESGCM、ChaCha20Poly1305 |
| Rust | aes-gcm、chacha20poly1305 | RustCrypto |
<p class="kb-note-inline">练习:用 libsodium 写文件加密工具。本站笔记 <span class="crypto-pending">待撰写</span>。</p>