全部都是Java自带的,没有引入任何第三方框架
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class EncryptionTests {
@SneakyThrows
@Test
void test() {
String data = "数据内容";
System.out.println("原始数据:\n" + data);
System.out.println("压缩前的数据长度:" + data.getBytes(StandardCharsets.UTF_8).length);
byte[] dataByte = compress(data.getBytes(StandardCharsets.UTF_8));
System.out.println("压缩后的数据长度:" + dataByte.length);
SecretKey aesKey = generateAESKey();
String aesKeyString = bytesToHex(aesKey.getEncoded());
System.out.println("AES 字符串密钥为:" + aesKeyString);
aesKey = stringToAESKey(aesKeyString);
KeyPair rsaKeyPair = generateRSAKeyPair();
PublicKey rsaPublicKey = rsaKeyPair.getPublic();
PrivateKey rsaPrivateKey = rsaKeyPair.getPrivate();
String rsaPublicKeyString = bytesToHex(rsaPublicKey.getEncoded());
String rsaPrivateKeyString = bytesToHex(rsaPrivateKey.getEncoded());
System.out.println("RSA 公钥字符串为:" + rsaPublicKeyString);
System.out.println("RSA 私钥字符串为:" + rsaPrivateKeyString);
rsaPublicKey = stringToRSAPublicKey(rsaPublicKeyString);
rsaPrivateKey = stringToRSAPrivateKey(rsaPrivateKeyString);
byte[] encryptedData = encryptAES(dataByte, aesKey);
System.out.println("AES 加密数据:" + new String(encryptedData));
byte[] encryptedAESKey = encryptRSA(aesKey.getEncoded(), rsaPublicKey);
System.out.println("RSA 公钥对 AES 密钥进行加密:" + new String(encryptedAESKey));
byte[] decryptedAESKey = decryptRSA(encryptedAESKey, rsaPrivateKey);
System.out.println("RSA 私钥对 AES 密钥进行解密:" + new String(decryptedAESKey));
byte[] decryptedDataByte = decryptAES(encryptedData, decryptedAESKey);
byte[] decompressData = decompress(decryptedDataByte);
String decryptedData = new String(decompressData, StandardCharsets.UTF_8);
System.out.println("解密数据: \n" + decryptedData);
}
private static SecretKey generateAESKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
return keyGenerator.generateKey();
}
private static KeyPair generateRSAKeyPair() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
return keyPairGenerator.generateKeyPair();
}
private static byte[] compress(byte[] data) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
try (GZIPOutputStream gzipStream = new GZIPOutputStream(byteStream)) {
gzipStream.write(data);
}
return byteStream.toByteArray();
}
private static byte[] decompress(byte[] compressedData) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
try (GZIPInputStream gzipStream = new GZIPInputStream(new ByteArrayInputStream(compressedData))) {
byte[] buffer = new byte[1024];
int len;
while ((len = gzipStream.read(buffer)) > 0) {
byteStream.write(buffer, 0, len);
}
}
return byteStream.toByteArray();
}
private static byte[] encryptAES(byte[] data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data);
}
private static byte[] encryptRSA(byte[] data, PublicKey key) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data);
}
private static byte[] decryptRSA(byte[] data, PrivateKey key) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(data);
}
private static byte[] decryptAES(byte[] data, byte[] key) throws Exception {
SecretKey secretKey = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(data);
}
private static String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02X", b));
}
return result.toString();
}
private static SecretKey stringToAESKey(String keyString) {
byte[] keyBytes = hexToBytes(keyString);
return new SecretKeySpec(keyBytes, "AES");
}
private static PublicKey stringToRSAPublicKey(String keyString) throws Exception {
byte[] keyBytes = hexToBytes(keyString);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
return keyFactory.generatePublic(keySpec);
}
private static PrivateKey stringToRSAPrivateKey(String keyString) throws Exception {
byte[] keyBytes = hexToBytes(keyString);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
return keyFactory.generatePrivate(keySpec);
}
private static byte[] hexToBytes(String hexString) {
int len = hexString.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));
}
return data;
}
}