Skip to content
crypto2026-07-252 分钟阅读

什么是 RSA 加密

RSA 是最广泛使用的非对称加密算法,由 Rivest、Shamir、Adleman 三人于 1977 年提出。它使用一对密钥:公钥加密,私钥解密。

RSA 工作原理

密钥对生成:
  选择两个大质数 p, q
  计算 n = p × q
  计算 φ(n) = (p-1)(q-1)
  选择 e 使得 gcd(e, φ(n)) = 1
  计算 d 使得 e×d ≡ 1 (mod φ(n))

公钥: (e, n)   ← 可以公开
私钥: (d, n)   ← 必须保密

加密: C = M^e mod n
解密: M = C^d mod n

RSA vs AES

| 特性 | RSA(非对称) | AES(对称) | |------|--------------|------------| | 密钥数量 | 一对(公钥+私钥) | 一个共享密钥 | | 加密速度 | 慢(1000x) | 快 | | 数据大小 | 有限制(< 密钥长度) | 无限制 | | 典型用途 | 密钥交换、数字签名 | 数据加密 | | 密钥长度 | 2048-4096 位 | 128-256 位 |

为什么需要 RSA 加密

  1. 安全通信:HTTPS/TLS 握手中的密钥交换
  2. 数字签名:验证数据完整性和来源
  3. API 认证:JWT RS256 签名验证
  4. 密钥交换:安全传输 AES 会话密钥
  5. 代码签名:验证软件发布者身份

如何使用在线工具

使用 DevToolkit Pro 的 RSA 加解密工具

  1. 生成 RSA 密钥对(2048/4096 位)
  2. 使用公钥加密数据
  3. 使用私钥解密数据
  4. 创建和验证数字签名
  5. 支持 PEM 格式导入/导出

代码中的 RSA

JavaScript:Web Crypto API

// 生成 RSA 密钥对
async function generateRSAKeyPair() {
  const keyPair = await crypto.subtle.generateKey(
    {
      name: 'RSA-OAEP',
      modulusLength: 2048,
      publicExponent: new Uint8Array([1, 0, 1]),
      hash: 'SHA-256',
    },
    true,
    ['encrypt', 'decrypt']
  );
  return keyPair;
}

// 加密
async function rsaEncrypt(publicKey, data) {
  const encoder = new TextEncoder();
  const encrypted = await crypto.subtle.encrypt(
    { name: 'RSA-OAEP' },
    publicKey,
    encoder.encode(data)
  );
  return new Uint8Array(encrypted);
}

// 解密
async function rsaDecrypt(privateKey, encryptedData) {
  const decrypted = await crypto.subtle.decrypt(
    { name: 'RSA-OAEP' },
    privateKey,
    encryptedData
  );
  return new TextDecoder().decode(decrypted);
}

Python:使用 cryptography 库

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

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

# 加密
ciphertext = public_key.encrypt(
    b"Hello, RSA!",
    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
    )
)

FAQ

RSA 密钥长度如何选择?

  • 2048 位:当前标准,足够安全
  • 3072 位:更高安全要求
  • 4096 位:最高安全级别(性能较低) NIST 建议至少 2048 位,2030 年后建议 3072 位以上。

RSA 和 ECC 哪个更好?

ECC(椭圆曲线)在相同安全级别下密钥更短(256 位 ECC ≈ 3072 位 RSA),性能也更好。但 RSA 更成熟、兼容性更好。新项目推荐 ECC,现有系统保持 RSA。

为什么 RSA 不能直接加密大文件?

RSA 加密有长度限制(密钥长度 - 填充开销),且速度慢。实际使用中,RSA 用于加密 AES 密钥,再用 AES 加密文件(混合加密)。


本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页


ad