RSA 加密与解密
引言
在现代信息时代,加密和解密是保护敏感数据和隐私的重要手段之一。RSA 是一种非对称加密算法,它使用一个公钥和一个私钥来进行加密和解密操作。其中,公钥用于加密数据,私钥用于解密被加密数据。本文将介绍如何使用 Java 来实现 RSA 私钥加密和公钥解密的例子,并给出相应的代码示例。
RSA 算法原理
RSA 算法的原理基于数论中的大数分解问题。它的核心思想是选择两个大素数 p 和 q,计算出 n = p * q,并选择一个与 (p-1) * (q-1) 互质的数 e,作为公钥的指数。私钥的指数 d 满足 (d * e) % ((p-1) * (q-1)) = 1。公钥由数字对 (n, e) 组成,私钥由数字对 (n, d) 组成。
RSA 加密与解密操作
RSA 加密过程如下:
- 获取公钥 (n, e)。
- 将要加密的数据转换为数字形式,记为 m。
- 计算密文 c = (m^e) % n。
RSA 解密过程如下:
- 获取私钥 (n, d)。
- 根据公式 m = (c^d) % n,计算出原始数据 m。
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");
// 设置密钥长度
keyPairGenerator.initialize(2048);
// 生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥和私钥
String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
System.out.println("公钥:" + publicKey);
System.out.println("私钥:" + privateKey);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
加密和解密数据
使用 RSA 加密和解密数据的示例代码如下:
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSAEncryptDecrypt {
public static void main(String[] args) {
try {
// 原始数据
String originalData = "Hello, RSA!";
// 公钥和私钥
String publicKeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4+ayuDB4rs+MnYdQOQ1xVf6jy\n" +
"4sKJQDw4jVq0IyB8uoww7y0q0tS6zH2i3WUSAk7wHfLWLsU6Xt6oKQo8R3mD5y2E\n" +
"8MlYibN6ybywwaBL5OXUgWqZkK/sFmhG5Cr2fo0Vg4neu84fS4hRQ2g8hOJODX3U\n" +
"x7iG1f8Lk379y86HjQIDAQAB";
String privateKeyString = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALj5rK4MHiuz4ydh\n" +
"1A5DXFV/qPLiwolAPDiNWrQjIHy6jDDvLSrS1LrMfaLdZRICTvAd8tYux