公钥密码学与数字签名:原理详解

文章目录

    • [1. 对称加密与非对称加密](#1. 对称加密与非对称加密)
      • [1.1 对称加密(Symmetric Encryption)](#1.1 对称加密(Symmetric Encryption))
      • [1.2 非对称加密(Asymmetric Encryption)](#1.2 非对称加密(Asymmetric Encryption))
      • [1.3 混合加密系统](#1.3 混合加密系统)
    • [2. 公钥密码学基础](#2. 公钥密码学基础)
      • [2.1 密钥对生成](#2.1 密钥对生成)
      • [2.2 公钥与私钥的数学关系](#2.2 公钥与私钥的数学关系)
      • [2.3 密钥长度与安全强度](#2.3 密钥长度与安全强度)
    • [3. 哈希函数与数字摘要](#3. 哈希函数与数字摘要)
      • [3.1 哈希函数定义](#3.1 哈希函数定义)
      • [3.2 常见哈希算法对比](#3.2 常见哈希算法对比)
      • [3.3 哈希在数字签名中的作用](#3.3 哈希在数字签名中的作用)
    • [4. 数字签名机制](#4. 数字签名机制)
      • [4.1 数字签名的三大安全目标](#4.1 数字签名的三大安全目标)
      • [4.2 签名与验签流程](#4.2 签名与验签流程)
      • [4.3 RSA 签名详解](#4.3 RSA 签名详解)
      • [4.4 ECDSA(椭圆曲线数字签名算法)](#4.4 ECDSA(椭圆曲线数字签名算法))
    • [5. 安全电子邮件完整流程](#5. 安全电子邮件完整流程)
      • [5.1 场景需求](#5.1 场景需求)
      • [5.2 混合加密方案详解](#5.2 混合加密方案详解)
      • [5.3 流程图](#5.3 流程图)
      • [5.4 为什么使用三层加密?](#5.4 为什么使用三层加密?)
      • [5.5 为什么先签名再加密?](#5.5 为什么先签名再加密?)
    • [6. 公钥分发与信任体系](#6. 公钥分发与信任体系)
      • [6.1 问题:Alice 如何获得 Bob 的公钥?](#6.1 问题:Alice 如何获得 Bob 的公钥?)
      • [6.2 解决方案一:公钥基础设施(PKI)](#6.2 解决方案一:公钥基础设施(PKI))
      • [6.3 解决方案二:公钥服务器(PGP 模式)](#6.3 解决方案二:公钥服务器(PGP 模式))
      • [6.4 解决方案三:信任网(Web of Trust)](#6.4 解决方案三:信任网(Web of Trust))
      • [6.5 解决方案四:TOFU(Trust On First Use)](#6.5 解决方案四:TOFU(Trust On First Use))
      • [6.6 各方案对比](#6.6 各方案对比)
    • [7. 常见攻击与防护措施](#7. 常见攻击与防护措施)
      • [7.1 中间人攻击(MITM)](#7.1 中间人攻击(MITM))
      • [7.2 重放攻击(Replay Attack)](#7.2 重放攻击(Replay Attack))
      • [7.3 选择性密文攻击(CCA)](#7.3 选择性密文攻击(CCA))
      • [7.4 侧信道攻击(Side-Channel Attack)](#7.4 侧信道攻击(Side-Channel Attack))
      • [7.5 私钥泄露风险](#7.5 私钥泄露风险)
      • [7.6 哈希碰撞攻击](#7.6 哈希碰撞攻击)
      • [7.7 前向保密(Forward Secrecy)](#7.7 前向保密(Forward Secrecy))
    • [8. 实际应用场景](#8. 实际应用场景)
      • [8.1 HTTPS/TLS](#8.1 HTTPS/TLS)
      • [8.2 代码签名](#8.2 代码签名)
      • [8.3 区块链交易](#8.3 区块链交易)
      • [8.4 SSH 认证](#8.4 SSH 认证)
      • [8.5 电子邮件加密(PGP/S/MIME)](#8.5 电子邮件加密(PGP/S/MIME))
      • [8.6 数字证书应用](#8.6 数字证书应用)
      • [8.7 物联网(IoT)安全](#8.7 物联网(IoT)安全)
    • [9. 最佳实践总结](#9. 最佳实践总结)
      • [9.1 算法选择](#9.1 算法选择)
      • [9.2 实现注意事项](#9.2 实现注意事项)
    • 结语

1. 对称加密与非对称加密

1.1 对称加密(Symmetric Encryption)

定义 :加密和解密使用同一把密钥的加密方式。

核心公式

  • 加密:C = E(K, P)
  • 解密:P = D(K, C)

其中:P 为明文,C 为密文,K 为密钥,E 为加密函数,D 为解密函数。

常见算法

算法 密钥长度 特点 适用场景
AES 128/192/256 bit 快速、安全、标准化 文件加密、网络通信
DES 56 bit 已过时,不安全 历史系统兼容
3DES 168 bit DES 的改进,较慢 金融系统遗留
ChaCha20 256 bit 软件实现快 移动设备、TLS

优点

  • 加解密速度快(比非对称加密快 1000 倍以上)
  • 适合加密大量数据
  • 算法简单,硬件实现容易

缺点

  • 密钥分发困难:如何安全地把密钥传给对方?
  • 密钥管理复杂:n 个人互相通信需要 n(n-1)/2 个密钥
  • 无法实现身份认证:双方都有相同密钥,无法证明是谁发的

1.2 非对称加密(Asymmetric Encryption)

定义 :使用一对密钥(公钥和私钥),公钥加密的数据只能用私钥解密,反之亦然。

核心公式

  • 密钥对生成:(PK, SK) = KeyGen()
  • 加密:C = E(PK, P)
  • 解密:P = D(SK, C)

数学基础 :非对称加密基于单向陷门函数(One-way Trapdoor Function):

  • 正向计算容易
  • 反向计算困难(除非有陷门信息,即私钥)

常见数学难题:

  1. 大整数分解问题(RSA):给定 n = p × q,求 p 和 q
  2. 离散对数问题(Diffie-Hellman、ElGamal):给定 g^x mod p,求 x
  3. 椭圆曲线离散对数(ECC):给定 k×G,求 k

常见算法对比

算法 安全强度 密钥长度 速度(签名/验证) 主要用途
RSA-2048 112 bit 2048 bit 慢/慢 通用加密、签名
RSA-3072 128 bit 3072 bit 更慢/更慢 长期安全需求
ECC-256 128 bit 256 bit 较快/慢 移动设备、IoT
ECC-384 192 bit 384 bit 中等/较慢 高安全需求

注意:ECC 签名生成速度较快,但签名验证速度通常慢于 RSA(因为需要更多的椭圆曲线点乘运算)。

优点

  • 解决密钥分发问题(公钥可以公开)
  • 密钥管理简单(每人只需一对密钥)
  • 可实现数字签名和身份认证

缺点

  • 计算速度慢(比对称加密慢 1000-10000 倍)
  • 不适合加密大量数据
  • 密钥长度较长

1.3 混合加密系统

核心思想:结合对称加密和非对称加密的优点。

发送方操作流程

  1. 生成随机对称密钥 Ks(会话密钥)
  2. 用 Ks 加密消息 m → E(Ks, m)
  3. 用接收方公钥 PK_B 加密 Ks → E(PK_B, Ks)
  4. 发送 [E(PK_B, Ks), E(Ks, m)]

接收方操作流程

  1. 用私钥 SK_B 解密得到 Ks → D(SK_B, E(PK_B, Ks))
  2. 用 Ks 解密消息 → D(Ks, E(Ks, m))

为什么需要混合加密?

  • 对称加密:速度快,适合加密数据
  • 非对称加密:解决密钥分发,适合加密短数据(如密钥)

实际应用:TLS/SSL、PGP、S/MIME 都采用混合加密。


2. 公钥密码学基础

2.1 密钥对生成

RSA 密钥生成关键参数

  • public_exponent:通常选择 65537 (0x10001),是费马素数,计算效率高
  • key_size3072 bit 是当前推荐标准,2048 bit 仅用于兼容旧系统

安全建议:根据 NIST SP 800-57 指南,新系统应使用 RSA 3072+ 或 ECC 256+。

2.2 公钥与私钥的数学关系

以 RSA 为例,密钥生成过程:

  1. 选择两个大素数 p 和 q
  2. 计算 n = p × q(模数)
  3. 计算 φ(n) = (p-1)(q-1)(欧拉函数)
  4. 选择 e(公钥指数),满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1
  5. 计算 d(私钥指数),满足 d × e ≡ 1 (mod φ(n))

公钥 :PK = (e, n)
私钥:SK = (d, n)

加密 :C = M^e mod n
解密:M = C^d mod n

核心性质

  • 从公钥 (e, n) 推导私钥 d,需要分解 n 为 p 和 q
  • 当 n 足够大(2048 bit 以上),分解在计算上不可行

2.3 密钥长度与安全强度

对称密钥长度 RSA 密钥长度 ECC 密钥长度 安全强度 预计安全年限 推荐使用场景
80 bit 1024 bit 160 bit 80 bit 已不安全 禁止使用
112 bit 2048 bit 224 bit 112 bit 2030 年前 仅用于兼容旧系统
128 bit 3072 bit 256 bit 128 bit 2040 年前 新系统推荐标准
192 bit 7680 bit 384 bit 192 bit 长期安全 高安全需求
256 bit 15360 bit 512 bit 256 bit 长期安全 极高安全需求

建议

  • 新系统:RSA 3072+ 或 ECC 256+
  • 存量系统:RSA 2048 应尽快升级到 3072+
  • 长期安全需求:考虑 RSA 4096 或 ECC 384+

3. 哈希函数与数字摘要

3.1 哈希函数定义

哈希函数 H(x) 将任意长度输入映射为固定长度输出(摘要/指纹)。

数学表示:H: {0,1}* → {0,1}^n

核心特性

  1. 确定性:相同输入 → 相同输出
  2. 快速计算:给定 x,快速计算 H(x)
  3. 单向性:给定 h,难以找到 x 使得 H(x) = h
  4. 抗碰撞:难以找到 x₁ ≠ x₂ 使得 H(x₁) = H(x₂)
  5. 雪崩效应:输入微小变化 → 输出巨大变化

3.2 常见哈希算法对比

算法 输出长度 安全性 速度(软件/硬件) 状态
MD5 128 bit 已破解 快/快 ❌ 禁止使用
SHA-1 160 bit 已破解 中等/快 ❌ 禁止使用
SHA-256 256 bit 安全 中等/极快 ✅ 推荐使用
SHA-384 384 bit 安全 较慢/快 ✅ 高安全需求
SHA-512 512 bit 安全 较慢/快 ✅ 高安全需求
SHA-3 可变 安全 中等/中等 ✅ 新一代标准
BLAKE2 可变 安全 快/快 ✅ 性能优先

重要说明

  • SHA-256 在现代 CPU 上有专用指令集(如 Intel SHA Extensions),硬件实现极快
  • SHA-512 在 64 位系统上通常比 SHA-256 更快(因为每次处理更多数据)
  • 速度依赖于实现方式(纯软件 vs 硬件加速)

3.3 哈希在数字签名中的作用

为什么需要先哈希再签名?

  1. 效率:非对称加密慢,哈希值固定长度(如 256 bit),签名速度快
  2. 安全性:直接签名长消息可能存在安全隐患
  3. 兼容性:签名算法通常设计为处理固定长度输入

正确做法

  • 先计算摘要:摘要 = Hash(长消息)
  • 再签名:签名 = Sign(私钥,摘要)

4. 数字签名机制

4.1 数字签名的三大安全目标

  1. 认证性(Authentication)

    • 验证消息确实来自声称的发送者
    • 只有私钥持有者能生成有效签名
  2. 完整性(Integrity)

    • 验证消息在传输中未被篡改
    • 任何改动都会导致签名验证失败
  3. 不可否认性(Non-repudiation)

    • 发送者事后不能否认自己发送过该消息
    • 因为只有他有私钥

4.2 签名与验签流程

发送方(签名)

  • 输入:消息 m,私钥 SK_A
  • 步骤:
    1. 计算摘要 h = H(m)
    2. 生成签名 σ = Sign(SK_A, h)
    3. 发送 (m, σ)

接收方(验证)

  • 输入:消息 m,签名 σ,公钥 PK_A
  • 步骤:
    1. 计算摘要 h' = H(m)
    2. 验证 Verify(PK_A, σ, h')
    3. 返回 True/False

4.3 RSA 签名详解

RSA 签名原理

  • 签名生成:σ = Sign(SK, h) # 使用私钥和签名算法
  • 签名验证:Verify(PK, σ, h) # 使用公钥和验证算法

重要说明 :虽然教学中常说"用私钥加密摘要",但这种说法不严谨

  • 加密 的目的是机密性,防止未授权方读取数据
  • 签名 的目的是认证性和完整性,验证数据来源和未被篡改
  • RSA 签名不是简单的"反向加密",而是使用专门的签名算法和填充方案

重要:必须使用填充方案!

直接使用"教科书 RSA"存在严重安全隐患:

  • 存在选择性伪造攻击
  • 存在同态攻击(签名可被组合)

安全填充方案

  1. PKCS#1 v1.5(传统方案)

    • 填充格式:0x00 0x01 [FF...FF] 0x00 [ASN.1 头] [哈希值]
    • 已被广泛实现
    • 存在 Bleichenbacher 攻击风险
    • 仅用于兼容旧系统
  2. PSS(Probabilistic Signature Scheme)(推荐)

    • 随机化签名(相同消息每次签名不同)
    • 可证明安全性
    • 推荐使用

4.4 ECDSA(椭圆曲线数字签名算法)

优势

  • 密钥短(256 bit ECC ≈ 3072 bit RSA)
  • 签名生成速度快
  • 适合资源受限环境

签名过程(简化):

  • 输入:消息摘要 h,私钥 d
  • 步骤:
    1. 选择随机数 k
    2. 计算 (x, y) = k × G(G 为基点)
    3. r = x mod n
    4. s = k^(-1) × (h + r×d) mod n
    5. 签名 = (r, s)

注意:k 必须随机且保密,否则私钥会泄露!

历史案例:Sony PS3 签名漏洞就是因为 k 固定


5. 安全电子邮件完整流程

5.1 场景需求

Alice 要给 Bob 发送一封安全邮件,需要满足:

  1. 机密性:只有 Bob 能阅读邮件内容
  2. 认证性:Bob 能确认邮件确实来自 Alice
  3. 完整性:邮件在传输中未被篡改

5.2 混合加密方案详解

符号说明

  • m:原始邮件内容
  • H(·):哈希函数(如 SHA-256)
  • K_A^-:Alice 的私钥
  • K_A^+:Alice 的公钥
  • K_B^+:Bob 的公钥
  • K_B^-:Bob 的私钥
  • K_S:临时生成的对称密钥(会话密钥)

发送方(Alice)操作

步骤 1:生成数字签名

  • 1.1 计算摘要:h = H(m)
  • 1.2 签名:sig = Sign(K_A^-, h)

步骤 2:生成并加密会话密钥

  • 2.1 生成随机会话密钥 K_S
  • 2.2 用 Bob 的公钥加密:encrypted_Ks = Encrypt_RSA(K_B^+, K_S)

步骤 3:对称加密(保护内容和签名)

  • 3.1 拼接:data = m || sig
  • 3.2 加密:ciphertext = Encrypt_AES(K_S, data)

步骤 4:发送

  • 4.1 发送包:[encrypted_Ks, ciphertext]

接收方(Bob)操作

步骤 1:解密会话密钥

  • 1.1 K_S = Decrypt_RSA(K_B^-, encrypted_Ks)

步骤 2:解密邮件内容

  • 2.1 data = Decrypt_AES(K_S, ciphertext)
  • 2.2 分离:m || sig = data

步骤 3:验证签名

  • 3.1 计算摘要:h' = H(m)
  • 3.2 验证:Verify(K_A^+, sig, h')
  • 3.3 如果验证通过,则邮件可信

5.3 流程图

复制代码
┌─────────────────────────────────────────────────────────────┐
│                          Alice                               │
│                                                              │
│  邮件 m ──┬──→ H(·) ──→ h ──┬──→ K_A^-(·) ──→ sig          │
│           │                 │                                │
│           │                 ↓                                │
│           │              m || sig                            │
│           │                 │                                │
│           │                 ↓                                │
│           └────────→ AES 加密 (K_S) ──→ ciphertext            │
│                                                              │
│  生成 K_S ──→ RSA 加密 (K_B^+) ──→ encrypted_Ks               │
│                                                              │
│  发送:[encrypted_Ks, ciphertext] ──────────────→ Internet  │
└─────────────────────────────────────────────────────────────┘
                              │
                              ↓
┌─────────────────────────────────────────────────────────────┐
│                           Bob                                │
│                                                              │
│  接收:[encrypted_Ks, ciphertext]                            │
│           │                 │                                │
│           ↓                 ↓                                │
│  RSA 解密 (K_B^-)       AES 解密 (K_S)                           │
│           │                 │                                │
│           ↓                 ↓                                │
│         K_S            m || sig                              │
│                             │                                │
│                             ↓                                │
│                    分离 m 和 sig                             │
│                             │                                │
│           m ──→ H(·) ──→ h' ←── K_A^+(sig)                  │
│                                                              │
│                    比较 h' == h ?                            │
│                       ✓ 验证通过                             │
└─────────────────────────────────────────────────────────────┘

5.4 为什么使用三层加密?

第一层:数字签名(K_A^-)

  • 目的:认证 + 完整性
  • 为什么用私钥:只有 Alice 能生成,所有人都能验证

第二层:对称加密(K_S)

  • 目的:机密性 + 效率
  • 为什么用对称加密:速度快,适合加密大量数据

第三层:非对称加密(K_B^+)

  • 目的:安全传输会话密钥
  • 为什么加密 K_S:确保只有 Bob 能拿到解密钥匙

5.5 为什么先签名再加密?

方案对比

  1. 先签名再加密(推荐)

    • 发送:Encrypt(m, Sign(m))
    • 签名也被加密,保护发送者身份
    • 接收者解密后才能验证,隐私性好
    • 标准做法(如 S/MIME、PGP)
  2. 先加密再签名

    • 发送:Sign(Encrypt(m))
    • 签名未加密,任何人都能看到是谁发送的
    • 可能对加密数据签名存在安全隐患
    • 仅用于特殊场景(如需要第三方审计)

6. 公钥分发与信任体系

6.1 问题:Alice 如何获得 Bob 的公钥?

这是公钥密码学的核心难题 。如果公钥分发不安全,攻击者可以实施中间人攻击(Man-in-the-Middle Attack)

中间人攻击示例

正常流程:

  • Alice ←───── K_B^+ ───── Bob
  • Alice 用 K_B^+ 加密,Bob 解密阅读

中间人攻击:

  • Alice ←───── K_M^+ ───── Bob
  • Mallory 在中间截获,用 K_M^+ 加密
  • Mallory 解密后读取/篡改,再用 K_B^+ 重新加密
  • Bob 解密( unaware)

结果

  • Alice 以为在和 Bob 通信
  • Bob 以为在和 Alice 通信
  • 实际上所有消息都经过 Mallory

6.2 解决方案一:公钥基础设施(PKI)

核心思想:引入可信第三方(CA,Certificate Authority)为公钥背书。

数字证书结构(X.509 v3):

  • 版本号:v3
  • 序列号:唯一标识
  • 签名算法:SHA256WithRSA
  • 颁发者:CN=DigiCert Global Root CA
  • 有效期:生效时间 - 过期时间
  • 主体:CN=bob@example.com(证书持有者)
  • 主体公钥信息:算法 + 公钥
  • 扩展项:密钥用途、主题备用名称
  • 签名值:CA 的私钥对以上内容的签名

证书链验证

  • 信任链:根 CA(自签名)→ 中间 CA → Bob 的证书 → Bob 的公钥
  • 验证过程:
    1. 操作系统/浏览器内置根 CA 公钥
    2. 用根 CA 公钥验证中间 CA 证书
    3. 用中间 CA 公钥验证 Bob 的证书
    4. 信任 Bob 的公钥

6.3 解决方案二:公钥服务器(PGP 模式)

机制

  • 用户将公钥上传到公共服务器(如 keyserver.ubuntu.com
  • 其他人通过邮箱或密钥 ID 搜索下载

问题

  • 服务器不验证身份,任何人都可以上传声称是 Bob 的公钥
  • 需要指纹验证

指纹验证流程

  1. Alice 从服务器下载 Bob 的公钥
  2. Alice 计算公钥指纹(如:ABCD 1234 EF56 7890 ...)
  3. Alice 通过可信渠道(电话、见面、已加密聊天)联系 Bob
  4. Bob 告知自己的公钥指纹
  5. Alice 比对两个指纹
    • 一致:信任该公钥
    • 不一致:拒绝使用

6.4 解决方案三:信任网(Web of Trust)

PGP 的理念

  • 不依赖中心化 CA
  • 用户互相签名认证公钥

机制

  • Alice 信任 Charlie
  • Charlie 签名认证了 Bob 的公钥
  • → Alice 可以选择信任 Bob 的公钥

信任级别

  • 完全信任(ultimate):自己的密钥
  • 完全信任(full):完全信任该人的签名
  • 边际信任(marginal):部分信任
  • 不信任(none):不信任

现状

  • 管理复杂,用户友好性差
  • 现代实践中逐渐被 PKI 取代
  • 仍在 PGP/GPG 社区使用

6.5 解决方案四:TOFU(Trust On First Use)

机制

  • 第一次使用公钥时自动信任
  • 后续如果公钥变化则警告

应用

  • SSH 首次连接
  • 存储在 ~/.ssh/known_hosts

风险

  • 第一次连接就可能被中间人攻击
  • 适合风险可控场景

6.6 各方案对比

方案 优点 缺点 适用场景
PKI/CA 自动化、用户友好 依赖 CA、单点故障 Web、S/MIME
公钥服务器 + 指纹 去中心化 需手动验证 PGP/GPG
信任网 社区自治 复杂、难用 小众社区
TOFU 简单 首次连接风险 SSH、内部系统
直接交换 最安全 不可扩展 高安全需求

7. 常见攻击与防护措施

7.1 中间人攻击(MITM)

攻击原理:攻击者拦截通信,替换公钥,冒充通信双方。

防护措施

  1. 证书验证:严格验证证书链
  2. 证书钉扎(Certificate Pinning):只信任特定证书或公钥
  3. 指纹验证:手动核对公钥指纹
  4. HPKP(HTTP Public Key Pinning):已弃用,改用 Expect-CT

7.2 重放攻击(Replay Attack)

攻击原理:攻击者截获合法消息,稍后重复发送。

示例

  • Alice → Bob: "Transfer 1000 CNY" (加密 + 签名)
  • 攻击者截获该消息
  • 攻击者 → Bob: "Transfer 1000 CNY" (重复发送)
  • Bob 执行转账(重复扣款)

防护措施

  1. 时间戳

    • 消息包含时间戳和有效期
    • 接收方检查时间戳是否在允许范围内
  2. 随机数(Nonce)

    • 消息包含随机生成的唯一值
    • 接收方记录已使用的 nonce,拒绝重复
  3. 序列号

    • 消息包含递增序列号
    • 接收方检查序列号是否递增

7.3 选择性密文攻击(CCA)

攻击原理:攻击者能够解密自己选择的密文,从而推断出其他密文的内容。

RSA 的弱点

  • 教科书 RSA 具有同态性:E(m1) × E(m2) = E(m1 × m2)
  • 攻击者可以利用此特性

防护措施

  1. 使用填充方案

    • 加密:OAEP(Optimal Asymmetric Encryption Padding)
    • 签名:PSS(Probabilistic Signature Scheme)
  2. 避免直接使用 RSA 加密数据

    • 仅用于加密对称密钥
    • 使用混合加密

7.4 侧信道攻击(Side-Channel Attack)

攻击原理:通过分析加密设备的物理特征(时间、功耗、电磁辐射)推断密钥。

类型

  1. 时序攻击:测量解密时间差异
  2. 功耗分析:测量设备功耗变化
  3. 电磁分析:测量电磁辐射

防护措施

  1. 恒定时间算法:避免分支依赖密钥
  2. 盲化(Blinding)
    • RSA 解密盲化:
      • 选择随机 r
      • 计算 c' = c × r^e mod n
      • 解密 m' = c'^d mod n
      • 计算 m = m' × r^(-1) mod n
  3. 硬件防护:使用 HSM(硬件安全模块)

7.5 私钥泄露风险

常见原因

  1. 硬编码在代码中
  2. 存储在无保护的文件中
  3. 弱密码保护
  4. 内存泄漏
  5. 备份不当

防护措施

  1. 使用密钥管理系统(KMS):AWS KMS、HashiCorp Vault、Azure Key Vault
  2. 硬件安全模块(HSM):私钥永不离开 HSM,物理防护 + 逻辑防护
  3. 密钥轮换:定期更换密钥(如每 90 天)
  4. 访问控制:最小权限原则,审计日志

7.6 哈希碰撞攻击

攻击原理:找到两个不同消息 m1 和 m2,使得 H(m1) = H(m2)。

历史案例

  • MD5:2004 年被攻破,可实用碰撞
  • SHA-1:2017 年 Google 宣布 SHAttered 攻击

防护措施

  1. 使用安全哈希算法
    • SHA-256、SHA-384、SHA-512
    • SHA-3
    • MD5、SHA-1

7.7 前向保密(Forward Secrecy)

问题:如果长期私钥泄露,所有历史通信都能被解密。

解决方案 :使用临时密钥(Ephemeral Key)进行密钥交换。

Diffie-Hellman 密钥交换

  • Alice:生成 a,计算 A = g^a mod p
  • Bob:生成 b,计算 B = g^b mod p
  • Alice → Bob: A
  • Bob → Alice: B
  • 共享密钥:
    • Alice: K = B^a mod p = g^(ba) mod p
    • Bob: K = A^b mod p = g^(ab) mod p
  • 每次会话使用新的 a 和 b
  • 即使长期私钥泄露,历史会话密钥仍安全

TLS 中的实现

  • DHE(Diffie-Hellman Ephemeral)
  • ECDHE(Elliptic Curve DHE)

推荐配置

  • TLS 1.2+
  • 密钥交换:ECDHE
  • 加密:AES-256-GCM
  • 哈希:SHA-384

8. 实际应用场景

8.1 HTTPS/TLS

握手流程(简化):

  1. Client → Server: ClientHello(支持的加密套件)
  2. Server → Client: ServerHello(选择的加密套件)+ Certificate(服务器证书)+ ServerKeyExchange(DH 参数)
  3. Client → Server: ClientKeyExchange(客户端 DH 参数)+ ChangeCipherSpec + Finished(加密)
  4. Server → Client: ChangeCipherSpec + Finished(加密)
  5. 加密通信开始

关键点

  • 证书验证服务器身份
  • ECDHE 提供前向保密
  • 对称加密(AES)保护数据

8.2 代码签名

场景:软件开发者对发布包签名,用户验证完整性。

流程

  • 开发者签名:gpg --detach-sign --armor release-v1.2.tar.gz
  • 用户验证:gpg --verify release-v1.2.tar.gz.asc release-v1.2.tar.gz

应用

  • Linux 发行版软件包
  • Windows 驱动程序
  • macOS 应用
  • Git 提交签名

8.3 区块链交易

Bitcoin 交易签名

  • 交易输入:前一笔交易的输出引用 + 解锁脚本(签名 + 公钥)
  • 交易输出:金额 + 锁定脚本(收款人公钥哈希)
  • 验证:
    1. 节点获取公钥
    2. 验证签名
    3. 检查余额
    4. 确认交易

特点

  • 去中心化验证
  • 不可篡改
  • 公开可验证

8.4 SSH 认证

公钥认证

  • 生成密钥对:ssh-keygen -t ed25519 -C "user@example.com"
  • 复制公钥到服务器:ssh-copy-id user@server
  • 登录(无需密码):ssh user@server

流程

  1. Client → Server: 声明身份:user
  2. Server → Client: 随机挑战(nonce)
  3. Client → Server: 用私钥签名 nonce
  4. Server: 用公钥验证签名,验证通过 → 允许登录

8.5 电子邮件加密(PGP/S/MIME)

PGP 工作流

  1. 生成密钥对:gpg --gen-key
  2. 导出公钥:gpg --armor --export user@example.com > public.key
  3. 导入他人公钥:gpg --import bob_public.key
  4. 签名并加密邮件:gpg --sign --encrypt --recipient bob@example.com message.txt
  5. 解密并验证:gpg --decrypt message.txt.gpg

S/MIME

  • 基于 X.509 证书
  • 集成在邮件客户端(Outlook、Apple Mail)
  • 依赖 CA 体系

8.6 数字证书应用

客户端证书认证

  • 传统认证:用户名 + 密码
  • 证书认证:客户端证书 + 私钥

优势

  • 更强的身份验证
  • 防钓鱼
  • 可审计

应用

  • 企业内部系统
  • 银行网银
  • API 认证

8.7 物联网(IoT)安全

挑战

  • 资源受限(计算能力、存储)
  • 大规模部署
  • 物理安全风险

解决方案

  1. 轻量级算法

    • ECC 而非 RSA(密钥短)
    • ChaCha20-Poly1305(软件实现快)
  2. 设备证书

    • 出厂预置证书
    • 设备唯一身份
  3. 安全启动

    • 固件签名验证
    • 防止恶意固件

9. 最佳实践总结

9.1 算法选择

用途 推荐算法 参数
非对称加密 RSA / ECC RSA-3072+ / ECC-256+
对称加密 AES-GCM / ChaCha20 AES-256
哈希 SHA-256 / SHA-3 SHA-256 以上
签名 ECDSA / EdDSA / RSA-PSS P-256 / Ed25519
密钥交换 ECDHE P-256 / X25519

9.2 实现注意事项

  1. 不要自己实现密码算法

    • 使用成熟库(OpenSSL、Libsodium、cryptography)
    • 实现细节容易出错
  2. 使用安全的随机数生成器

    • 使用密码学安全随机(如 Python 的 secrets 模块)
    • 避免使用伪随机(如 random 模块)
  3. 及时更新依赖

    • 关注安全漏洞公告
    • 定期升级库版本
  4. 密钥管理

    • 永远不要硬编码密钥
    • 使用 KMS 或 HSM
    • 定期轮换密钥
  5. 防御深度

    • 多层防护
    • 假设单层防护会被突破

结语

公钥密码学是现代信息安全的基石,理解其原理和实践对于从事 IT 行业至关重要。

核心要点回顾

  1. 混合加密:对称加密保效率,非对称加密保安全
  2. 数字签名:私钥签名,公钥验签,实现认证和完整性
  3. 信任体系:公钥必须通过可信渠道获取(CA、指纹验证)
  4. 算法选择:使用现代安全算法,避免已破解的旧算法
  5. 实现细节:使用成熟库,关注侧信道攻击和实现漏洞

持续学习:密码学是快速发展的领域,量子计算、后量子密码学、零知识证明等新技术不断涌现。保持学习,关注最新研究和标准更新。

实践建议

  • 动手实现简单示例,理解原理
  • 使用工具分析实际协议(如 Wireshark 抓包 TLS)
  • 参与开源项目,学习最佳实践
  • 关注安全漏洞公告,理解攻击原理

记住:**密码学是数学、计算机科学和工程学的交叉领域,理论安全和实现安全同样重要。

相关推荐
洒家肉山大魔王4 天前
PKI/CA X.509证书的基础应用与解读
服务器·https·密码学·数字证书
酿情师5 天前
2026软件系统安全赛初赛RSA(赛后复盘)
android·网络·安全·密码学·rsa
Liudef066 天前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
YIN_尹8 天前
关于论文《使用 FLUSH+RELOAD 缓存侧信道攻击恢复 OpenSSL ECDSA 的随机数》的理解
缓存·系统安全·密码学
MicroTech202513 天前
基于后量子密码学:微算法科技(NASDAQ: MLGO)区块链预言机加密可更新方案
科技·区块链·密码学
道法自然|~14 天前
BugCTF黄道十二宫
算法·密码学
温中志15 天前
计算机密码学基础
密码学
Jianghong Jian21 天前
Hashcat:强大的密码恢复与安全测试工具
测试工具·安全·密码学
WHD30621 天前
企业数据安全体系建设指南:从风险识别到技术落地的全流程(2026版)
大数据·网络·人工智能·安全·系统架构·密码学·安全架构