加密算法分类

Table of Contents

哈希函数
不可逆加密,用于摘要、完整性校验、密码存储
对称加密
加密与解密使用相同密钥,速度快,常用于数据传输加密
非对称加密
加密与解密使用不同密钥(公钥/私钥),常用于密钥交换与身份认证

一、哈希函数

㈠ 哈希函数

算法 家族 年代 输出位数 可能性数量 性能 安全性备注
❌ MD5 MD 1991 128 bit 2^128 ≈ 3.4e+38 已被完全破解,不可用于安全场景
❌ SHA-1 SHA-1 1995 160 bit 2^160 ≈ 1.46e+48 较快 已被实验证实碰撞,不可用于安全场景
SHA-224 SHA-2 2001 224 bit 2^224 ≈ 2.7e+67 中等 基本安全,使用较少
SHA-256 SHA-2 2001 256 bit 2^256 ≈ 1.16e+77 中等 推荐,广泛用于 TLS/签名
SHA-384 SHA-2 2001 384 bit 2^384 ≈ 3.94e+115 较慢 高强度,适用于更安全需求
SHA-512 SHA-2 2001 512 bit 2^512 ≈ 1.34e+154 较慢 非常高强度,适合高安全场景
SHA3-256 SHA-3 2015 256 bit 2^256 ≈ 1.16e+77 略慢 NIST 新标准,更抗碰撞和量子攻击
SHA3-512 SHA-3 2015 512 bit 2^512 ≈ 1.34e+154 略慢 高安全等级,结构不同于 SHA-2
BLAKE2b BLAKE2 2013 512 bit 2^512 非常快 安全性接近 SHA-3,但更高性能
BLAKE3 BLAKE3 2020 任意 2^x 极快 多核并行友好,新一代性能王者
  • 不应该再使用 MD(MD2、MD4、MD5)家族的算法,现在高性能算法(如BLAKE2)的生成速度也很快,同时更安全;
  • 生成 SHA-256 echo -n 'hello' | openssl dgst -sha256 ,生成 SHA3-256 需要 dgst -sha3-256
  • 应用最广泛的哈希函数是 SHA-2,但是推荐使用的是 SHA-3,因为 Merkle-Damgård 构造容易受到长度扩展攻击;
  • 考虑兼容与通用标准选择 SHA-256;考虑高安全选择 SHA3-256;极致的性能选择 BLAKE3;兼顾性能和广泛支持选择 BLAKE2b;

㈡ 密码哈希函数(Password Hashing)

