Java RSA 导出公钥和私钥

引言

RSA是一种非对称加密算法,被广泛应用于数据加密和数字签名中。在使用RSA算法进行加密和解密过程中,我们需要获取公钥和私钥。本文将介绍如何在Java中生成RSA公钥和私钥,并导出为可存储的格式。

生成RSA公钥和私钥

使用Java中的KeyPairGenerator类可以方便地生成RSA公钥和私钥。下面是一个示例代码:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;

public class RSAKeyPairGenerator {
    public static void main(String[] args) {
        try {
            // 创建KeyPairGenerator对象
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            
            // 设置密钥长度
            keyPairGenerator.initialize(2048);
            
            // 生成密钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            
            // 获取公钥和私钥
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
            
            // 导出公钥和私钥
            byte[] publicKeyBytes = publicKey.getEncoded();
            byte[] privateKeyBytes = privateKey.getEncoded();
            
            // 输出公钥和私钥
            System.out.println("公钥:");
            System.out.println(Base64.getEncoder().encodeToString(publicKeyBytes));
            
            System.out.println("私钥:");
            System.out.println(Base64.getEncoder().encodeToString(privateKeyBytes));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们首先创建了一个KeyPairGenerator对象,并指定为RSA算法。然后,使用initialize方法设置了密钥长度为2048位。接着,调用generateKeyPair方法生成了RSA密钥对。最后,通过getPublicgetPrivate方法获取了公钥和私钥。使用getEncoded方法将公钥和私钥导出为字节数组,并使用Base64编码方式将其转换为可打印字符串。

导出公钥和私钥

在上一步中,我们已经将公钥和私钥以字节数组的形式导出了出来,接下来我们将介绍如何将其导出为可存储的格式,例如PEM格式。

PEM格式

PEM(Privacy-Enhanced Mail)是一种用于存储加密和签名数据的文件格式。在PEM格式中,公钥和私钥通常以"BEGIN"和"END"标记包围,例如:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPx/n8t8EXrX9xYtnZxWQEJd0z
3hX1iKxtn6rWXGfRoQ2n1tS1Zr0K76fTo8fGq0eL3jZb0qOd8p3qe+UzUy08f5lu
fPS0ysoiF7g+roLK5mJyO4g0sbK2Uf3y/xKXZ7+gBzmjAqqrBqB2WfjNi4m3XN2p
21N8eaPQ0m/vdc7EoQIDAQAB
-----END PUBLIC KEY-----

Java中没有直接提供PEM格式的导出方法,但我们可以使用Bouncy Castle库来实现。下面是一个示例代码:

import java.io.FileWriter;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import org.bouncycastle.openssl.PEMWriter;

public class RSAKeyPairGenerator {
    public static void main(String[] args) {
        try {
            // 创建KeyPairGenerator对象
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            
            // 设置密钥长度
            keyPairGenerator.initialize(2048);
            
            // 生成密钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            
            // 获取公钥和私钥
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
            
            // 导出公钥和私钥
            byte[] publicKeyBytes = publicKey.getEncoded();
            byte[]