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 密钥生成过程包含以下步骤:
- 选择大素数:随机选择两个大素数 p 和 q,通常要求 p ≠ q,且长度相近(如 1024 位)。
- 计算模数 n:n = p × q。n 的二进制长度即为 RSA 密钥长度(如 2048 位)。
- 计算欧拉函数 φ(n):φ(n) = (p-1) × (q-1)。
- 选择公钥指数 e:选择一个整数 e,满足 1 < e < φ(n),且 gcd(e, φ(n)) = 1(即 e 与 φ(n) 互质)。常用 e = 65537(0x10001),因其二进制表示中只有两个 1,可加速加密运算。
- 计算私钥指数 d:计算 e 关于模 φ(n) 的乘法逆元,即 d ≡ e⁻¹ (mod φ(n)),满足 e × d ≡ 1 (mod φ(n))。
最终,公钥为 (n, e),私钥为 (n, d)。p、q、φ(n) 必须安全销毁或严格保密。
3.1.2 加密与解密
RSA 加密和解密基于模幂运算。假设明文为 m,密文为 c:
- 加密:c = me mod n(使用公钥 (n, e))
- 解密:m = cd mod n(使用私钥 (n, d))
RSA 算法要求明文 m 必须满足 0 ≤ m < n。实际应用中,RSA 通常不直接加密原始数据,而是加密对称密钥(密钥封装)或消息摘要(数字签名)。
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 填充模式)。
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 密钥生成过程:
- 选择一条椭圆曲线 E 和基点 G(阶为 n)。
- 随机选择私钥 d(1 ≤ d < n)。
- 计算公钥 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 优势显著 |
3.3 DH 密钥交换协议
Diffie-Hellman(DH)密钥交换协议由 Whitfield Diffie 和 Martin Hellman 于 1976 年提出,是第一个公钥密码协议。它允许通信双方在不安全的信道上协商出一个共享密钥,而该密钥可被用于后续的对称加密通信。
3.3.1 协议原理
DH 协议基于离散对数问题(DLP)的难解性。协议流程如下:
- 全局参数:双方协商一个大素数 p 和生成元 g(g 是模 p 的原根)。
- 生成私钥:Alice 随机选择私钥 a(1 ≤ a ≤ p-2),Bob 随机选择私钥 b。
- 计算公钥:Alice 计算 A = ga mod p,Bob 计算 B = gb mod p。
- 交换公钥:Alice 将 A 发送给 Bob,Bob 将 B 发送给 Alice。
- 计算共享密钥: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)。
3.4 算法对比与选型建议
| 特性 | RSA | ECC | DH / ECDH |
|---|---|---|---|
| 数学基础 | 大整数分解 | 椭圆曲线离散对数 | 离散对数 / ECDLP |
| 主要用途 | 加密、数字签名、密钥封装 | 数字签名、密钥交换、加密 | 密钥交换 |
| 密钥长度(128 位安全) | 3072 位 | 256 位 | 256 位(ECDH) |
| 加密速度 | 较慢(模幂运算) | 较快(标量乘法) | 较快(ECDH) |
| 前向安全性 | 不支持(静态密钥) | 不支持(静态密钥) | 支持(临时密钥 ECDHE) |
| 抗量子计算 | 脆弱(Shor 算法) | 脆弱(Shor 算法) | 脆弱(Shor 算法) |