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 加密过程如下:

  1. 获取公钥 (n, e)。
  2. 将要加密的数据转换为数字形式,记为 m。
  3. 计算密文 c = (m^e) % n。

RSA 解密过程如下:

  1. 获取私钥 (n, d)。
  2. 根据公式 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