3. 密码算法分类与适用边界

在密码工程中,算法选型的第一步不是比较“谁更安全”,而是先判断当前任务属于哪一类密码学功能。分组密码、流密码、公钥密码、哈希、KDF、MAC、签名、PKE、KEM 这九类对象,分别解决“保密”“完整性”“身份”“密钥派生”“密钥封装”等不同问题。把它们混用,往往不是安全性不足,而是接口语义错位:例如用哈希代替 MAC 做消息认证,用签名代替 KEM 做密钥协商,都会在协议层留下可被利用的缺口。

一、按功能定位划分九类算法

从功能视角看,这九类算法可以归入四条主线:

  • 对称加密:分组密码(如 AES、SM4)与流密码(如 ChaCha20、RC4 已不推荐)负责机密性。分组密码按固定块处理,需要工作模式(ECB/CBC/CTR/GCM)配合;流密码按字节或比特生成密钥流,与明文异或。
  • 哈希与派生:哈希(SHA-256、SM3)提供单向压缩与抗碰撞;KDF(HKDF、PBKDF2、Argon2)把弱口令或共享秘密扩展为定长密钥,承担“密钥材料加工”职责。
  • 消息认证:MAC(HMAC、CMAC、GMAC)用共享密钥验证消息完整性与来源真实性,输出固定标签,验证方必须持有同一密钥。
  • 公钥体系:PKE(RSA-OAEP、SM2 加密)用公钥加密、私钥解密;签名(ECDSA、RSA-PSS、SM2 签名)用私钥签名、公钥验证;KEM(RSA-KEM、ECIES、ML-KEM)封装出临时对称密钥,是“密钥协商/封装”的标准化接口。

需要特别区分的是:MAC 与签名都提供完整性,但信任模型不同。MAC 是对称的,双方共享密钥,无法向第三方证明;签名是非对称的,任何人都能用公钥验证,可用于不可否认。KEM 与 PKE 也不同:PKE 直接加密任意明文,KEM 只封装一个对称密钥,通常配合 DEM(数据封装机制)组成混合加密。

密码算法九类定位与选型维度 对称加密 分组密码 AES / SM4 / 3DES 块大小 128 bit 流密码 ChaCha20 / ZUC 密钥流 ⊕ 明文 适用:数据保密 边界:需模式与 IV 哈希与派生 哈希 SHA-256 / SM3 单向、抗碰撞 KDF HKDF / PBKDF2 Argon2 / scrypt 适用:密钥加工 边界:非加密本身 消息认证 MAC HMAC / CMAC / GMAC 共享密钥验证 适用:完整性+来源 边界:不可否认性弱 公钥体系 PKE RSA-OAEP / SM2 签名 ECDSA / RSA-PSS KEM ML-KEM / ECIES 适用:密钥分发 边界:性能开销大 选型维度:安全强度 · 性能开销 · 密钥/标签长度 · 标准合规 · 侧信道与实现风险 · 后量子迁移

二、选型时必须同时看的六个维度

确定功能类别后,还要在同类算法之间做取舍。以下六个维度通常需要同时评估:

维度含义示例判断
安全强度目标比特级安全,如 128 bitAES-128 与 SHA-256 组合可满足 128 bit 对称安全
性能开销吞吐、延迟、CPU/内存占用ChaCha20 在无 AES 指令的移动端更稳
输出长度密钥、IV、标签、签名的字节数GCM 标签建议 128 bit,截断到 96 bit 需评估
标准合规国密、FIPS、行业规范金融场景优先 SM2/SM3/SM4 或 AES 合规套件
实现风险侧信道、时序、随机数依赖ECDSA 的 nonce 复用会直接泄露私钥
迁移成本后量子、算法替换、协议兼容KEM 可平滑替换密钥协商,签名迁移更复杂

三、典型组合与边界判断

实际协议很少单独使用一种算法,而是按“KEM/DH → KDF → 对称加密 + MAC”组合。例如 TLS 1.3 的握手:先用 ECDHE 或 ML-KEM 协商共享秘密,再用 HKDF 派生出握手密钥与应用密钥,最后用 AES-GCM 或 ChaCha20-Poly1305 保护记录层。这里 KDF 不是可选项,它把原始共享秘密转换为多个方向、多个阶段的密钥,避免密钥复用。

边界判断可以抓住三条规则:

  1. 需要向第三方证明来源,用签名,不用 MAC。
  2. 只需要双方确认完整性与来源,用 MAC 或 AEAD,不必引入公钥开销。
  3. 需要把口令变成密钥,必须用慢哈希 KDF(Argon2、PBKDF2),不能直接用 SHA-256。
常见误用:用 SHA-256(消息) 代替 HMAC 做认证。哈希没有密钥,攻击者可以修改消息并重算摘要,无法提供来源真实性。正确做法是 HMAC-SHA256 或直接使用 AES-GCM 这类 AEAD。

四、一个可执行的选型检查清单

下面这份清单可直接用于方案评审,按顺序回答即可缩小候选范围:

1. 任务目标是什么?
   - 保密 → 对称加密(分组/流)
   - 完整性+来源(双方) → MAC / AEAD
   - 不可否认 → 签名
   - 密钥分发/协商 → KEM / DH
   - 口令或共享秘密加工 → KDF

2. 目标安全强度是多少 bit?
   - 128 bit:AES-128、SHA-256、HMAC-SHA256、ECDSA P-256
   - 192/256 bit:AES-256、SHA-384/512、SM2/SM3/SM4

3. 运行环境限制?
   - 有 AES-NI:AES-GCM 优先
   - 无硬件加速/移动端:ChaCha20-Poly1305
   - 资源极受限:轻量级算法需单独评估

4. 合规要求?
   - 国密场景:SM2/SM3/SM4 + SM9(如适用)
   - FIPS 场景:AES、SHA-2/3、HMAC、ECDSA/RSA-PSS

5. 随机数与 nonce 如何管理?
   - GCM nonce 不得重复
   - ECDSA nonce 必须唯一且不可预测
   - KEM 需使用安全随机源

6. 是否考虑后量子迁移?
   - 密钥协商:ML-KEM 混合 X25519
   - 签名:ML-DSA 或 SLH-DSA 混合传统签名

把这份清单落到具体项目时,建议先固定“功能类别”,再在同类中按安全强度、性能和合规筛选,最后检查随机数、nonce 和密钥生命周期管理。算法本身选对,只是安全的一半;接口语义、参数长度和实现细节同样决定最终边界。