前置知识: 网络安全

非对称加密

5 minIntermediate2026/6/14

非对称加密原理:RSA、ECC、Diffie-Hellman 等算法详解与应用。

1. 非对称加密基础

1.1 基本概念

非对称加密使用一对密钥:公钥(公开)和私钥(保密)。

Epub(M)=C,Dpriv(C)=ME_{pub}(M) = C, \quad D_{priv}(C) = M

1.2 核心应用

应用方式
加密通信公钥加密,私钥解密
数字签名私钥签名,公钥验证
密钥交换协商共享密钥

1.3 与对称加密对比

对比项对称加密非对称加密
密钥1 个共享密钥公钥+私钥对
速度快(1000x+)
密钥分发困难简单
典型用途数据加密密钥交换/签名

2. RSA 算法

2.1 数学基础

RSA 安全性基于大整数分解困难性

密钥生成

  1. 选择两个大素数 p,qp, q(通常 1024+ 位)
  2. 计算 n=pqn = pq
  3. 计算欧拉函数 ϕ(n)=(p1)(q1)\phi(n) = (p-1)(q-1)
  4. 选择 ee,满足 1<e<ϕ(n)1 < e < \phi(n)gcd(e,ϕ(n))=1\gcd(e, \phi(n)) = 1(通常 e=65537e = 65537
  5. 计算 dd,满足 ed1(modϕ(n))ed \equiv 1 \pmod{\phi(n)}
  • 公钥:(n,e)(n, e)
  • 私钥:(n,d)(n, d)

加密C=MemodnC = M^e \mod n

解密M=CdmodnM = C^d \mod n

2.2 正确性证明

ed1(modϕ(n))ed \equiv 1 \pmod{\phi(n)},存在 kk 使 ed=kϕ(n)+1ed = k\phi(n) + 1

Cd=(Me)d=Med=Mkϕ(n)+1=Mkϕ(n)MM(modn)C^d = (M^e)^d = M^{ed} = M^{k\phi(n)+1} = M^{k\phi(n)} \cdot M \equiv M \pmod{n}

(由欧拉定理 Mϕ(n)1(modn)M^{\phi(n)} \equiv 1 \pmod{n},当 gcd(M,n)=1\gcd(M, n) = 1

2.3 RSA 填充方案

方案全称安全性
PKCS#1 v1.5RSAES-PKCS1-v1_5存在 Bleichenbacher 攻击
OAEPOptimal Asymmetric Encryption Padding推荐
PSSProbabilistic Signature Scheme签名推荐

OAEP 填充

m' = m || 0...0  ← 填充到 n 的长度
m' = MGF(seed) XOR m' || seed = MGF(m') XOR seed
C = (m')^e mod n

2.4 RSA 代码示例

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes

# 生成密钥对
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)
public_key = private_key.public_key()

# 加密
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 解密
plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

2.5 RSA 攻击

攻击条件描述
分解攻击nn 较小直接分解 nn
共模攻击同一 nn 不同 ee利用扩展欧几里得算法
低指数攻击ee 过小且 MMMe<nM^e < n 时直接开方
BleichenbacherPKCS#1 v1.5Oracle 攻击
侧信道时间/功耗Montgomery 乘法泄露

3. ECC 椭圆曲线加密

3.1 数学基础

椭圆曲线定义:

y2=x3+ax+b(modp)y^2 = x^3 + ax + b \pmod{p}

点加法P+Q=RP + Q = R

标量乘法kP=P+P++PkP = P + P + \cdots + Pkk 次)

离散对数问题(ECDLP):已知 PPkPkP,求 kk 是困难的。

3.2 常用曲线

曲线密钥长度等效 RSA用途
secp256k1256 位3072 位Bitcoin
P-256256 位3072 位TLS/通用
P-384384 位7680 位高安全
Curve25519256 位3072 位密钥交换
Ed448448 位~14000 位高安全

3.3 ECDH 密钥交换

Alice: 生成私钥 a,计算 aG(G 为基点)
Bob:   生成私钥 b,计算 bG

交换: Alice → aG → Bob
      Bob   → bG → Alice

共享密钥:
Alice: a(bG) = abG
Bob:   b(aG) = abG

3.4 ECDSA 签名

from cryptography.hazmat.primitives.asymmetric import ec

# 生成密钥
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()

# 签名
signature = private_key.sign(message, ec.ECDSA(hashes.SHA256()))

# 验证
public_key.verify(signature, message, ec.ECDSA(hashes.SHA256()))

3.5 EdDSA(Ed25519)

from cryptography.hazmat.primitives.asymmetric import ed25519

# 生成密钥
private_key = ed25519.Ed25519PrivateKey.generate()

# 签名(无需指定哈希算法)
signature = private_key.sign(message)

# 验证
public_key = private_key.public_key()
public_key.verify(signature, message)

Ed25519 优势

  • 确定性签名(无随机数依赖)
  • 快速
  • 抗侧信道
  • 无歧义验证

4. Diffie-Hellman 密钥交换

4.1 经典 DH

A=gamodp,B=gbmodpA = g^a \mod p, \quad B = g^b \mod p

s=Bamodp=Abmodp=gabmodps = B^a \mod p = A^b \mod p = g^{ab} \mod p

4.2 安全参数

参数推荐值
pp2048+ 位
gg2 或 5

4.3 前向保密

使用临时密钥(Ephemeral DH / DHE),每次会话生成新的 DH 参数,即使长期私钥泄露,历史会话仍安全。

5. 算法选择指南

场景推荐算法
密钥交换X25519(ECDH)
数字签名Ed25519 / ECDSA P-256
加密RSA-OAEP 2048+
兼容旧系统RSA 2048+
禁止使用RSA 1024、DH 768