RSA 是一种非对称加密算法,用于安全数据传输。RSA 是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个与之等效的算法,但该算法被列入机密,直到1997年才得到公开。对极大整数做因数分解的难度决定了 RSA 算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式破解。到2020年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用 RSA 加密的信息实际上是不能被破解的。
RSA 是现代加密领域的核心技术之一,广泛应用于 SSL/TLS 协议、数字签名、电子邮件加密等场景。
RSA的特点
-
非对称性:不同于对称加密(如 AES)使用同一密钥,RSA 使用一对密钥。
-
基于数学难题:RSA 的安全性依赖于大整数因式分解的计算复杂性。
-
支持多功能:既可用于加密,也可用于数字签名。
-
广泛应用:被视为非对称加密的事实标准。
基于Java的快速实践
使用 Java 的 java.security 包生成密钥并进行加密和解密
package cn.com.openboot.dotj.study.security;
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public class RSAExample {
public static void main(String[] args) throws Exception {
// 1. 生成密钥对
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048); // 设置密钥长度(一般为2048位)
KeyPair keyPair = keyPairGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 2. 待加密明文
String message = "Hello, RSA!";
System.out.println("原文: " + message);
// 3. 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 使用公钥加密
byte[] encryptedData = cipher.doFinal(message.getBytes());
System.out.println("加密后的密文: " + bytesToHex(encryptedData));
// 4. 解密
cipher.init(Cipher.DECRYPT_MODE, privateKey); // 使用私钥解密
byte[] decryptedData = cipher.doFinal(encryptedData);
System.out.println("解密后的原文: " + new String(decryptedData));
}
// 工具方法:字节数组转十六进制字符串
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
注意事项
-
密钥长度:2048 位是现代安全标准,推荐使用,不建议使用较短密钥。
-
加密大小限制:RSA 通常用于加密小数据(如对称密钥或摘要),而不是直接加密大文件。
-
填充方式:使用安全填充方案(如 OAEP)以防御加密攻击。
RSA 的安全性基础
+---------------------------+
| RSA Algorithm |
+---------------------------+
| 密钥生成 | 加密 | 解密 | 签名验证 |
+---------------------------+
| |
+----------+ +----------+
| 公钥 (e) | | 私钥 (d) |
+----------+ +----------+
# 1.数学问题:大整数分解
RSA 基于模幂运算和因式分解的难度。
给定两个大素数 p, q,计算其乘积 N = p * q 容易,但从 N 中恢复 p 和 q 则非常困难。
# 2.密钥生成:
选择两个大素数 p 和 q。
计算 N = p * q 和 \phi(N) = (p-1)(q-1) 。
选择一个公钥指数 e(通常是小素数,如 65537),满足 1 < e < \phi(N)。
计算私钥指数 d,使 (d \cdot e \equiv 1 \pmod{\phi(N)})。
# 3.加密与解密:
加密:C = M^e \mod N
解密:M = C^d \mod N
总结
致谢
更多内容欢迎关注 [ 小巫编程室 ] 公众号,喜欢文章的话,也希望能给小编点个赞或者转发,你们的喜欢与支持是小编最大的鼓励,小巫编程室感谢您的关注与支持。好好学习,天天向上(good good study day day up)。
参考资料[1]
RFC2CN: rfc2cn.com/rfc2313.htm…
RFC: www.rfc-editor.org/rfc/rfc2313…
在线工具: cryptii.com/