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:考虑到量子计算发展,建议从现在开始规划向后量子密码学的迁移。