AES&RSA混合加密

67 阅读4分钟
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 {

        // 生成RSA密钥对
//        KeyPair keyPair = generateKeyPair();
//        PublicKey publicKey1 = keyPair.getPublic();
//        PrivateKey privateKey1 = keyPair.getPrivate();
//
//        System.out.println("Public Key: " + Base64.getEncoder().encodeToString(publicKey1.getEncoded()));
//        System.out.println("Private Key: " + Base64.getEncoder().encodeToString(privateKey1.getEncoded()));
//
//        String publicKey =  Base64.getEncoder().encodeToString(publicKey1.getEncoded());
//
//        String privateKey =  Base64.getEncoder().encodeToString(privateKey1.getEncoded());

          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";



//        // 生成AES密钥
//        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
//        keyGen.init(256); // 指定密钥长度
//        SecretKey secretKey = keyGen.generateKey();
//
//        String s = Base64.getEncoder().encodeToString(secretKey.getEncoded());
//        System.out.println(s);

        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);

         // 解密key
        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 {
        // 生成AES密钥
//        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
//        keyGen.init(256); // 指定密钥长度
//        SecretKey secretKey = keyGen.generateKey();
//
//        String s = Base64.getEncoder().encodeToString(secretKey.getEncoded());
//        System.out.println(s);


        SecretKeySpec secretKey = new SecretKeySpec(Base64.getDecoder().decode(aesKey),"AES");

        // 加密后数据
        byte[] encryptData = aesEncrypt(data, secretKey);


        // 加密后的key
        byte[] encryptKey = rsaEncrypt(secretKey,publicKey);

        // 将加密后的key和数据合并

        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);



//        // 使用AES加密数据
//        Cipher aesCipher = Cipher.getInstance("AES");
//        aesCipher.init(Cipher.ENCRYPT_MODE, secretKey);
//        byte[] encryptedData = aesCipher.doFinal(data.getBytes());

        // 使用RSA加密AES密钥
//        Cipher rsaCipher = Cipher.getInstance("RSA");
//        rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey);
//        byte[] encryptedKey = rsaCipher.doFinal(secretKey.getEncoded());

        // 将加密后的数据和密钥合并
//        byte[] combined = new byte[encryptedKey.length + encryptedData.length];
//        System.arraycopy(encryptedKey, 0, combined, 0, encryptedKey.length);
//        System.arraycopy(encryptedData, 0, combined, encryptedKey.length, encryptedData.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;
       //  return Base64.getEncoder().encodeToString(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;
       // String encryptedText = Base64.getEncoder().encodeToString(cipherTextBytes);
        //return encryptedText;
    }

    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        return keyPairGenerator.generateKeyPair();
    }
}