cryptography_tutorial

第四章:公钥密码学

开篇

公钥密码学的发明是密码学史上最重要的突破之一,它解决了传统对称密码学中密钥分发的根本问题。通过引入陷门函数的概念,公钥密码学使得两个从未谋面的通信方能够建立安全通信信道。本章将深入探讨公钥密码学的数学基础,重点分析RSA、椭圆曲线密码学以及离散对数问题,并讨论在量子计算威胁下的安全性挑战。

学习目标

公钥密码学基础概念

陷门函数的深层理论

公钥密码学的核心是陷门函数(Trapdoor Function)的概念,它是现代密码学最重要的理论工具之一。陷门函数的存在性与P vs NP问题密切相关,虽然我们无法证明陷门函数的存在,但基于特定数学假设可以构造候选函数族。

形式化地,一个陷门函数族是一个四元组$(G, F, F^{-1}, D)$,其中:

严格的安全性定义

对于安全参数$k$和函数族$(G, F, F^{-1}, D)$,定义以下实验:

实验 Invert_A,F(k):
1. (i, pk, td) ← G(1^k)
2. x ← D_i (均匀随机选择)
3. y ← F_i(x)
4. x' ← A(i, pk, y)
5. 如果 F_i(x') = y 则输出 1,否则输出 0

如果对所有概率多项式时间算法$A$,都有$\Pr[\text{Invert}_{A,F}(k) = 1] \leq \text{negl}(k)$,则称$F$是单向的。

陷门特性:存在概率多项式时间算法$I$,对于$(i, pk, td) \leftarrow G(1^k)$和$x \in D_i$,有: \(\Pr[I(i, td, F_i(x)) = x] = 1\)

几何直观:陷门函数可视为一个”单向门”,公开信息允许任何人进入(正向计算),但只有持有特殊钥匙(陷门)的人才能出来(逆向计算)。

计算复杂性基础

公钥密码学的安全性建立在计算复杂性理论的基础之上。我们区分以下几类计算问题:

1. 单向性(One-wayness)

2. 强单向性(Strong One-wayness)

3. hardcore谓词

非均匀计算模型:考虑具有多项式大小建议字符串的算法,这更准确地刻画了实际攻击者的能力。

Rule of thumb:陷门函数的安全性通常基于平均情况困难性假设,而非最坏情况,这与传统算法分析不同。

语义安全性与攻击模型层次

公钥加密方案的安全性通过多层次的攻击模型来定义,从最基本的语义安全性到最强的自适应选择密文攻击安全性。

语义安全性(Semantic Security)是最基础的安全概念。直观上,它要求攻击者从密文中无法获得关于明文的任何信息。形式化定义通过不可区分性实验给出:

IND-CPA实验

实验 IND-CPA_A,Π(k):
1. (pk, sk) ← Gen(1^k)
2. (m_0, m_1, state) ← A_1(pk),其中 |m_0| = |m_1|
3. b ← {0,1},c ← Enc_pk(m_b)
4. b' ← A_2(state, c)
5. 如果 b' = b 则输出 1,否则输出 0

如果对所有概率多项式时间算法$A$,都有: \(\left|\Pr[\text{IND-CPA}_{A,\Pi}(k) = 1] - \frac{1}{2}\right| \leq \text{negl}(k)\)

则称加密方案$\Pi$满足IND-CPA安全性。

更强的安全性概念

1. 选择密文攻击(CCA1)

2. 自适应选择密文攻击(CCA2)

安全性层次关系: \(\text{IND-CCA2} \Rightarrow \text{IND-CCA1} \Rightarrow \text{IND-CPA}\)

实际意义:CCA2安全性防御恶意选择的密文攻击,这在实际系统中很常见,如选择密文填充攻击。

公钥密码学的形式化框架

标准的公钥加密方案是一个三元组$\Pi = (Gen, Enc, Dec)$:

1. 密钥生成算法 $Gen: {0,1}^* \rightarrow \mathcal{K} \times \mathcal{K}$

2. 加密算法 $Enc: \mathcal{PK} \times \mathcal{M} \rightarrow \mathcal{C}$

3. 解密算法 $Dec: \mathcal{SK} \times \mathcal{C} \rightarrow \mathcal{M} \cup {\perp}$

正确性要求: 对于所有$k \in \mathbb{N}$,所有$(pk, sk) \leftarrow Gen(1^k)$,所有$m \in \mathcal{M}_k$: \(\Pr[Dec_{sk}(Enc_{pk}(m)) = m] = 1\)

扩展性质

Rule of thumb:实际的公钥加密方案往往需要在安全性、效率和密文长度之间进行权衡。

RSA密码系统

数学基础与构造原理

RSA算法是第一个实用的公钥密码系统,由Rivest、Shamir和Adleman于1978年提出。其安全性基于大整数分解问题的困难性,建立在数论中的几个重要定理之上。

核心数学原理

1. 欧拉函数与欧拉定理

2. 费马小定理的推广

RSA密钥生成算法详解

算法 RSA-KeyGen(1^k):
1. 重复以下步骤直到找到合适的素数:
   - p ← RandomPrime(k/2)
   - q ← RandomPrime(k/2)
   - 确保 |p-q| > 2^(k/2-100) (防止Fermat分解)
2. n ← p × q
3. φ(n) ← (p-1) × (q-1)
4. 选择 e ∈ {3, 5, 17, 257, 65537} 使得 gcd(e, φ(n)) = 1
5. d ← e^(-1) mod φ(n) (使用扩展欧几里得算法)
6. 返回 pk = (n, e), sk = (n, d, p, q)

加密与解密的数学描述

完整的正确性证明

情况1:$\gcd(m, n) = 1$(最常见情况) 由于$ed \equiv 1 \pmod{\phi(n)}$,存在整数$k$使得$ed = 1 + k\phi(n)$。 \(c^d \equiv (m^e)^d \equiv m^{ed} \equiv m^{1+k\phi(n)} \equiv m \cdot (m^{\phi(n)})^k \stackrel{\text{欧拉定理}}{\equiv} m \cdot 1^k \equiv m \pmod{n}\)

情况2:$\gcd(m, n) \neq 1$(非常罕见) 如果$p | m$但$q \nmid m$,则:

现代实现的优化技术

1. 中国剩余定理加速(CRT)

2. 蒙哥马利阶梯算法

3. 蒙哥马利模乘算法

4. 多精度算术库的选择

密钥生成的安全考虑

1. 强随机数生成

2. 素数生成与测试

3. 密钥质量验证

验证清单:
✓ |p - q| > 2^(k/2-100)  (防Fermat分解)
✓ p, q > 2^(k/2-1)       (保证足够长度)
✓ gcd(p-1, q-1) < 2^(k/4) (防common factor攻击)
✓ gcd(e, (p-1)(q-1)) = 1  (保证d存在)
✓ d > 2^(k/4)             (防Wiener攻击)

现代应用中的RSA变种

1. Multi-Prime RSA

2. Batch RSA

3. RSA-FDH(Full Domain Hash)

Rule of thumb:现代RSA实现必须使用CRT加速和侧信道防护,裸RSA运算几乎从不直接使用。密钥生成阶段的安全性往往决定整个系统的安全水平。

RSA的安全性分析与困难性假设

RSA的安全性建立在一系列相互关联但不等价的数学困难性假设之上。理解这些假设之间的关系对于正确评估RSA的安全性至关重要。

核心困难性假设层次

1. 整数分解假设(Factoring Assumption)

2. RSA假设(RSA Assumption)

3. 强RSA假设(Strong RSA Assumption)

安全性参数与攻击复杂度

密钥长度 安全级别 GNFS复杂度 量子攻击 推荐状态
1024位 80位 $2^{80}$ $2^{20}$ 已弃用
2048位 112位 $2^{112}$ $2^{21}$ 最低要求
3072位 128位 $2^{128}$ $2^{22}$ 推荐
4096位 140位 $2^{140}$ $2^{23}$ 高安全

具体攻击算法分析

1. 试除法(Trial Division)

2. Pollard’s rho算法

3. 二次筛法(Quadratic Sieve)

4. 通用数域筛法(GNFS)

量子攻击威胁

Shor算法的详细分析

侧信道攻击与实现安全性

1. 时序攻击(Timing Attacks)

2. 功耗分析(Power Analysis)

3. 故障攻击(Fault Attacks)

量子后安全性评估

1. 量子计算机发展时间线

2. 错误校正开销

3. Shor算法的实际限制

密码学敏捷性(Crypto-Agility)

1. 算法无关设计

2. 混合安全方案

3. 密钥管理策略

实际攻击案例分析

1. RSA挑战赛历史

2. 实际系统的RSA破解

3. 学术界的理论突破

前瞻性安全评估

1. 密钥长度建议时间线

年份      | 最低要求 | 推荐长度 | 高安全级别
----------|----------|----------|------------
2025      | 2048位   | 3072位   | 4096位
2030      | 3072位   | 4096位   | 弃用RSA
2035      | 弃用     | 弃用     | 弃用

2. 迁移策略建议

Rule of thumb:RSA的实用安全性不仅依赖于数学困难性,更需要考虑实现层面的侧信道防护和量子威胁的时间线。现在就应开始规划后量子密码学的迁移路径。

填充方案与实用安全性

裸RSA加密在实际应用中存在致命的安全漏洞,必须结合适当的填充方案才能实现语义安全性。理解这些漏洞和相应的防护措施对于安全实现至关重要。

裸RSA的根本缺陷

1. 确定性导致的信息泄露

2. 乘法同态性

3. 小指数攻击家族

PKCS #1 v1.5填充

早期的填充标准,结构为:

0x00 || 0x02 || PS || 0x00 || M

其中$PS$是长度为$k - |M| - 3$的随机非零字节序列。

已知攻击

OAEP填充方案详解

结构设计

       +----------+---------+-------+
       |    lHash |    PS   | 0x01  |
       +----------+---------+-------+
                      DB
                      |
           +----------+
           |   seed   |
           +----------+
           |          |
           |    +-----|
           |    |     |
           +----|--+  |
                |  |  |
               MGF   |
                |    |
            +---+    |
            |        |
            |   +----+
            |   |
            |  MGF
            |   |
    +-------+---+
    |   X   |Y  |
    +-------+---+

算法步骤

  1. 编码:$\text{DB} = \text{lHash} | \text{PS} | \text{0x01} | M$
  2. 掩码生成:$\text{dbMask} = \text{MGF}(\text{seed}, \text{DB} )$
  3. 掩蔽DB:$\text{maskedDB} = \text{DB} \oplus \text{dbMask}$
  4. 种子掩码:$\text{seedMask} = \text{MGF}(\text{maskedDB}, \text{seed} )$
  5. 掩蔽种子:$\text{maskedSeed} = \text{seed} \oplus \text{seedMask}$
  6. 输出:$\text{EM} = \text{0x00} | \text{maskedSeed} | \text{maskedDB}$

安全性理论

定理(OAEP安全性):如果$f$是$(t’, \epsilon’)$-单向陷门置换,$G, H$是随机预言机,则OAEP-$f$是$(t, q_D, q_G, q_H, \epsilon)$-IND-CCA2安全的,其中:

实践中的考虑

1. 掩码生成函数(MGF)

2. 参数选择

3. 随机预言模型的限制

现代替代方案

OAEP+(PKCS #1 v2.1)

PSS(Probabilistic Signature Scheme)填充

虽然主要用于数字签名,PSS的设计理念对理解安全填充方案很有价值。PSS使用以下结构:

       +----------+----------+----------+
       |   salt   |    M     |    BC    |
       +----------+----------+----------+
       |<-- sLen -->|<-- mLen -->|<- 1 ->|
       |                                 |
       +---------+                       |
       |   H     |                       |
       +---------+                       |
       |         |                       |
       |    +----+                       |
       |    |                            |
       |   XOR <----- MGF <----------+   |
       |    |                        |   |
       |    |                        |   |
       +----+                        |   |
       |                             |   |
       |<------------ emLen ------------>|

PSS的关键特性

  1. 概率性:每次签名都不同,即使消息相同
  2. 可证明安全性:在随机预言模型下紧致约简
  3. 可调参数:盐长度可根据安全需求调整

实际实现的安全考虑

1. 常量时间实现

// 错误的实现(存在时序攻击)
if (padding_check(ciphertext) == VALID) {
    return decrypt(ciphertext);
} else {
    return ERROR;
}

// 正确的实现(常量时间)
int valid = padding_check(ciphertext);
uint8_t result[MAX_SIZE];
conditional_decrypt(ciphertext, result, valid);
constant_time_select(output, result, error_msg, valid);

2. 侧信道防护

3. 故障注入防护

填充方案的安全性比较

方案 安全模型 CCA安全性 开销 实现复杂度 标准化
Raw RSA 0% N/A
PKCS#1 v1.5 启发式 ~1% 广泛
OAEP ROM ~2% 推荐
OAEP+ ROM ~2% 有限
PSS ROM N/A ~2% 推荐

现代替代技术

1. 密钥封装机制(KEM)

2. 混合加密系统

3. 前向安全性

实施建议清单

✓ 密码学库选择

✓ 参数配置

✓ 安全实现

✓ 运维安全

Rule of thumb:现代系统应使用OAEP填充,避免PKCS #1 v1.5,并考虑迁移到后量子安全的加密方案。更重要的是,密码学的安全性很大程度上取决于正确的实现和部署。

椭圆曲线密码学

椭圆曲线的代数结构

椭圆曲线密码学(ECC)基于椭圆曲线群的代数结构。在有限域$\mathbb{F}_p$上,椭圆曲线定义为:

\[E: y^2 \equiv x^3 + ax + b \pmod{p}\]

其中$4a^3 + 27b^2 \not\equiv 0 \pmod{p}$(保证曲线非奇异)。

椭圆曲线上的点形成一个阿贝尔群,群运算定义如下:

点加法:设$P = (x_1, y_1)$,$Q = (x_2, y_2)$是曲线上两点

无穷远点$\mathcal{O}$作为群的单位元,满足$P + \mathcal{O} = P$。

椭圆曲线离散对数问题

椭圆曲线密码学的安全性基于椭圆曲线离散对数问题(ECDLP):

ECDLP:给定椭圆曲线$E$上的点$P$和$Q = kP$($k$为正整数),计算$k$在计算上不可行。

相比于普通的离散对数问题,ECDLP具有以下优势:

  1. 指数级安全性:最佳攻击算法(Pollard’s rho)需要$O(\sqrt{n})$时间,其中$n$是群的阶
  2. 密钥长度优势:256位ECC密钥提供与3072位RSA相当的安全性

Rule of thumb:选择椭圆曲线时,确保群的阶$n$是大素数,避免anomalous曲线和supersingular曲线。

ECC的优势与实现

椭圆曲线密码学的主要优势:

  1. 密钥长度短:相同安全级别下,ECC密钥比RSA短得多
  2. 计算效率高:点乘运算比大整数指数运算更快
  3. 带宽友好:小密钥适合移动设备和物联网应用

标准曲线

点乘算法:计算$kP$通常使用二进制方法或滑动窗口技术,时间复杂度为$O(\log k)$。

离散对数问题与其他困难性假设

Diffie-Hellman问题族

离散对数问题是公钥密码学的另一重要基础。在循环群$G$中:

离散对数问题(DLP):给定生成元$g$和$y = g^x$,计算$x$。

相关的困难性假设包括:

计算Diffie-Hellman(CDH):给定$(g, g^a, g^b)$,计算$g^{ab}$。

判定Diffie-Hellman(DDH):给定$(g, g^a, g^b, g^c)$,判断$c = ab$是否成立。

Gap Diffie-Hellman(GDH):CDH困难但存在DDH预言机。

这些假设之间的关系:$DLP \Rightarrow CDH \Rightarrow DDH$

计算与判定假设的区别

计算假设关注计算特定值的困难性,而判定假设关注区分两个分布的困难性。

例如,在某些群中(如某些椭圆曲线群),DDH可能是容易的(存在有效的双线性配对),但CDH仍然困难。这种性质被用于构造基于配对的密码学协议。

量子威胁分析

Shor算法对传统公钥密码学构成致命威胁:

Shor算法复杂度

这意味着足够大的量子计算机可以在多项式时间内破解RSA和ECC。

Post-quantum安全性:当前研究集中在量子计算机难以解决的问题:

  1. 格问题:最短向量问题(SVP)
  2. 编码理论:错误纠正问题
  3. 多变量密码学:求解多变量多项式方程组
  4. 哈希函数:Merkle树签名
  5. 同构密码学:超奇异椭圆曲线同构

Rule of thumb:考虑到量子计算发展,建议从现在开始规划向后量子密码学的迁移。