浅谈密码学

加密方案

加密算法是指将明文转换为密文的算法, 只有通过密钥才能解密原始数据

现代密码学中主要有两类加密算法, 对称加密和非对称加密. 单纯使用加密算法只能保证数据的安全性, 除了安全性以外, 还需要保证消息的完整性真实性不可否认性. 因此我们通常要用多种算法组成加密方案, 才能确保消息满足以上要求

举个例子, TLS 是一种混合加密传输协议, 它在握手阶段通过非对称加密(RSA、ECDH)实现密钥交换和身份验证, 然后在数据传输阶段采用对称加密(AES-GCM、ChaCha20-Poly1305)保护通信内容, 同时全程使用哈希函数 (SHA-256) 和 HMAC 确保数据完整

一套加密方案通常有以下几类算法

作用 实例
加密算法 确保消息的安全性, 防止未授权访问 • 对称加密(AES / ChaCha20)
• 非对称加密(RSA / ECC)
完整性校验 确保消息在传输过程中未被篡改 • 哈希函数
认证机制 验证消息发送者身份, 确保消息的真实性 • 数字签名
• MAC
• HMAC
• 数字证书
密钥交换协议 双方之间安全交换密钥 • DHKE
• ECDH
• ECDHE

在介绍加密算法之前, 我们先了解一下其他的密码学概念

完整性校验

利用哈希函数生成的哈希值检查数据的完整性

1. 哈希函数

  • 本质是一种数学映射, 即将任意长度的输入数据, 转换为固定长度的输出数据(称为哈希值 / 数字指纹 / 数字摘要)
  • 由于鸽巢原理, 哈希函数必然存在碰撞

在密码学中使用的哈希函数称为加密哈希函数, 需要满足以下两点

  • 不可逆性:无法从哈希值逆推出原始输入
  • 抗碰撞性:无法找到发生碰撞的不同输入

加密哈希函数 安全性 特点
MD5 已破解 高速但不安全, 存在碰撞攻击
SHA-1 已破解
SHA-2(SHA-256、SHA-512 ) 安全 最广泛使用
SHA-3(SHA3-256、SHA3-512) 比 SHA-2 更安全 基于海绵结构, 与 SHA-2 设计完全不同
BLAKE2 安全强度类似 SHA-3 比 SHA-3 更快, 支持密钥和可变输出长度
RIPEMD-160 安全
SM3 安全 中国国家标准, 类似 SHA-256
Keccak 安全 SHA-3 的前身, 海绵结构设计

认证机制

认证机制可以保证消息的真实性、完整性、不可否认性

1. 消息认证

  • MAC(消息认证码)是使用密钥生成的固定长度数据块, 附加在消息后用于验证
  • HMAC:结合哈希函数(如 SHA-256)的消息认证算法, 安全性依赖于底层哈希函数
  • CMAC:结合分组密码(如 AES)的 MAC 算法, 安全性依赖于底层分组密码
  • Poly1305:基于多项式评估的 MAC 算法, 常与 ChaCha20 组合使用


2. 数字签名

  • 采用非对称加密, 发送方用私钥签名消息, 接收方用公钥验证签名
  • 签名后无法更改消息, 发送方也无法否认发送过该消息

算法 过程 原理
RSA 1. 计算消息哈希值
2. 用私钥加密哈希值生成签名
3. 接收方用公钥解密签名并与计算的哈希值比对
基于整数分解难题
DSA 1. 生成随机数k
2. 计算签名参数r和s
3. 利用数学关系验证
基于离散对数问题
ECDSA DSA的椭圆曲线版本, 使用更短的密钥提供相同的安全性 基于椭圆曲线离散对数问题

3. 数字证书

  • 由证书颁发机构 (CA) 签发的身份凭证
  • 包含公钥、身份信息和 CA 的数字签名


密钥交换协议

1. 密钥协商

