一、生成RAS密钥
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class GenerateKeyPair {
public static void main(String[] args) {
try {
// 创建 KeyPairGenerator 对象,选择加密算法(这里使用 RSA 算法)
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 初始化 KeyPairGenerator,指定密钥长度(例如,2048位)
keyPairGenerator.initialize(2048);
// 生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥和私钥的字节数组
byte[] publicKeyBytes = keyPair.getPublic().getEncoded();
byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();
// 将公钥和私钥保存为.pem文件
saveToPemFile("D:\\publicKey.pem", publicKeyBytes, "PUBLIC KEY");
saveToPemFile("D:\\privateKey.pem", privateKeyBytes, "PRIVATE KEY");
System.out.println("公钥和私钥已成功保存。");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private static void saveToPemFile(String fileName, byte[] keyBytes, String keyType) {
// 将字节数组转换为Base64编码的字符串
String base64Key = Base64.getEncoder().encodeToString(keyBytes);
// 构建PEM格式的字符串
String pemKey = "-----BEGIN " + keyType + "-----\n";
pemKey += base64Key.replaceAll("(.{64})", "$1\n"); // 每64字符换行
pemKey += "\n-----END " + keyType + "-----\n";
// 将PEM字符串保存到文件中
try (FileOutputStream fos = new FileOutputStream(fileName)) {
fos.write(pemKey.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、RSA的加密解密
import javax.crypto.Cipher;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.io.*;
public class EncryptDecrypt {
public static void main(String[] args) {
try {
// 从文件中加载公钥和私钥
PublicKey publicKey = loadPublicKey("D:\\publicKey.pem");
PrivateKey privateKey = loadPrivateKey("D:\\privateKey.pem");
// 要加密的数据
String data = "Hello, world!";
// 使用公钥加密数据
byte[] encryptedData = encrypt(data, publicKey);
System.out.println("加密后的数据: " + Base64.getEncoder().encodeToString(encryptedData));
// 使用私钥解密数据
String decryptedData = decrypt(encryptedData, privateKey);
System.out.println("解密后的数据: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
private static PublicKey loadPublicKey(String fileName) throws Exception {
byte[] keyBytes = loadKeyFromFile(fileName);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
return keyFactory.generatePublic(keySpec);
}
private static PrivateKey loadPrivateKey(String fileName) throws Exception {
byte[] keyBytes = loadKeyFromFile(fileName);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
return keyFactory.generatePrivate(keySpec);
}
private static byte[] loadKeyFromFile(String fileName) throws IOException {
// 读取文件内容
String keyPem = new String(Files.readAllBytes(Paths.get(fileName)));
// 去除 PEM 文件的头部和尾部
keyPem = keyPem.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s", ""); // 去除所有的空白字符
// 进行 Base64 解码
return Base64.getDecoder().decode(keyPem);
}
private static byte[] encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data.getBytes());
}
private static String decrypt(byte[] encryptedData, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
return new String(decryptedData);
}
}