Java RSA 非对称加密算法实现
概述
在本文中,我将向你介绍如何在 Java 中使用 RSA 算法进行非对称加密。首先,我将为你展示整个过程的步骤,然后逐步解释每个步骤需要做什么,并提供相应的代码示例。
过程概览
下表列出了使用 RSA 算法进行非对称加密的基本步骤。
步骤 | 描述 |
---|---|
生成密钥对 | 首先,我们需要生成一对公私钥。公钥用于加密数据,私钥用于解密数据。 |
加密数据 | 使用公钥对数据进行加密。 |
解密数据 | 使用私钥对加密后的数据进行解密。 |
现在让我们逐步了解每个步骤的细节。
生成密钥对
首先,我们需要生成一对公私钥。在 Java 中,我们可以使用 KeyPairGenerator
类来生成密钥对。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
public class GenerateKeyPairExample {
public static void main(String[] args) {
try {
// 创建密钥对生成器
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,指定密钥长度
keyPairGenerator.initialize(2048);
// 生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥
PublicKey publicKey = keyPair.getPublic();
// 获取私钥
PrivateKey privateKey = keyPair.getPrivate();
// 打印公钥和私钥
System.out.println("Public Key: " + publicKey);
System.out.println("Private Key: " + privateKey);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
上述代码中,我们首先通过 KeyPairGenerator.getInstance("RSA")
创建了一个 KeyPairGenerator
实例。然后,我们使用 initialize
方法指定密钥长度,这里我们选择了 2048 位。接下来,我们调用 generateKeyPair
方法生成密钥对。最后,我们使用 getPublic
和 getPrivate
方法获取公钥和私钥,并打印出来。
加密数据
一旦我们生成了密钥对,我们可以使用公钥对数据进行加密。在 Java 中,我们可以使用 Cipher
类来实现加密操作。
import java.nio.charset.StandardCharsets;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class EncryptExample {
public static void main(String[] args) {
try {
// 要加密的数据
String data = "Hello, World!";
// 获取公钥字符串(通常来自密钥对生成过程)
String publicKeyString = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw1wOH4oYQp5oH5vJl4lH" +
"5qYVvwny+RD9iFgD7EwNJG7GQ8B3wC0P8rG9yDg1xuKuGqGKfEJwao5Vl7NVl0ju" +
"b/4ONGyfzBQg6QzQJ2X97OvqZKc4aY4f6JW1S3+YkEj0FY8adngNS+3wG6UnJbYD" +
"9Z4UqHUzlD6cdOG9+Yz28EagG3YQGpH07O3UgkFJ5XNzZB7aXBiWzd/7TftXrXBo" +
"vX9k6yO7nPw6qr7Rl1VXrMy2Lzqg1r2JW7L/VmGxVQXkWQwGdJ6cP6IuFz3GVNQH" +
"Uo6fR2M0YP+r1O6lqBiqWU1CZgC7e4d5noFmDehNh6yEr+pXPRgAIIYXJyhC4Y