Skip to content

按原语类型组织:分组密码 → 流密码 → 分组模式 → AEAD。

分组密码

参考:FIPS 197 AES · CTF Wiki

结构类型

  • Feistel:DES、3DES;轮函数不必可逆
  • SPN:AES——SubBytes(S 盒)、ShiftRows、MixColumns、AddRoundKey

主要算法

算法分组/密钥状态
DES / 3DES64 / 56 bit已弃用(密钥过短)
AES128 / 128·192·256通用标准
IDEA64 / 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 重用 → 密钥流重用 → 灾难

分组模式

参考:NIST SP 800-38A

模式需要 IV并行主要风险
ECB否是相同明文块 → 相同密文块(企鹅图)
CBC是解密可并行Padding Oracle;IV 须随机
CTRNonce是Nonce 重用 → 密钥流重用
GCMNonce是见 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)

参考:RFC 5116 · RFC 8439

  • 同时提供机密性与完整性;解密前验证 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
PythonPyNaClSecretBox、crypto_aead
PythoncryptographyAESGCM、ChaCha20Poly1305
Rustaes-gcm、chacha20poly1305RustCrypto
<p class="kb-note-inline">练习:用 libsodium 写文件加密工具。本站笔记 <span class="crypto-pending">待撰写</span>。</p>

WIZARD