高级加密指南:AES、RSA、ECC 和后量子密码学

这份综合指南深入探讨了现代安全通信系统中使用的高级加密概念、算法和协议。非常适合开发者和安全专业人士。

注意:本指南假设你已经熟悉基础加密概念。如果你是初学者,请从我们的初学者安全建议开始。

对称加密算法

AES (Advanced Encryption Standard)

对称加密的黄金标准,2001年被美国政府采用。

主要特性

  • 密钥大小:128、192 或 256 位
  • 区块大小:128 位
  • 轮数:根据密钥大小分别为 10、12 或 14 轮
  • 性能:高度优化,支持硬件加速

常见模式

  • GCM (Galois/Counter Mode):认证加密,推荐用于大多数场景
  • CBC (Cipher Block Chaining):传统模式,需要单独的 MAC
  • CTR (Counter):可并行化,用于某些协议

ChaCha20

由 Daniel J. Bernstein 设计的现代流密码,作为 AES 替代方案越来越受欢迎。

优势

  • 在没有硬件加速的设备上比 AES 更快
  • 恒定时间实现(抗时序攻击)
  • 设计简单,更容易安全实现
  • 与 Poly1305 配合使用实现认证加密

非对称加密

RSA (Rivest-Shamir-Adleman)

广泛用于密钥交换和数字签名。

关键考虑因素

  • 最小密钥大小:2048 位(建议使用 4096 位以确保长期安全)
  • 性能:与对称加密相比计算成本高
  • 填充方案:加密使用 OAEP,签名使用 PSS
  • 量子威胁:容易受到量子计算机攻击(Shor 算法)

Elliptic Curve Cryptography (ECC)

比 RSA 更高效的替代方案,在更小的密钥大小下提供同等安全性。

流行的曲线

  • Curve25519:专为 ECDH 密钥交换设计,广泛采用
  • Ed25519:用于数字签名,应用于 SSH、GPG
  • P-256 (secp256r1):NIST 标准,广泛支持
  • P-384、P-521:更高安全级别

相比 RSA 的优势

  • 256 位 ECC ≈ 3072 位 RSA 安全性
  • 计算速度更快
  • 密钥和签名更小
  • 带宽和存储需求更低

密钥交换协议

Diffie-Hellman (DH)

允许双方通过不安全的通道建立共享密钥。

变体

  • 经典 DH:原始实现
  • ECDH:椭圆曲线版本(更高效)
  • X25519:使用 Curve25519 的现代 ECDH

Perfect Forward Secrecy (PFS)

确保即使长期密钥被泄露,过去的通信仍然安全。

实现方式

  • 为每个会话生成临时密钥对
  • 使用后销毁会话密钥
  • 用于 TLS 1.3、Signal Protocol 等

哈希函数

SHA-2 系列

  • SHA-256:256 位输出,广泛使用
  • SHA-384、SHA-512:更高安全级别
  • 应用:数字签名、证书验证、密码哈希(配合适当技术)

SHA-3 (Keccak)

  • 与 SHA-2 不同的构造(海绵函数)
  • 抗长度扩展攻击
  • 适用于需要高安全边际的应用

BLAKE2/BLAKE3

  • 比 SHA-2 和 SHA-3 更快
  • 密码学安全
  • BLAKE3:高度可并行化,适合大数据

密钥派生函数 (KDFs)

PBKDF2 (Password-Based Key Derivation Function 2)

  • 目的:从密码派生加密密钥
  • 迭代次数:最少 100,000 次(OWASP 建议)
  • 使用场景:密码存储、密钥派生

Argon2

密码哈希竞赛(2015)的获胜者,推荐用于新应用。

变体

  • Argon2id:混合型(推荐用于大多数场景)
  • Argon2i:针对侧信道攻击优化
  • Argon2d:最大化抵抗 GPU 攻击

scrypt

  • 内存困难函数(抗硬件攻击)
  • 被 Litecoin、Tarsnap 使用
  • 安全性和兼容性的良好平衡

消息认证码 (MACs)

HMAC (Hash-based MAC)

  • 将哈希函数与密钥结合
  • 提供认证和完整性
  • 常见:HMAC-SHA256、HMAC-SHA512

