RSA 加密算法完全指南
RSA 是目前最广泛使用的非对称加密算法之一,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 于 1977 年共同提出。它在网络安全、数字签名、身份认证等领域扮演着核心角色。
什么是非对称加密?
与对称加密(如 AES)使用同一把密钥加密和解密不同,非对称加密使用一对密钥:
- 公钥(Public Key):可以公开分享,用于加密数据
- 私钥(Private Key):必须严格保密,用于解密数据
用公钥加密的数据只能用对应的私钥解密,反之亦然。这种机制解决了密钥分发的难题。
RSA 算法原理
RSA 的安全性基于大整数分解的数学难题:将两个大质数相乘很容易,但将乘积分解回两个质数却极其困难。
密钥生成步骤
- 选择两个大质数 p 和 q
- 计算 n = p × q,n 的长度就是密钥长度(如 2048 位)
- 计算欧拉函数 φ(n) = (p-1)(q-1)
- 选择公钥指数 e,通常取 65537
- 计算私钥指数 d,使得 d × e ≡ 1 (mod φ(n))
- 公钥 = (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 的局限性
- 速度慢:比对称加密慢 100-1000 倍,不适合加密大量数据
- 密文长度:加密后的数据长度等于密钥长度,会增大体积
- 量子威胁:量子计算机理论上可以破解 RSA,但目前还不可行
总结
RSA 作为经典的非对称加密算法,在现代网络安全中仍然不可替代。理解其原理和正确使用方式,是每个开发者的必备技能。推荐使用 jsjson.com RSA 加密工具 在线体验 RSA 加密解密过程。
本文最后更新于 2026 年 5 月