密钥协商是指双方协商共享密钥, 通常使用非对称加密算法实现, 用于解决密钥分发的问题.

例如

  • Diffie-Hellman (DHКЕ):应用最广泛的密钥交换协议
    • 传统的 DHKE 基于 DLP (离散对数问题)实现
    • 新一代 DHKE 基于椭圆曲线密码学
  • ECDH:基于椭圆曲线密码学的密钥交换算法, DHKE 的继任者
  • ECDHE:在 ECDH 的基础上支持 PFS (完全前向保密)
    • DHKE 与 ECDH 只在最开始时交换一次密钥, 之后一直使用该密钥通讯. 如果密钥被破解, 所有历史会话都会泄漏
    • ECDHE 每次会话都生成临时共享密钥, 从而避免历史会话泄漏

2. 密钥传输

密钥传输是指其中一方生成共享密钥, 并将密钥传输给另一方

比如, TLS 协议中的 RSA 密钥交换, 客户端使用它的私钥加密一个随机生成的会话密钥, 然后将密文发送给服务端, 服务端再使用它的公钥解密出会话密钥


除了上面提到的概念, 还有其他密码学技术, 如下图所示

对称加密

对称加密是指双方使用相同的密钥对数据加解密, 这个密钥也称为共享密钥

alt text

对称加密算法

对称加密算法有两类

  • 块密码算法 / 分组密码算法:一次只能加密固定大小的数据. 例如, 如果块大小为 8 , 则一次加密 8 个字节的明文. 大多数流行的对称加密算法都是分组密码算法
  • 流密码算法:将数据逐个字节地转换为密文流

常见的对称加密算法有以下几种

1. AES

  • AES(Advanced Encryption Standard)是最流行的对称加密算法, 高度安全, 具有抗量子性
  • AES 为分组加密算法, 分组长度为128位, 使用 128、192 或 256 位密钥
  • AES 可与分组模式结合以处理流数据(AES-CTR 或 AES-GCM)

实际中, 一般是通过 RSA 加密 AES 的密钥, 传输到接收方, 接收方解密得到 AES 密钥, 然后发送方和接收方用 AES 密钥来通信

2. Salsa20 / ChaCha20

  • Salsa20 是流密码算法, 它用 128 位或 256 位对称密钥 + 随机生成的 64 位随机数(初始向量)+ 无限长度的数据流作为输入, 生成相同长度的加密数据流作为输出
  • ChaCha20 由 Salsa20 改进而来, 和 Poly1305 消息认证算法组合使用
  • ChaCha20 的性能远优于 AES, ChaCha20-Poly1305 广泛用于 TLS 1.3、QUIC/HTTP3、Wireguard、SSH 等协议中

3. 不安全的加密算法

  • DES:分组密码, 56 位短密钥, 可以被暴力破解
  • 3DES:三次应用 DES
  • Blowfish:分组密码
  • RC4:流密码, 已被破解

4. 其他

  • SM4:类似于 AES, 中国官方标准
  • Twofish:分组密码, 分组长度128位, 支持128、192、256位密钥
  • Serpent:分组密码, 分组长度128位, 支持128、192、256位密钥

分组密码工作模式

分组密码算法只能加密固定长度的分组, 若要加密变长数据, 则必须将数据先分成多个定长分组. 某些情况下, 最后一组数据需要使用填充算法, 以便将数据扩展到匹配分组大小的长度. 之后在这些分组上迭代使用分组密码算法, 将明文全部加密. 这种迭代的方法就称为分组密码工作模式

例如, AES-256-GCM 就表示使用 256 位加密密钥和 GCM 分组模式的 AES 算法

某些分组密码工作模式, 可以加密任意长度的数据, 实现类似流密码的效果

