RSA 加密算法完全指南

深入浅出讲解RSA加密算法的原理、密钥对生成、加密解密流程,包含Java和JavaScript代码示例,以及常见应用场景和安全最佳实践。

加密哈希 2026-05-27 10 分钟

RSA 加密算法完全指南

RSA 是目前最广泛使用的非对称加密算法之一,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 于 1977 年共同提出。它在网络安全、数字签名、身份认证等领域扮演着核心角色。

什么是非对称加密?

与对称加密(如 AES)使用同一把密钥加密和解密不同,非对称加密使用一对密钥

  • 公钥(Public Key):可以公开分享,用于加密数据
  • 私钥(Private Key):必须严格保密,用于解密数据

用公钥加密的数据只能用对应的私钥解密,反之亦然。这种机制解决了密钥分发的难题。

RSA 算法原理

RSA 的安全性基于大整数分解的数学难题:将两个大质数相乘很容易,但将乘积分解回两个质数却极其困难。

密钥生成步骤

  1. 选择两个大质数 p 和 q
  2. 计算 n = p × q,n 的长度就是密钥长度(如 2048 位)
  3. 计算欧拉函数 φ(n) = (p-1)(q-1)
  4. 选择公钥指数 e,通常取 65537
  5. 计算私钥指数 d,使得 d × e ≡ 1 (mod φ(n))
  6. 公钥 = (e, n),私钥 = (d, n)

加密解密过程

  • 加密:密文 C = M^e mod n(M 为明文)
  • 解密:明文 M = C^d mod n

JavaScript 实现

在前端中可以使用 jsencrypt 库实现 RSA 加密:

import JSEncrypt from 'jsencrypt'

// 加密
const encrypt = new JSEncrypt()
encrypt.setPublicKey(publicKey)
const encrypted = encrypt.encrypt('Hello, RSA!')

// 解密
const decrypt = new JSEncrypt()
decrypt.setPrivateKey(privateKey)
const decrypted = decrypt.decrypt(encrypted)

Java 实现

Java 标准库提供了完整的 RSA 支持:

import java.security.*;
import javax.crypto.Cipher;
import java.util.Base64;

// 生成密钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();

// 加密
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal("Hello, RSA!".getBytes("UTF-8"));
String encryptedBase64 = Base64.getEncoder().encodeToString(encrypted);

// 解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedBase64));
String result = new String(decrypted, "UTF-8");

常见应用场景

1. HTTPS/SSL 证书

HTTPS 握手阶段使用 RSA 交换对称密钥,之后使用对称加密传输数据。这是 RSA 最常见的应用场景。

2. 数字签名

发送方用私钥签名,接收方用公钥验证。这确保了数据的完整性不可否认性

3. 身份认证

SSH 登录、API 接口认证等场景中,客户端使用私钥证明自己的身份。

4. 数据加密

适合加密小量敏感数据(如对称密钥、密码等),不建议直接加密大量数据。

安全最佳实践

密钥长度

  • 1024 位:已不安全,不建议使用
  • 2048 位:当前最低推荐标准
  • 4096 位:更高安全需求时使用

填充方案

避免使用原始的 RSA(无填充),应使用安全的填充方案:

  • OAEP(推荐):Optimal Asymmetric Encryption Padding
  • PKCS#1 v1.5:兼容性好但安全性略低于 OAPE

密钥管理

  • 私钥必须严格保密,建议使用硬件安全模块(HSM)存储
  • 定期轮换密钥对
  • 不要在前端 JavaScript 中存储私钥

RSA 的局限性

  1. 速度慢:比对称加密慢 100-1000 倍,不适合加密大量数据
  2. 密文长度:加密后的数据长度等于密钥长度,会增大体积
  3. 量子威胁:量子计算机理论上可以破解 RSA,但目前还不可行

总结

RSA 作为经典的非对称加密算法,在现代网络安全中仍然不可替代。理解其原理和正确使用方式,是每个开发者的必备技能。推荐使用 jsjson.com RSA 加密工具 在线体验 RSA 加密解密过程。


本文最后更新于 2026 年 5 月

📚 相关文章