· 7 years ago · Mar 28, 2018, 06:26 AM
1package com.itc.classmate.utils;
2
3import android.util.Base64;
4
5import com.itc.classmate.application.MyApplication;
6
7import java.io.UnsupportedEncodingException;
8import java.security.InvalidAlgorithmParameterException;
9import java.security.InvalidKeyException;
10import java.security.KeyPair;
11import java.security.KeyPairGenerator;
12import java.security.NoSuchAlgorithmException;
13import java.security.PrivateKey;
14import java.security.PublicKey;
15import java.security.SecureRandom;
16import java.security.spec.InvalidKeySpecException;
17import java.security.spec.KeySpec;
18
19import javax.crypto.BadPaddingException;
20import javax.crypto.Cipher;
21import javax.crypto.IllegalBlockSizeException;
22import javax.crypto.KeyGenerator;
23import javax.crypto.NoSuchPaddingException;
24import javax.crypto.SecretKey;
25import javax.crypto.SecretKeyFactory;
26import javax.crypto.spec.IvParameterSpec;
27import javax.crypto.spec.PBEKeySpec;
28import javax.crypto.spec.SecretKeySpec;
29
30/**
31 * Created by 23508 on 3/27/2018.
32 */
33
34public enum EncryptMoreThn256Byte {
35 INSTANCE;
36 private SecretKey secKey;
37 // private String ACCESS_TOKEN = "bearer nG25Uokr3eF0WAisEcoS4hb1isLwR2qbOGu3UnwARGfeBNlP7RToSf3DCmowl99-TX0nrwL1qElIRZALFNbBXQPL6weVhJk9LRjJAoD9oBlTPtfDNMAZXlLqBqWnYZoxNyfQoPUE_Y0iMBcj_j6RqOfJc4Npid7Wo1AoipXOPYt1JLMfdHN9TZvtn6SxNP9UFipDANkcnHsurDwjPV_X0PdzyqsgXuoIjfAQLd7IonVYGZYmB_SYO68q5CorhH7hA01iIm7TDeUrOAM1p2C9W84rV6nMzMZS-7LPoweMWPxaLHcj15ex3TR16PGNGwbfiRPMLxNjmpqQEi3Mfqax2mk9qHL6LNb-OQK_5y9Zo9w1nC55iQhM-PbF96kgYa5zM2o94yI1IhcWAs-fJEe5tPsT3Dj_QfLWeNVblzDysfNwNajCGnauuPLzG-5qrGgNRtw0Dou8eNhk1lplDXxqu-G9kRyK1KKnPtuyCawzEJ_-4aEHdeA3-QSEqWCphu6w";
38 // private String initialText = "this is working";
39
40 private EncryptMoreThn256Byte() {
41 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "called constructor of EncryptMoreThn256Byte");
42 KeyGenerator generator = null;
43 try {
44 generator = KeyGenerator.getInstance("AES");
45 generator.init(128); // The AES key size in number of bits
46 secKey = generator.generateKey();
47 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "EncryptMoreThn256Byte: secKey+++ " + secKey.getEncoded());
48
49// SecureRandom random = new SecureRandom();
50// byte[] salt = new byte[(256/8)];
51// random.nextBytes(salt);
52// KeySpec keySpec = new PBEKeySpec(initialText.toCharArray(), salt, 1000, 256);
53// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
54// byte[] decrptedSecrateKey = keyFactory.generateSecret(keySpec).getEncoded();
55// // secKey = new SecretKeySpec(decrptedSecrateKey, "AES");
56// secKey = new SecretKeySpec(decrptedSecrateKey, 0, decrptedSecrateKey.length, "AES");
57 } catch (Exception e) {
58 AppLog.errLog(EncryptMoreThn256Byte.class.getSimpleName(), e.getMessage());
59 }
60 }
61
62
63 public String encryptAccessTokenUsingAES(String plainText) {
64 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptAccessTokenUsingAES: plainText " + plainText);
65
66 if (plainText != null || !plainText.isEmpty()) {
67 String encrytedSecretKey = SharedPreferences.getInstance(MyApplication.getInstance().getApplicationContext()).getEncrytedSecretKey();
68 if (encrytedSecretKey != null) {
69 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptAccessTokenUsingAES: encrytedSecretKey >+++ " + encrytedSecretKey);
70 byte[] decrptedSecrateKey = decryptSecretKeyUsingRSA(encrytedSecretKey);
71 if (decrptedSecrateKey != null) {
72 secKey = new SecretKeySpec(decrptedSecrateKey, 0, decrptedSecrateKey.length, "AES");
73 }
74 } else {
75 encryptSecretKeyUsingRSA(secKey);
76 }
77
78 String str = new String(encryptText(secKey, plainText));
79 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "final encryptAccessTokenUsingAES is: " + str);
80 return str;
81 }
82
83 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptAccessTokenUsingAES: value " + null);
84 return null;
85 }
86
87
88 public String decryptAccessTokenUsingAES(String encrptedAssessToken) {
89 String encrpted_secretkey = SharedPreferences.getInstance(MyApplication.getInstance().getApplicationContext()).getEncrytedSecretKey();
90 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "decryptAccessTokenUsingAES encrpted_secretkey:: " + encrpted_secretkey);
91 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "decryptAccessTokenUsingAES accesstoken:: " + encrptedAssessToken);
92 if (encrpted_secretkey != null) {
93 byte[] decrptedSecrateKey = decryptSecretKeyUsingRSA(encrpted_secretkey);
94 if (decrptedSecrateKey != null) {
95 SecretKey secKey = new SecretKeySpec(decrptedSecrateKey, 0, decrptedSecrateKey.length, "AES");
96 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "decryptAccessTokenUsingAES secKey.getEncoded():: " + secKey.getEncoded());
97 String str = decryptText(secKey, encrptedAssessToken);
98 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "final decryptAccessTokenUsingAES is: " + str);
99 return str;
100 }
101 }
102 return null;
103 }
104
105 private byte[] encryptSecretKeyUsingRSA(SecretKey secKey) {
106 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptSecretKeyUsingRSA SecretKey:: " + secKey);
107 KeyPairGenerator kpg = null;
108 byte[] encryptedSecrteKey = null;
109 try {
110 kpg = KeyPairGenerator.getInstance("RSA");
111 kpg.initialize(2048);
112 KeyPair keyPair = kpg.generateKeyPair();
113 PublicKey puKey = keyPair.getPublic();
114 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
115 cipher.init(Cipher.PUBLIC_KEY, puKey);
116 //AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptSecretKeyUsingRSA secKey.getEncoded():: " + secKey.getEncoded());
117 //AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptSecretKeyUsingRSA secKey.getEncoded().length:: " + secKey.getEncoded().length);
118 //byte[] encryptedSecrteKey = cipher.doFinal(secKey.getEncoded());
119 //byte[] encryptedSecrteKey=cipher.doFinal(initialText.getBytes("UTF-8"));
120 encryptedSecrteKey = cipher.doFinal(secKey.getEncoded());
121 // String str = Base64.encodeToString(encryptedSecrteKey, Base64.DEFAULT);
122 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptSecretKeyUsingRSA encryptedSecrteKey[]:: " + encryptedSecrteKey.length);
123 //AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptSecretKeyUsingRSA encrytionSecretKey:: " + str);
124 //AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptSecretKeyUsingRSA encrytionSecretKey length:: " + str.length());
125 SharedPreferences.getInstance(MyApplication.getInstance().getApplicationContext()).setEncrytedSecretKey(encryptedSecrteKey.toString());
126 } catch (Exception e) {
127 AppLog.errLog(EncryptMoreThn256Byte.class.getSimpleName(), "encryptSecretKeyUsingRSA::+" + e.getMessage());
128 } finally {
129 return encryptedSecrteKey;
130 }
131 }
132
133
134 private byte[] decryptSecretKeyUsingRSA(String encryptSecretKey) {
135 KeyPairGenerator kpg = null;
136 byte[] bytes = null;
137 try {
138 kpg = KeyPairGenerator.getInstance("RSA");
139 kpg.initialize(2048);
140 KeyPair keyPair = kpg.generateKeyPair();
141 PrivateKey prKey = keyPair.getPrivate();
142 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
143 cipher.init(Cipher.PRIVATE_KEY, prKey);
144 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "decryptSecretKeyUsingRSA encryptSecretKey.getBytes():: " + encryptSecretKey.getBytes());
145 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "decryptSecretKeyUsingRSA encryptSecretKey.getBytes().length:: " + encryptSecretKey.getBytes().length);
146 // bytes = cipher.doFinal(Base64.decode(encryptSecretKey, Base64.DEFAULT));
147 bytes = cipher.doFinal(encryptSecretKey.getBytes());
148 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "decryptSecretKeyUsingRSA cipher.doFinal(encryptSecretKey.getBytes():: " + bytes.toString());
149 } catch (Exception e) {
150 AppLog.errLog(EncryptMoreThn256Byte.class.getSimpleName(), "decryptSecretKeyUsingRSA++++ " + e.getMessage());
151 }
152 return bytes;
153 }
154
155
156 private byte[] encryptText(SecretKey pSecKey, String plainText) {
157 byte[] encryptAccessToken = null;
158 try {
159 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptText::secKey: " + pSecKey.getEncoded());
160 Cipher aesCipher = Cipher.getInstance("AES");
161 aesCipher.init(Cipher.ENCRYPT_MODE, pSecKey);
162 encryptAccessToken = aesCipher.doFinal(plainText.getBytes());
163 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptText:::: " + encryptAccessToken.toString());
164 } catch (Exception e) {
165 AppLog.errLog(EncryptMoreThn256Byte.class.getSimpleName(), "encryptTextUsingAES " + e.getMessage());
166 }
167 return encryptAccessToken;
168 }
169
170 /**
171 * Convert bytes to AES SecertKey so we can decrypt access token
172 *
173 * @return
174 */
175 private String decryptText(SecretKey originalKey, String decryptedAccessToken) {
176 byte[] bytePlainText = null;
177 try {
178 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "encryptText::originalKey: " + originalKey.getEncoded());
179 //SecretKey originalKey = new SecretKeySpec(decryptedKey, 0, decryptedKey.length, "AES");
180 Cipher aesCipher = null;
181 aesCipher = Cipher.getInstance("AES");
182 aesCipher.init(Cipher.DECRYPT_MODE, originalKey);
183 bytePlainText = aesCipher.doFinal(decryptedAccessToken.getBytes());
184 AppLog.log(EncryptMoreThn256Byte.class.getSimpleName(), "decryptText bytePlainText:: " + bytePlainText.toString());
185 } catch (Exception e) {
186 AppLog.errLog(EncryptMoreThn256Byte.class.getSimpleName(), "encryptTextUsingAES " + e.getMessage());
187 }
188 return new String(bytePlainText);
189 }
190
191
192 private byte[] encrytAT(String plaintext, String password) throws InvalidAlgorithmParameterException, InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException {
193 SecureRandom random = new SecureRandom();
194 byte[] salt = new byte[(256 / 8)];
195 random.nextBytes(salt);
196 KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, 1000, 256);
197 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
198 byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
199 SecretKey key = new SecretKeySpec(keyBytes, "AES");
200 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
201 byte[] iv = new byte[cipher.getBlockSize()];
202 random.nextBytes(iv);
203 IvParameterSpec ivParams = new IvParameterSpec(iv);
204 cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
205 return cipher.doFinal(plaintext.getBytes("UTF-8"));
206 }
207
208}