3. 非对称加密算法基础

非对称加密(Asymmetric Cryptography)是现代密码学的重要基石。与对称加密使用单一密钥不同,非对称加密使用一对密钥:公钥(Public Key) 和 私钥(Private Key)。公钥可以公开分发,私钥必须严格保密。这一特性使得密钥分发问题得到根本解决,并为数字签名、密钥交换等安全服务提供了基础。

3.1 RSA 算法原理

RSA 算法由 Rivest、Shamir 和 Adleman 于 1977 年提出,是应用最广泛的非对称加密算法。其安全性基于大整数分解的数学难题:给定两个大素数 p 和 q 的乘积 n,在不知道 p 和 q 的情况下,分解 n 在计算上是不可行的。

3.1.1 密钥生成

RSA 密钥生成过程包含以下步骤:

  1. 选择大素数:随机选择两个大素数 p 和 q,通常要求 p ≠ q,且长度相近(如 1024 位)。
  2. 计算模数 n:n = p × q。n 的二进制长度即为 RSA 密钥长度(如 2048 位)。
  3. 计算欧拉函数 φ(n):φ(n) = (p-1) × (q-1)。
  4. 选择公钥指数 e:选择一个整数 e,满足 1 < e < φ(n),且 gcd(e, φ(n)) = 1(即 e 与 φ(n) 互质)。常用 e = 65537(0x10001),因其二进制表示中只有两个 1,可加速加密运算。
  5. 计算私钥指数 d:计算 e 关于模 φ(n) 的乘法逆元,即 d ≡ e⁻¹ (mod φ(n)),满足 e × d ≡ 1 (mod φ(n))。

最终,公钥为 (n, e),私钥为 (n, d)。p、q、φ(n) 必须安全销毁或严格保密。

密钥长度建议:当前安全标准要求 RSA 密钥长度至少为 2048 位。1024 位已被认为不安全,4096 位提供更高安全余量但性能开销较大。

3.1.2 加密与解密

RSA 加密和解密基于模幂运算。假设明文为 m,密文为 c:

  • 加密:c = me mod n(使用公钥 (n, e))
  • 解密:m = cd mod n(使用私钥 (n, d))

RSA 算法要求明文 m 必须满足 0 ≤ m < n。实际应用中,RSA 通常不直接加密原始数据,而是加密对称密钥(密钥封装)或消息摘要(数字签名)。

数学原理验证:根据欧拉定理,当 m 与 n 互质时,mφ(n) ≡ 1 (mod n)。由于 e×d ≡ 1 (mod φ(n)),可推导出 (me)d ≡ me×d ≡ mk×φ(n)+1 ≡ m (mod n),从而保证解密正确性。

3.1.3 数字签名

RSA 数字签名是加密过程的逆用:

  • 签名:使用私钥 (n, d) 对消息哈希值 h 进行签名:s = hd mod n。
  • 验签:使用公钥 (n, e) 计算 h' = se mod n,并与原始消息哈希值 h 比较。若相等,则签名有效。

数字签名提供身份认证、数据完整性和不可否认性。实际应用中,签名前需对消息进行哈希处理(如 SHA-256),并遵循 PKCS#1 v2.2 等填充标准(如 PSS 填充模式)。

安全警告:直接对原始消息进行 RSA 签名(教科书式 RSA)存在安全风险,如选择明文攻击。必须使用安全的填充方案(如 RSA-PSS)来防止签名伪造。
RSA 加密与数字签名流程对比 加密流程 明文 m 公钥 (n, e) 加密 密文 c 私钥 (n, d) 解密 恢复明文 m 数字签名流程 消息 + 哈希 私钥 (n, d) 签名 签名值 s 公钥 (n, e) 验签 验证结果

3.2 ECC 椭圆曲线密码学简介

椭圆曲线密码学(Elliptic Curve Cryptography, ECC)是一种基于椭圆曲线数学理论的公钥密码体制。ECC 在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。其核心优势在于:在提供相同安全等级的前提下,ECC 的密钥长度远小于 RSA,从而带来更快的计算速度和更低的存储开销。

3.2.1 椭圆曲线基础

密码学中使用的椭圆曲线通常定义在有限域 Fp(p 为大素数)上,其方程为:

y² = x³ + ax + b (mod p)
其中 4a³ + 27b² ≠ 0 (mod p),确保曲线无奇异点

椭圆曲线上的点构成一个阿贝尔群,群运算包括:

  • 点加法:曲线上两点 P 和 Q 的连线与曲线交于第三点 R',R' 关于 x 轴的对称点即为 P + Q。
  • 标量乘法:k × P = P + P + ... + P(k 次),这是 ECC 的核心运算。

