package org.example.test;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class AesRasMixingExample {
public static void main(String[] args) throws Exception {
String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzFvkuwc5xFn4qOaMA3Ng3pK5aL2OzERgtQrg0n8TjJDP5koJS6KW/b0au8As0mPcRNZDn4zXDZ+RI8Q6NGMxvaa7NldiTE+B/OTj2xIBjpERLgs9tNHsoAGJ5JVSt/P+FGeLl4cMO/vLsLLclVNaJZJ+ZN6t9rPJZm52l9Mv25qVbe3M5SX7Hbpl4HKgGlV2ajsjVvSdCG1iozGnuE/Ct7t1rG1W6V9tuAgK2wbQaqKBYx7BAf1sCpayljHyRfYnjuMjz+QreJB97s7y5cmBbNVb7NiMDI5Y8UC2k4Itd7FLyMqzEZflu8jMvec6McHkP7W4X/rZTM1mPQ0tlxBAUwIDAQAB";
String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMW+S7BznEWfio5owDc2DekrlovY7MRGC1CuDSfxOMkM/mSglLopb9vRq7wCzSY9xE1kOfjNcNn5EjxDo0YzG9prs2V2JMT4H85OPbEgGOkREuCz200eygAYnklVK38/4UZ4uXhww7+8uwstyVU1olkn5k3q32s8lmbnaX0y/bmpVt7czlJfsdumXgcqAaVXZqOyNW9J0IbWKjMae4T8K3u3WsbVbpX224CArbBtBqooFjHsEB/WwKlrKWMfJF9ieO4yPP5Ct4kH3uzvLlyYFs1Vvs2IwMjljxQLaTgi13sUvIyrMRl+W7yMy95zoxweQ/tbhf+tlMzWY9DS2XEEBTAgMBAAECggEAUV0g82oMEOY1f6HTCyir39IRKeeW7DMpQcuj+YsI0IVzkN/XVZrVfQ8GjswTzGxf7bRVVjfwA4eNdO0Ss3ru+fBhR2CBTZq2SWckZTuFDSsq6Ocm2VBfYtFaAn2FYqItfhg/1sO5FkTJM3/zHS0DjkQGOMkEAF5SiIrggtBdlJP/1gRv8vtA+sLy8VEcUuipqaMRwP3tv+eUykDXu2ihUhXCvsDlplCi8TuGqI+B5iQ1EZ2Iz/FRi+4Qk4m2yW5lBAG5wNgI7rnDk3wTl5PaJBv2HlLP6vVm+uTMibwANo3hH/avewXnA6Q0osAdGop7Jh42xvWLRvHqtmis20HQYQKBgQD2oB90vHDAR6UlsoZB3U9hnYnh6rCrY9nmReLc+UlO+D7FyXsJ7WocpYBLXdouZDw7gP9nkanjewaNhpNzKqruO2ZtBlW7o4U26MfcputJfWvD0ThfF9tRtxON2ZiDnjge5LVpiHu+fUxC7K6qLQ0uGO2pnuOdH3BS8h0k6dCe8QKBgQDUIHstJKntiOZs58iUtY2B7NECl5+j//F6j5VQY9ZwgNo6NSWl2ciV5fQ63zv5D/bYwbDkauZFzcxmOt+M605g8vVr/fWXr+R9yVR+0zd7dxGqS3mTl3OtxuOIW/TtVZeXwSreAlxx3xnnsJ8KYCEi+EsJTDBW2ULiGMyfiEObgwKBgQDBEX8umurFjBDcHxL9cuxW5cZwRpMByUxm+aTtCnZ6TNqPafhZQDQGswVpetJ36N5CUu0evii6PbBWkNjTmr5ve67mgMQS/aMm5jq4ITAmuvnnNN2li/6UzPaQ4JyFxRH4FWFzeXYuHNbbuX/PFy+vO7KqTAmyEk+Tj5iDMkuwcQKBgQC2P5nUdTWRoRbn5lPMgBct0zrXkVFU46aieA3+3Wf1jJ7xd4v67BuLvd+RXQ33tCGOpQrHlJh2zJOaGWbLebcDUHpO6AhC5JnZAEqaE/oNF4WT2/h+N5bpbIE8PFU4O1tcxFeCGmE2bEmjZ3mcvm55zv0Y5d56H3t5KXlUbww25QKBgGxjim5KLmImyrH7/v7gaOlO844yo/oaVfjavz3R+tWms5XX/euvBiuWA+0SRDjEi9YqjJgIe89hua3zemcw6ElMSgvuhjmc1dQhr7Ji+WHT6xPwKEyuC4rswDlkdeE1EyTF+04wcVTktFrhinRXZgw8u6PZMTVYPCp99Ho3R20c";
String aesKey = "FOOiKQ6Lnr04slDFACIsAANHC+C8PQ9ZsQGhw717Mhs=";
String data = "我爱吃青菜,请给我炒100盘,thank you very much";
String finalEncryptData = encryptData(data, aesKey, publicKey);
System.out.println(finalEncryptData);
byte[] decode = Base64.getDecoder().decode(finalEncryptData);
int keySize = 256;
byte[] encryptedKey = new byte[keySize];
byte[] encryptedDataBytes = new byte[decode.length - keySize];
System.arraycopy(decode, 0, encryptedKey, 0, keySize);
System.arraycopy(decode, keySize, encryptedDataBytes, 0, encryptedDataBytes.length);
byte[] aseKeyByte = decryptAesKey(encryptedKey, privateKey);
String decryptData = decryptAesData(encryptedDataBytes, aseKeyByte);
System.out.println(decryptData);
}
public static String encryptData(String data, String aesKey,String publicKey) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(Base64.getDecoder().decode(aesKey),"AES");
byte[] encryptData = aesEncrypt(data, secretKey);
byte[] encryptKey = rsaEncrypt(secretKey,publicKey);
byte[] combined = new byte[encryptKey.length + encryptData.length];
System.arraycopy(encryptKey,0,combined,0,encryptKey.length);
System.arraycopy(encryptData,0,combined,encryptKey.length,encryptData.length);
return Base64.getEncoder().encodeToString(combined);
}
public static byte[] decryptAesKey(byte[] aseKey,String privateKeyStr)
throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidKeySpecException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException {
byte[] privateKeyStrDecode = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec spec1 = new PKCS8EncodedKeySpec(privateKeyStrDecode);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(spec1);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(aseKey);
return decryptedBytes;
}
public static String decryptAesData(byte[] encryptedData, byte[] aseKey) throws Exception {
SecretKeySpec aes = new SecretKeySpec(aseKey, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, aes);
byte[] decryptedData = cipher.doFinal(encryptedData);
return new String(decryptedData);
}
public static byte[] aesEncrypt(String data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedData = cipher.doFinal(data.getBytes());
return encryptedData;
}
public static byte[] rsaEncrypt(SecretKeySpec secretKey,String publicKeyStr) throws NoSuchAlgorithmException,
InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException {
byte[] publicKeyStrDecode = Base64.getDecoder().decode(publicKeyStr);
X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyStrDecode);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(spec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherTextBytes = cipher.doFinal(secretKey.getEncoded());
return cipherTextBytes;
}
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
return keyPairGenerator.generateKeyPair();
}
}