3. 非对称密码基础:公钥密码学原理、RSA算法、椭圆曲线密码学(ECC)、密钥对生成

3.1 公钥密码学核心原理

公钥密码学(Public-Key Cryptography)是现代安全通信的基石,它解决了对称密码中密钥分发与管理的核心难题。其核心思想是使用一对数学上相关但无法相互推导的密钥:公钥(Public Key)和私钥(Private Key)。

  • 公钥:公开分发,用于加密数据或验证签名。
  • 私钥:秘密持有,用于解密数据或生成签名。

公钥密码学必须满足以下三个基本条件:

  1. 单向性:从公钥无法在计算可行的时间内推导出私钥。
  2. 陷门性:拥有私钥(陷门信息)可以轻松完成解密或签名操作。
  3. 正确性:使用公钥加密后,必须能用对应的私钥解密恢复原文。
核心优势: 相比对称密码,公钥密码在密钥分发上具有天然优势——通信双方无需预先共享秘密信道。但公钥密码的计算速度通常比对称密码慢 100-1000 倍,因此实际应用中常与对称密码结合使用(混合加密)。

3.2 RSA算法

RSA(Rivest-Shamir-Adleman)是1977年提出的第一个实用的公钥密码算法,其安全性基于大整数分解难题(Factoring Problem):给定两个大素数 p 和 q 的乘积 n,在不知道 p 和 q 的情况下,分解 n 是计算上不可行的。

3.2.1 密钥生成步骤

  1. 选择大素数:随机选择两个大素数 p 和 q(通常为 1024 位以上)。
  2. 计算模数:n = p × q。
  3. 计算欧拉函数:φ(n) = (p-1) × (q-1)。
  4. 选择公钥指数:选择一个整数 e,满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1(通常取 e = 65537)。
  5. 计算私钥指数:计算 d ≡ e⁻¹ mod φ(n),即 d 是 e 模 φ(n) 的乘法逆元。

最终:公钥为 (n, e),私钥为 (n, d)。

3.2.2 加密与解密

  • 加密:c = me mod n(m 为明文,c 为密文)
  • 解密:m = cd mod n
安全参数建议: 截至2025年,RSA 密钥长度至少应为 2048 位(n 的二进制长度),推荐使用 3072 位或 4096 位。1024 位 RSA 已被认为不再安全。

3.2.3 RSA 算法流程

RSA 密钥生成与加解密流程 密钥生成阶段 选择 p, q → 计算 n = p×q → 计算 φ(n) = (p-1)(q-1) → 选择 e → 计算 d 公钥: (n, e)  私钥: (n, d) 发送方(加密) 获取接收方公钥 (n, e) 明文 m → c = me mod n 发送密文 c 接收方(解密) 使用私钥 (n, d) 密文 c → m = cd mod n 恢复明文 m 安全性基础:大整数分解难题 攻击者已知 n 和 e,但无法在多项式时间内分解 n 得到 p 和 q,从而无法计算 d 量子计算机出现后,Shor 算法可破解 RSA,需迁移至后量子密码

3.3 椭圆曲线密码学(ECC)

椭圆曲线密码学(Elliptic Curve Cryptography, ECC)是另一种重要的公钥密码体系,其安全性基于椭圆曲线离散对数问题(ECDLP)。ECC 在同等安全强度下,密钥长度远小于 RSA,计算效率更高。

3.3.1 椭圆曲线定义

在有限域 Fp 上,椭圆曲线由 Weierstrass 方程定义:

y² = x³ + ax + b (mod p)
其中 4a³ + 27b² ≠ 0 (mod p)

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

  • 点加法:P + Q = R(几何意义为过 P、Q 的直线与曲线的第三个交点关于 x 轴的对称点)
  • 标量乘法:kP = P + P + ... + P(k 次点加法)

3.3.2 ECC 密钥对生成

  1. 选择曲线参数:选择有限域 Fp 上的椭圆曲线 E,以及基点 G(阶为 n)。
  2. 生成私钥:随机选择一个整数 d ∈ [1, n-1] 作为私钥。
  3. 计算公钥:计算 Q = d × G,Q 即为公钥(椭圆曲线上的一个点)。
安全警告: 必须使用标准化的椭圆曲线(如 NIST P-256、Curve25519),禁止使用自定义曲线。自定义曲线可能存在未知的弱点或后门,历史上已有多次因使用弱曲线导致系统被攻破的案例。

3.3.3 RSA 与 ECC 安全强度对比

安全等级(比特) RSA 密钥长度(位) ECC 密钥长度(位) 性能优势
80 1024 160-223 ECC 快 3-5 倍
112 2048 224-255 ECC 快 5-10 倍
128 3072 256-383 ECC 快 10-20 倍
192 7680 384-511 ECC 快 20-50 倍
256 15360 512+ ECC 快 50-100 倍

3.4 密钥对生成实践

在实际系统中,密钥对生成需要结合真随机数生成器(TRNG)或密码学安全的伪随机数生成器(CSPRNG),确保私钥的不可预测性。

3.4.1 密钥对生成流程

密钥对生成通用流程 步骤1:熵源采集 TRNG / CSPRNG 步骤2:参数生成 RSA: p, q / ECC: d 步骤3:密钥计算 RSA: n, e, d / ECC: Q 密钥对输出 私钥:安全存储(HSM / 安全飞地 / 加密文件) 公钥:生成证书 / 分发至通信对端 密钥对生成安全要点 ① 必须使用经过认证的密码库(如 OpenSSL、Bouncy Castle、libsodium) ② 私钥必须加密存储,访问需经过身份验证和授权

3.4.2 代码示例:使用 OpenSSL 生成密钥对

# 生成 RSA 2048 位私钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private_rsa.pem

# 从私钥提取公钥
openssl pkey -in private_rsa.pem -pubout -out public_rsa.pem

# 生成 ECC P-256 私钥
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out private_ecc.pem

# 从私钥提取公钥
openssl pkey -in private_ecc.pem -pubout -out public_ecc.pem

# 查看密钥详细信息
openssl pkey -in private_rsa.pem -text -noout
openssl pkey -in private_ecc.pem -text -noout

3.5 公钥密码学对比总结

特性 RSA ECC
数学基础 大整数分解难题 椭圆曲线离散对数问题
密钥长度(128位安全) 3072 位 256 位
加密/解密速度 较慢(指数运算) 较快(标量乘法)
签名/验签速度 签名慢,验签快 签名快,验签较快
密钥生成速度 慢(需要生成大素数) 快(随机数 + 标量乘法)
标准化程度 PKCS#1, FIPS 186 SECG, NIST, RFC 7748
量子抗性 无(Shor 算法可破解) 无(Shor 算法可破解)
典型应用 数字证书、传统 VPN 移动设备、TLS 1.3、区块链
选型建议: 新系统优先选择 ECC(如 Curve25519 或 P-256),以获得更好的性能和更小的密钥尺寸。对于需要兼容旧系统的场景,RSA 2048 位仍是安全且广泛支持的选择。对于长期安全需求(10年以上),建议关注后量子密码(PQC)标准化进展。