算法 年代 内存硬度 并行性 安全性 现状
bcrypt 1999 尚可 广泛使用(Django、Ruby on Rails),但不抗 GPU
PBKDF2 2000 NIST采纳 仍被用在很多标准(WPA2、PKCS#5),但防 GPU 能力差
scrypt 2009 支持 不佳 还可以 曾是热点,被 Argon2 逐渐替代
Argon2 2015 PHC 优胜者 Password Hasing Competition
Balloon 2016 支持 一般 理论好 很少部署,学术用途居多
Yescrypt 2017 一些 Linux 发行版默认密码哈希(如 Fedora)
  • 防止网站密码泄露,只存储密码的哈希值;
  • 防止攻击者穷举搜索用户密码,通过加盐技术来解决,在这种意义上,为每个用户创建了不同的哈希函数,攻击者无法预先计算彩虹表;
  • 密码哈希函数的运行速度应该很慢,即使是专用硬件,也只能有限的通过优化内存改善攻击效果;

㈢ 消息认证码(Message Authentication Code, MAC)

类型 示例算法 安全性 用途
HMAC HMAC-SHA256、HMAC-SHA512 高,广泛使用 TLS、JWT、API签名等
CMAC AES-CMAC 某些嵌入式和军用标准
KMAC KMAC128、KMAC256 高(抗量子) 替代 HMAC,用于新系统
Poly1305 Poly1305-AES 高、快速 TLS 1.3、QUIC 中广泛使用
UMAC/VMAC   较高 高速Mac,UDP认证、网络加密层等
  • 单独的消息认证不负责加密,如果还有加密需求,选择认证加密算法↓;
  • 哈希函数可以为任意数据提供完整性,因为哈希函数是一种公开算法,攻击者可以同时修改明文和哈希值;
  • 消息认证码需要密钥;

二、对称加密

㈠ 对称加密算法

算法 年代 块大小 / 模式 安全性 性能 是否推荐 说明
❌️ DES 1977 64-bit / ECB 不推荐 已被破解
3DES 1978 64-bit / CBC 淘汰中 DES 的三重迭代
AES-128 2001 128-bit / CBC 推荐 最常用、FIPS 认证
AES-256 2001 128-bit / CBC 更强 稍慢 推荐 高安全性需求使用
ChaCha20 2008+ Stream cipher 非常快 移动端首选 Google 和 TLS 1.3 使用
Blowfish 1993 64-bit 一般 冷门 已较少使用
Twofish 1998 128-bit 一般 冷门 AES 竞争者之一
  • 1997年,NIST启动了一场高级加密标准(AES)的公开竞赛,旨在取代 NIST 20年前公布的 数据加密标准(DES)算法 。整个竞赛持续了3年,期间来自不同国家和地区的密码学团队共提交了15个算法。最终 Vincent Rijmen 和 Joan Daemen 提交的 Rijndael 算法胜出。2001年,NIST 将 AES 作为联邦信息处理标准 FIPS197 的一部分公开发布。当今 FIPS197 标准中的 AES 算法仍然是一个重要的加密算法。
  • 对称加密的安全性依赖于密钥的保密性;
  • CBC、ECB 指的是分组加密模式 ↓
  • 对称加密算法又可分为:非认证加密算法、认证加密算法;

分组加密模式

模式 并行加密 并行解密 安全性 说明
ECB × 非常差 不应再使用
CBC × ✓ 较安全 常见,需 IV,不可并行加密
CFB × 类似 CBC,但可流加密
OFB 将分组加密转为流加密
CTR ✓ 非常安全 使用计数器,可完全并行
GCM ✓ + MAC 验证 高性能+认证,现代首选(如 TLS)
  • ECB 模式加密图像后仍能看到原图轮廓(因为每个块独立)
    1754468407.png

㈡ 认证加密(Authenticated Encryption, AE)

如果只用普通的对称加密算法(如 AES-CBC),虽然攻击者看不懂数据内容,但可以悄悄篡改密文,你却无法感知。

为了防止密文的改变,可以使用消息认证码(MAC)算法。使用 HMAC(基于哈希的 MAC 算法)结合哈希函数 SHA-256 来提供完整性校验。

  1. AES-CBC-HMAC,先对明文加密,再用 HMAC 算法认证密文和IV,这样即便敌手篡改了密文和IV,也无法生成合法的认证标签;

    具体来说,先对完成填充的明文进行加密,再用 MAC 算法认证密文和IV。这样一来,即便敌手篡改了密文和IV,也无法生成合法的认证标签。

    这样的构造称为先加密再认证(Encrypt-then-MAC,EtMAC)。其他如先认证再加密(MAC-then-Encrypt,MACtE)有时会导致巧妙的攻击(如Vaudenay填充预言机攻击)。

    但是 AES-CBC-HMAC 不是开发者友好型密码算法,下面是标准化一体式的认证加密方案

  2. AES-GCM,绝对的主流(Web、TLS、VPN),性能好,有硬件加速,AES 兼容性强;
  3. ChaCha20-Poly1305 移动端首选;
  4. AES-GCM-SIV,抗 Nonce 误用的认证加密算法;

三、非对称加密

  • 非对称加密算法允许加密的消息长度是有限的;
  • 与对称加密相比,非对称加密和解密的速度相当慢,这主要是因为对称加密是面向比特的,而非对称加密常涉及大量复杂的数学运算;

㈠ 密钥交换

算法 类型 性能 安全性 应用场景
RSA 整数分解 已不推荐 老 TLS(1.2 以下)
DH 离散对数 中(传统) 老 TLS / IPSec
ECDH 椭圆曲线(ECC) TLS 1.2/1.3,SSH
X25519 ECC 优化 更快 很高 TLS 1.3,WireGuard
  • 密钥交换算法是通信双方在不安全信道中协商共享密钥的一种密码协议,这个密钥后续将被用于对称加密通信,它是现代加密通信的基础部分;
  • 密钥交换的过程:Alice 和 Bob 都使用密钥生成算法生成一对密钥(私钥和公钥),双方将各自的公钥发送给对方。
    然后,Alice 使用自己的私钥和 Bob 的公钥计算出共享密钥、同时 Bob 使用自己的私钥和 Alice 的公钥计算出共享密钥。
    由于算法的设计:①共享密钥是相同的 ②透露公钥不会暴露双方的私钥和共享密钥;
  • ECDH 因其密钥较小而取代 DH;
  • 密钥交换算法推荐使用 X25519;

㈡ 混合加密

混合加密是非对称加密原语和对称加密原语的组合。先生成一个对称加密的密钥,并用 Alice 的公钥加密这个对称密钥,因为只有 Alice 有自己的私钥,所以 Alice 通过私钥解密获得对称密钥,再用对称密钥解密已加密的消息。

  • ECIES,使用 ECDH 算法进行密钥交换,之后,将共享密钥当作 AES-GCM 这类认证加密算法密钥;

㈢ 零知识证明(Zero-Knowledge Proof,ZKP)

㈣ 数字签名(Digital Signature)

  • 只有签名者本人可以对任意消息生成签名;
  • 任何人都可以验证签名者对消息的签名;
  • 数字签名类似于消息认证码算法,但是消息认证码算法需要签名人和验证人都知道密钥,验证方可以使用这个密钥伪造一条消息和消息的MAC;
算法 基于的数学问题 性能 安全性备注
RSA-PSS 大整数分解 慢(特别是验证) RSA 的更安全变种,古老兼容性好,但需足够大密钥才安全
DSA 离散对数(DLP) 过时;有泄露私钥的历史问题,不推荐
ECDSA 椭圆曲线离散对数(ECDLP) 快(验证略慢) 签名随机数泄露会导致私钥泄漏
Ed25519 椭圆曲线离散对数(ECDLP) 非常快 设计抗随机数失败;默认安全曲线; 现代推荐
Ed448 椭圆曲线离散对数(ECDLP) 中等 更高安全级别,256 位对抗强量子攻击
XMSS 安全哈希函数(Merkle Tree) 慢、状态型 后量子安全;签名数有限;RFC 8391 标准化
SPHINCS+ 安全哈希函数(Merkle 树、FORS) 慢(尤其是验证) 无状态,后量子安全,NIST PQC 选中算法之一
  • RSA 签名和 RSA 加密的使用方式刚好相反,签名时使用私钥对消息进行加密,验证签名时使用公钥对签名进行解密,对比运算的返回值与初始消息即可知道签名是否有效;
  • 因为 RSA 是第一个被标准化的签名方案,所以被广范使用,但是也因滥用而引起许多安全问题;
  • ECDSA 因其密钥较小而取代 DSA;
  • EdDSA 在实用密码学上被认为是最先进的数字签名;
    EdDSA 是一种数字签名算法的通用设计思想。实际使用时,实例化 EdDSA 通常使用 Edwards25519 曲线,将这个实例化的算法称为 Ed25519;

四、伪随机数生成、密钥派生(Key derivation function, KDF)

算法 基于的数学问题 性能 安全性备注
PBKDF2 HMAC(SHA-1/SHA-256等)迭代运算 CPU 友好,迭代次数可调 标准化广泛支持,但易受 GPU/ASIC 暴力破解
bcrypt Blowfish key schedule 延迟 较慢,适度抗 GPU 输出最长 72 字节口令,安全性好于 PBKDF2
scrypt 内存难题 占用大量内存,抗 GPU 优秀 适合防御大规模硬件攻击,不适合低内存环境
Argon2i 内存难题 + 并行哈希 可调 CPU/内存/并行度 防御侧信道攻击,推荐口令存储
Argon2d 内存难题 + 并行哈希 高性能抗 GPU 更适合不怕侧信道的环境
Argon2id 内存难题 + 并行哈希 性能与安全性均衡 PHC 冠军,现代口令存储首选
HKDF HMAC(SHA-256/SHA-512) 高效 需要高熵输入(如 DH 共享密钥)
TLS PRF HMAC(SHA-256/SHA-384) 高效 仅在 TLS 内部使用
IKE KDF HMAC(SHA 系列) 高效 用于 IPsec/IKE 密钥派生
  • 密钥派生函数(KDF)需要按用途分开选择合适的算法:
    • 存储密码:首选 Argon2id,其次选择 scrypt,最后选择 PBKDF2;
    • 网络协议派生会话密钥:HKDF 首选;
    • 基于 SHA-3 的系统选择 KMAC/cSHAKE;
    • 老系统迁移使用 PBKDF2 过渡,逐步替换为 HKDF/Argon2;