工作模式 流密码特性 特点 场景
ECB(电子密码本模式) 将明文分成固定大小的块, 每块独立加密, 最简单的模式, 但是不安全 加密密钥
CBC(密码分组链接模式) 每个明文块先与前一个密文块XOR, 然后再加密, 错误会传播 数据存储、文件加密
CFB(密文反馈模式) 将前一密文块加密后的输出与当前明文块XOR, 可逐字节处理数据 实时通信、流数据处理
OFB(输出反馈模式) 生成密钥流, 然后与明文XOR, 无错误传播 噪声信道传输
CTR(计数器模式) 加密计数器值生成密钥流, 然后与明文XOR, 可并行 高速加密、云存储
GCM(伽罗瓦计数器模式) 结合 CTR 模式和 GHASH 认证功能, 安全性高 TLS 协议

常用的模式是 CBC、CTR 和 GCM

  • CBC 模式在固定大小的分组上工作, 通常使用 PKCS7 填充算法使最后一个分组的长度一致
  • CTR 模式安全性高, 有并行处理能力, 允许输入任意长度数据长度, 不需要填充算法, 但是它不提供消息认证
  • GCM 模式继承 CTR 模式的所有优点, 并提供 GHASH 消息认证功能

对称加密方案

对称加密方案根据加密算法的不同, 可以分为两种, 分组加密方案和流密码加密方案

分组加密方案通常包含以下几种算法:

  • 分组密码算法(AES):使用密钥加密固定长度的数据块
  • 消息认证算法(HMAC):验证消息的真实性、完整性、不可否认性
  • 分组密码工作模式(CBC + PKCS7 / CTR / GCM):加密任意大小的数据
  • 密钥派生算法 KDF(Scrypt / Argon2):允许用户用字符密码作为共享密钥

流密码加密方案本身就能加密任意长度的数据, 因此不需要分组密码工作模式与消息填充算法

举个例子, AES-256-CTR-HMAC-SHA256 表示一种使用 AES-256 算法和计数器模式进行加密, HMAC-SHA256 进行消息认证的加密方案. 之前提到的 ChaCha20-Poly1305 则是一种流密码加密方案

一些对称加密方案提供身份验证功能, 即 AEAD. 比如使用了 GCM 分组模式的加密方案 AES-GCM, 而其他加密方案(如 AES-CBC 和 AES-CTR)自身不提供身份验证能力, 需要额外添加.

常见的认证加密方案有以下几种

  • ChaCha20-Poly1305:使用 Poly1305 验证身份和 ChaCha20 流密码, 性能高
  • AES-256-GCM:使用 256 位密钥的 AES 算法和 GCM 模式认证身份
  • AES-128-GCM:跟 AES-256-GCM 类似, 区别是使用 128 位密钥, 最流行的对称加密方案

非对称加密

非对称加密是指使用一对密钥(公钥和私钥)对数据进行加解密, 加密和解密需要使用不同的密钥

  1. 如果使用公钥对数据进行加密, 只有用对应的私钥才能进行解密
  2. 如果使用私钥对数据进行加密, 只有用对应的公钥才能进行解密

非对称加密比对称加密安全, 但是更复杂, 而且远慢于对称加密, 比如 RSA 加密就比 AES 慢1000倍

alt text

常见的非对称加密算法有以下几种

  • RSA:基于 IFP(整数分解问题), 最常用的非对称加密算法
    • 密钥对生成:生成随机私钥和相应的公钥
    • 加解密:使用公钥加密消息, 然后用私钥解密
    • 数字签名:私钥签署消息, 公钥验证签名
    • 密钥交换:在不安全的通道上安全地交换密钥, 解决对称加密中的密钥分发问题
  • ECC:基于 ECDLP(椭圆曲线离散对数问题), 椭圆曲线加密算法, 被认为是 RSA 的继任者
    • 相同安全强度下, ECC 密钥比 RSA 短
    • 在密钥对生成、密钥交换与签名算法上都快于 RSA
  • ElGamal:基于 DLP(离散对数问题)的非对称加密算法

