· 7 years ago · Jun 05, 2018, 04:18 PM
1import java.io.UnsupportedEncodingException;
2import java.security.KeyPair;
3import java.security.KeyPairGenerator;
4import java.security.MessageDigest;
5import java.security.NoSuchAlgorithmException;
6import java.security.PrivateKey;
7import java.security.PublicKey;
8import java.util.Arrays;
9import java.util.Base64;
10
11import javax.crypto.Cipher;
12import javax.crypto.KeyGenerator;
13import javax.crypto.SecretKey;
14import javax.crypto.spec.SecretKeySpec;
15
16public class AES_RSA {
17
18 private static byte[] key;
19 private static SecretKeySpec secretKey;
20
21 public static void main(String[] args){
22 try {
23
24 //1. Generate Symmetric Key (AES with 128 bits)
25 String password = "123456";
26 KeyGenerator generator = KeyGenerator.getInstance("AES");
27 generator.init(128); // The AES key size in number of bits
28
29 setKey(password);
30
31 //2. Encrypt plain text using AES
32 String plainText = "Please encrypt me urgently...";
33 Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
34 aesCipher.init(Cipher.ENCRYPT_MODE, secretKey);
35 byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());
36
37 //3. Encrypt the key using RSA public key
38 KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
39 kpg.initialize(2048);
40 KeyPair keyPair = kpg.generateKeyPair();
41
42 PublicKey puKey = keyPair.getPublic();
43 PrivateKey prKey = keyPair.getPrivate();
44
45 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
46 cipher.init(Cipher.PUBLIC_KEY, puKey);
47 byte[] encryptedKey = cipher.doFinal(secretKey.getEncoded()/*Seceret Key From Step 1*/);
48
49 //4. Send encrypted data (byteCipherText) + encrypted AES Key (encryptedKey)
50 //5. On the client side, decrypt symmetric key using RSA private key
51 cipher.init(Cipher.PRIVATE_KEY, prKey);
52 byte[] decryptedKey = cipher.doFinal(encryptedKey);
53
54 //6. Decrypt the cipher using decrypted symmetric key
55 SecretKey originalKey = new SecretKeySpec(decryptedKey , 0, decryptedKey.length, "AES");
56 Cipher aesCipher1 = Cipher.getInstance("AES/ECB/PKCS5PADDING");
57 aesCipher1.init(Cipher.DECRYPT_MODE, originalKey);
58 byte[] bytePlainText = aesCipher1.doFinal(byteCipherText);
59 String plainText1 = new String(bytePlainText);
60
61 //7. Done! 'Please encrypt me urgently...'
62 System.out.println(plainText1);
63
64 }catch (Exception e) {}
65 }
66
67
68 public static void setKey(String myKey)
69 {
70 MessageDigest sha = null;
71 try {
72 key = myKey.getBytes("UTF-8");
73 sha = MessageDigest.getInstance("SHA-256");
74 key = sha.digest(key);
75 key = Arrays.copyOf(key, 16);
76 secretKey = new SecretKeySpec(key, "AES");
77 }
78 catch (NoSuchAlgorithmException e) {
79 e.printStackTrace();
80 }
81 catch (UnsupportedEncodingException e) {
82 e.printStackTrace();
83 }
84 }
85}