Java RSA加密实现

概述

在本文中,我将向你介绍如何使用Java实现RSA加密算法。RSA是一种非对称加密算法,它使用两个密钥,一个用于加密(公钥),另一个用于解密(私钥)。首先,我们将讨论整个过程的流程,然后逐步指导你完成每个步骤。

流程图

下面是使用RSA加密的整个流程图:

步骤 描述
1 生成RSA公钥和私钥
2 使用公钥加密明文
3 使用私钥解密密文

生成RSA公钥和私钥

首先,我们需要生成RSA公钥和私钥。在Java中,可以使用KeyPairGenerator类来生成密钥对。下面是生成密钥对的代码:

// 导入所需的类
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

public class RSAExample {

    public static KeyPair generateKeyPair() {
        try {
            // 创建KeyPairGenerator对象,并指定使用RSA算法
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            
            // 初始化密钥对生成器,指定密钥长度
            keyPairGenerator.initialize(2048);
            
            // 生成密钥对
            return keyPairGenerator.generateKeyPair();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        // 生成密钥对
        KeyPair keyPair = 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()));
    }
}

在上述代码中,我们使用KeyPairGenerator类生成密钥对。我们使用RSA算法,并指定了密钥长度为2048位。生成的密钥对可以通过getPublic()getPrivate()方法获取。最后,我们将公钥和私钥打印出来,以便后续使用。

使用公钥加密明文

接下来,我们将使用公钥加密明文。在Java中,可以使用Cipher类来实现加密功能。下面是使用公钥加密明文的代码:

// 导入所需的类
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;

public class RSAExample {

    public static byte[] encrypt(byte[] plaintext, PublicKey publicKey) {
        try {
            // 创建Cipher对象,并指定使用RSA算法
            Cipher cipher = Cipher.getInstance("RSA");
            
            // 初始化Cipher对象,指定为加密模式,并传入公钥
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            
            // 加密数据
            return cipher.doFinal(plaintext);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        // 获取公钥
        PublicKey publicKey = getPublicKey();
        
        // 明文
        String plaintext = "Hello, RSA!";
        
        try {
            // 将明文转换为字节数组
            byte[] plaintextBytes = plaintext.getBytes("UTF-8");
            
            // 使用公钥加密明文
            byte[] encryptedBytes = encrypt(plaintextBytes, publicKey);
            
            // 打印密文
            System.out.println("密文:" + Base64.getEncoder().encodeToString(encryptedBytes));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    
    private static PublicKey getPublicKey() {
        try {
            // 获取公钥字节数组
            byte[] publicKeyBytes = Base64.getDecoder().decode("PUBLIC_KEY_STRING");
            
            // 创建X509EncodedKeySpec对象,并传入公钥字节数组
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
            
            // 创建KeyFactory对象,并指定使用RSA算法
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            
            // 生成公钥
            return keyFactory.generatePublic(keySpec);
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {