前置知识: 网络安全

非对称加密

00:00
5 min Intermediate 2026/6/14

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

1. 非对称加密基础

1.1 基本概念

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

1.2 核心应用

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

1.3 与对称加密对比

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

2. RSA 算法

2.1 数学基础

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

密钥生成

  1. 选择两个大素数 (通常 1024+ 位)
  2. 计算
  3. 计算欧拉函数
  4. 选择 ,满足 (通常
  5. 计算 ,满足
  • 公钥:
  • 私钥:

加密

解密

2.2 正确性证明

,存在 使

(由欧拉定理 ,当

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 攻击

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

3. ECC 椭圆曲线加密

3.1 数学基础

椭圆曲线定义

加法

标量乘法 次)

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

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

4.2 安全参数

参数推荐
2048+
2 或 5

4.3 前向保密

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

5. 算法选择指南

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

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式