Poly1305

  • 一次性认证器
  • 与 ChaCha20 配合使用实现认证加密
  • 快速且恒定时间

认证加密

为什么重要

单纯的加密不能保证完整性。攻击者可能在不被检测的情况下修改密文。认证加密解决了这个问题。

AEAD (Authenticated Encryption with Associated Data)

  • AES-GCM:支持最广泛
  • ChaCha20-Poly1305:在移动设备上表现更好
  • AES-CCM:用于某些无线协议

数字签名

RSA 签名

  • 填充:使用 PSS (Probabilistic Signature Scheme)
  • 哈希函数:SHA-256 或更高
  • 密钥大小:最少 2048 位

ECDSA (Elliptic Curve Digital Signature Algorithm)

  • 比 RSA 签名更小
  • 需要谨慎生成随机数(弱 RNG = 密钥泄露)
  • 推荐使用确定性变体(RFC 6979)

Ed25519

  • 确定性(不需要 RNG)
  • 快速签名生成和验证
  • 小签名(64 字节)
  • 抗侧信道攻击

现代协议

Signal Protocol

最先进的端到端加密协议,被 Signal、WhatsApp、Facebook Messenger 使用。

主要特性

  • Double Ratchet:持续更新密钥
  • Perfect Forward Secrecy:过去的消息保持安全
  • Post-Compromise Security:从密钥泄露中恢复
  • 异步:即使接收者离线也能工作

TLS 1.3

传输层安全协议的最新版本。

改进

  • 移除了弱算法和密码套件
  • 始终提供前向保密
  • 更快的握手(1-RTT,可选 0-RTT)
  • 加密的 Server Hello

Noise Protocol Framework

用于构建安全通信系统的现代密码学协议框架。

应用

  • WireGuard VPN
  • Lightning Network
  • I2P 消息传递

后量子密码学

威胁

量子计算机可以使用 Shor 算法破解 RSA 和 ECC。对称算法受影响较小,但需要更大的密钥。

NIST 后量子候选算法

  • Kyber:基于格的密钥封装
  • Dilithium:基于格的数字签名
  • SPHINCS+:基于哈希的签名

过渡策略

  • 混合方法:结合经典和后量子算法
  • 将对称密钥大小增加到 256 位
  • 关注 NIST 标准化进程
  • 规划算法灵活性

实现最佳实践

不要自己实现加密

使用经过验证的、经过同行评审的库:

  • libsodium:高级别,易于使用
  • OpenSSL:全面,广泛支持
  • BoringSSL:Google 的 OpenSSL 分支
  • Ring:Rust 加密库

密钥管理

  • 对关键密钥使用硬件安全模块(HSM)
  • 实施密钥轮换策略
  • 永远不要在源代码中硬编码密钥
  • 对多种用途使用密钥派生
  • 使用后安全删除内存中的密钥

安全随机数生成

  • 使用密码学安全的 RNG (CSPRNG)
  • 永远不要使用标准的 rand() 函数
  • 操作系统 RNG:/dev/urandom (Linux)、CryptGenRandom (Windows)
  • 特定语言:crypto.randomBytes (Node.js)、secrets 模块 (Python)

防止时序攻击

  • 对密钥使用恒定时间比较
  • 避免基于密钥数据的分支
  • 注意缓存时序攻击
  • 使用设计有时序攻击抵抗能力的库

测试与验证

安全审计

  • 定期渗透测试
  • 安全专家代码审查
  • 第三方安全审计
  • 漏洞赏金计划

合规性

  • FIPS 140-2/3:美国政府标准
  • Common Criteria:国际安全认证
  • PCI DSS:支付卡行业要求

进一步学习资源

书籍

  • "Cryptography Engineering" by Ferguson, Schneier, and Kohno
  • "Serious Cryptography" by Jean-Philippe Aumasson
  • "Applied Cryptography" by Bruce Schneier

在线资源

  • Cryptopals Crypto Challenges
  • Stanford 密码学课程(Coursera)
  • IACR ePrint Archive
  • Crypto Stack Exchange
查看实际加密应用:SecretNote 使用 AES-256-GCM 加密和安全密钥派生来保护你的消息。现在就试试吧!