RSA加密算法
RSA(Rivest-Shamir-Adleman)是一种常用的非对称加密算法,可以用于数据的加密和解密。它是由Ron Rivest、Adi Shamir和Leonard Adleman在1977年共同提出的,目前被广泛应用于网络通信和数据安全领域。本文将介绍RSA加密算法的原理以及如何在Java中使用RSA进行加密和解密。
RSA算法原理
RSA算法基于数论中的两个重要定理:欧拉定理和费马小定理。其核心原理为:选择两个不同的大素数p和q,计算n = p * q,选择一个整数e作为公钥,使得e与(p-1)(q-1)互质,计算d使得d = e^(-1) mod ((p-1)(q-1)),d即为私钥。公钥(n, e)可以公开,而私钥d必须保密。
加密过程:
- 将明文转换为对应的数字形式m;
- 计算密文c = m^e mod n。
解密过程:
- 计算明文m = c^d mod n;
- 将数字形式的明文转换为对应的明文。
Java实现RSA加密算法
生成密钥对
首先,我们需要生成RSA加密算法所需的公钥和私钥。Java提供了KeyPairGenerator
类来生成密钥对,示例代码如下:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
public class RSAKeyGenerator {
public static void main(String[] args) {
try {
// 创建RSA密钥对生成器
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,设置密钥长度为1024位
keyPairGenerator.initialize(1024);
// 生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥和私钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 输出公钥和私钥
System.out.println("公钥:" + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
System.out.println("私钥:" + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
运行上述代码,将会输出生成的公钥和私钥。
加密和解密
在生成密钥对之后,我们可以使用公钥对数据进行加密,使用私钥对数据进行解密。Java提供了Cipher
类来实现加密和解密操作,示例代码如下:
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSAEncryptDecrypt {
public static void main(String[] args) {
try {
// 假设这里有一个明文需要加密
String plainText = "Hello, RSA!";
byte[] plainBytes = plainText.getBytes();
// 假设这里有一个公钥字符串
String publicKeyStr = "公钥字符串";
byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
// 使用公钥进行加密
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainBytes);
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("加密后的密文:" + encryptedText);
// 假设这里有一个私钥字符串
String privateKeyStr = "私钥字符串";
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
// 使用私钥进行解密
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
String decryptedText = new String(decryptedBytes);
System.out.println("解密后的明文:" + decryptedText);
} catch