3. 非对称密码基础:公钥密码学原理、RSA算法、椭圆曲线密码学(ECC)、密钥对生成
3.1 公钥密码学核心原理
公钥密码学(Public-Key Cryptography)是现代安全通信的基石,它解决了对称密码中密钥分发与管理的核心难题。其核心思想是使用一对数学上相关但无法相互推导的密钥:公钥(Public Key)和私钥(Private Key)。
- 公钥:公开分发,用于加密数据或验证签名。
- 私钥:秘密持有,用于解密数据或生成签名。
公钥密码学必须满足以下三个基本条件:
- 单向性:从公钥无法在计算可行的时间内推导出私钥。
- 陷门性:拥有私钥(陷门信息)可以轻松完成解密或签名操作。
- 正确性:使用公钥加密后,必须能用对应的私钥解密恢复原文。
核心优势: 相比对称密码,公钥密码在密钥分发上具有天然优势——通信双方无需预先共享秘密信道。但公钥密码的计算速度通常比对称密码慢 100-1000 倍,因此实际应用中常与对称密码结合使用(混合加密)。
3.2 RSA算法
RSA(Rivest-Shamir-Adleman)是1977年提出的第一个实用的公钥密码算法,其安全性基于大整数分解难题(Factoring Problem):给定两个大素数 p 和 q 的乘积 n,在不知道 p 和 q 的情况下,分解 n 是计算上不可行的。
3.2.1 密钥生成步骤
- 选择大素数:随机选择两个大素数 p 和 q(通常为 1024 位以上)。
- 计算模数:n = p × q。
- 计算欧拉函数:φ(n) = (p-1) × (q-1)。
- 选择公钥指数:选择一个整数 e,满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1(通常取 e = 65537)。
- 计算私钥指数:计算 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 算法流程
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 密钥对生成
- 选择曲线参数:选择有限域 Fp 上的椭圆曲线 E,以及基点 G(阶为 n)。
- 生成私钥:随机选择一个整数 d ∈ [1, n-1] 作为私钥。
- 计算公钥:计算 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 密钥对生成流程
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)标准化进展。