3.2.2 ECC 密钥生成与安全性

ECC 密钥生成过程:

  1. 选择一条椭圆曲线 E 和基点 G(阶为 n)。
  2. 随机选择私钥 d(1 ≤ d < n)。
  3. 计算公钥 Q = d × G。

ECC 的安全性基于椭圆曲线离散对数问题(ECDLP):已知基点 G 和公钥 Q,求解私钥 d 使得 Q = d × G 在计算上是不可行的。目前,ECDLP 没有已知的亚指数时间攻击算法,因此 ECC 在同等安全强度下密钥长度更短。

安全等级(比特) RSA 密钥长度 ECC 密钥长度 性能对比
80 1024 位 160 位 ECC 快 3-5 倍
112 2048 位 224 位 ECC 快 5-10 倍
128 3072 位 256 位 ECC 快 10-20 倍
192 7680 位 384 位 ECC 优势显著
256 15360 位 521 位 ECC 优势显著
推荐曲线:NIST P-256(secp256r1)、Curve25519(X25519)是目前广泛使用的椭圆曲线。Curve25519 在设计上避免了侧信道攻击,性能优异,被 TLS 1.3 和 SSH 等协议广泛采用。

3.3 DH 密钥交换协议

Diffie-Hellman(DH)密钥交换协议由 Whitfield Diffie 和 Martin Hellman 于 1976 年提出,是第一个公钥密码协议。它允许通信双方在不安全的信道上协商出一个共享密钥,而该密钥可被用于后续的对称加密通信。

3.3.1 协议原理

DH 协议基于离散对数问题(DLP)的难解性。协议流程如下:

  1. 全局参数:双方协商一个大素数 p 和生成元 g(g 是模 p 的原根)。
  2. 生成私钥:Alice 随机选择私钥 a(1 ≤ a ≤ p-2),Bob 随机选择私钥 b。
  3. 计算公钥:Alice 计算 A = ga mod p,Bob 计算 B = gb mod p。
  4. 交换公钥:Alice 将 A 发送给 Bob,Bob 将 B 发送给 Alice。
  5. 计算共享密钥:Alice 计算 K = Ba mod p = (gb)a mod p = gab mod p;Bob 计算 K = Ab mod p = (ga)b mod p = gab mod p。

最终,Alice 和 Bob 得到相同的共享密钥 K,而窃听者即使截获 p、g、A、B,也无法在合理时间内计算出 K。

3.3.2 椭圆曲线 Diffie-Hellman(ECDH)

ECDH 是 DH 协议在椭圆曲线上的变体,利用 ECC 的高效性实现密钥交换:

  • 全局参数:椭圆曲线 E、基点 G、阶 n。
  • 私钥:Alice 选择 dA,Bob 选择 dB。
  • 公钥:Alice 计算 QA = dA × G,Bob 计算 QB = dB × G。
  • 共享密钥:Alice 计算 K = dA × QB = dA × dB × G;Bob 计算 K = dB × QA = dB × dA × G。

ECDH 在 TLS 1.3、SSH、IPsec 等协议中作为密钥交换的标准方案,提供前向安全性(Perfect Forward Secrecy, PFS)。

中间人攻击防范:基础的 DH/ECDH 协议无法抵抗中间人攻击(MITM)。攻击者可以拦截并替换公钥。实际部署中必须结合数字证书和数字签名进行身份认证,如使用 ECDHE(Ephemeral ECDH)配合证书签名。
DH / ECDH 密钥交换协议流程 Alice 私钥 a / dA 公钥 A / QA 公钥交换 K = Ba / dA×QB 共享密钥 K Bob 私钥 b / dB 公钥 B / QB K = Ab / dB×QA 共享密钥 K 不安全信道

3.4 算法对比与选型建议

特性 RSA ECC DH / ECDH
数学基础 大整数分解 椭圆曲线离散对数 离散对数 / ECDLP
主要用途 加密、数字签名、密钥封装 数字签名、密钥交换、加密 密钥交换
密钥长度(128 位安全) 3072 位 256 位 256 位(ECDH)
加密速度 较慢(模幂运算) 较快(标量乘法) 较快(ECDH)
前向安全性 不支持(静态密钥) 不支持(静态密钥) 支持(临时密钥 ECDHE)
抗量子计算 脆弱(Shor 算法) 脆弱(Shor 算法) 脆弱(Shor 算法)
工程选型建议:在加密隧道(如 TLS、IPsec、WireGuard)中,推荐使用 ECDHE 进行密钥交换(提供前向安全性),使用 ECDSA 或 EdDSA 进行数字签名,使用 RSA 或 ECIES 进行密钥封装。对于需要兼容旧系统的场景,RSA 仍然是广泛支持的选择。