前面提到的 Diffie-Hellman、ECDH 密钥交换协议也是基于这些加密算法

上面这些算法都依赖于 IFP / DLP / ECDLP, 并不具备抗量子性, 如果未来开发出量子计算机, 这些问题将容易被破解, 目前流行的非对称加密算法都会失效

非对称加密方案

目前流行的非对称加密方案都是组合使用对称加密算法与非对称加密算法, 从而结合非对称加密的安全性和对称加密速度快、支持加密任意长度消息的特性

1. 密钥封装机制 KEM

KEM 指使用非对称加密算法 (RSA / ECC)加密对称密钥, 实际数据的加解密由对称密钥(AES / ChaCha20)完成. 主要用于传输对称密钥, 而不是直接加密消息

  • 加密:使用公钥加密传输对称密钥

  • 解密:使用私钥解密出对称密钥, 然后用这个密钥解密数据

2. 集成加密方案 IES

集成加密方案是在 KEM 的基础上, 添加了密钥派生算法 KDF、消息认证算法 HMAC 等提高安全性. 常见的 IES 方案有 DLIES(离散对数集成加密方案)和 ECIES(椭圆曲线集成加密方案)

TLS 协议

最后我们再聊聊密码学的典型应用 —— TLS 协议

TLS 协议, 即传输层安全协议, 前身是 SSL 协议. 它采用混合加密方案, 通常与 HTTP / FTP / SMTP 等协议一起使用以实现加密通讯, 如 HTTPS / SFTP / SMTPS.

alt text

密码套件

密码套件指 TLS 协议中使用的各种密码学算法, 包含以下组件

  • 密钥交换算法: 用于安全地交换密钥, 如 RSA、DH、ECDHE
  • 身份验证算法: 用于验证通信方身份, 如 RSA、ECDSA
  • 对称加密算法: 用于加密实际数据, 如 AES、ChaCha20
  • 消息认证码算法: 确保消息完整性, 如 HMAC-SHA256

密码套件都有固定格式, 例如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(TLS 1.2)

  • TLS: 定义套件适用的协议
  • ECDHE: 密钥交换算法
  • RSA: 数字证书算法
  • AES_128_GCM: 基于 AES 与 GCM 模式的对称认证加密方案, 使用 128 位密钥
  • SHA256: 加密哈希函数, 用于 HMAC 实现消息认证(TLS 固定使用 HMAC 算法)

TLS 1.3 简化了命名格式, 将密钥交换算法从密码套件中抽离, 例如 TLS_AES_256_GCM_SHA256(TLS 1.3)


  • SSL 和 TLS 1.0 已经基本淘汰
  • TLS 1.1(不安全)
    • 不支持 PFS 完全前向保密
    • 不支持 AEAD 认证加密算法
  • TLS 1.2(主流)
    • 支持 PFS
    • 支持 AEAD 加密认证方案
    • 支持 HMAC-SHA-256 消息认证算法
    • 移除 MD5 与 SHA-1 算法
  • TLS 1.3(最安全)
    • 移除 MD5 与 SHA-1 算法
    • 移除 RC4 与 3DES 算法
    • 移除静态 RSA 与 DH 密钥交换算法
    • 移除非 AEAD 的对称加密方案(AES-CBC)
    • 仅支持前向安全的密钥交换算法 DHE / ECDHE
    • 支持高性能的 ChaCha20-Poly1305 对称认证加密方案
    • 支持高性能的 Ed25519 / Ed448 签名认证算法、X25519 密钥协商算法
    • 支持最短 0-RTT 的 TLS 握手(会话恢复)

TLS 1.3 常用的几个密码套件

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256
  • TLS_AES_128_CCM_8_SHA256
  • TLS_AES_128_CCM_SHA256

平时我们还可以通过 站点 HTTPS 安全检测 检查网站使用 TLS 协议密码套件



cover
画师: Hong
id: 129836846