· 9 years ago · Nov 22, 2016, 12:56 PM
1private static String salt;
2private static int iterations = 65536 ;
3private static int keySize = 256;
4private static byte[] ivBytes;
5private static String encodedKey = "jnf3guertsiAqwecdh7azitonderhascrui5godferh";
6private static SecretKey secretKey;
7public static int checkFlag = 0;
8
9public static String generateKey() throws Exception { //code for generating key
10
11 char[] chars = "abcdefghijklmnopqrstuvwxyzQWERTYUIOPLKJHGFDSAZXCVBNM1234567890".toCharArray();
12 StringBuilder sb = new StringBuilder();
13 Random random = new Random();
14 for (int i = 0; i < 20; i++) {
15 char c = chars[random.nextInt(chars.length)];
16 sb.append(c);
17 }
18 String output = sb.toString();
19 char[] plaintext = output.toCharArray();
20
21 salt = getSalt();
22 byte[] saltBytes = salt.getBytes();
23
24 SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
25 PBEKeySpec spec = new PBEKeySpec(plaintext, saltBytes, iterations, keySize);
26 secretKey = skf.generateSecret(spec);
27
28 String newkey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
29 return newkey;
30
31}
32
33public static String encrypt(char[] plaintext, String theKey) throws Exception { //code for encrypting
34
35 byte[] decodedKey = Base64.getDecoder().decode(theKey);
36
37 secretKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
38
39 SecretKeySpec secretSpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
40
41 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
42 cipher.init(Cipher.ENCRYPT_MODE, secretSpec);
43 AlgorithmParameters params = cipher.getParameters();
44 if(checkFlag == 0){
45 ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV();
46 checkFlag = 1;
47 }
48 byte[] encryptedTextBytes = cipher.doFinal(String.valueOf(plaintext).getBytes("UTF-8"));
49
50 return DatatypeConverter.printBase64Binary(encryptedTextBytes);
51}
52
53public static String decrypt(char[] encryptedText, String theKey) throws Exception { //code for decrypting
54 salt = getSalt();
55
56
57 byte[] encryptedTextBytes = DatatypeConverter.parseBase64Binary(new String(encryptedText));
58 byte[] decodedKey = Base64.getDecoder().decode(theKey);
59 secretKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
60 SecretKeySpec secretSpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
61
62 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
63 cipher.init(Cipher.DECRYPT_MODE, secretSpec, new IvParameterSpec(ivBytes));
64
65 byte[] decryptedTextBytes = null;
66
67 try {
68 decryptedTextBytes = cipher.doFinal(encryptedTextBytes);
69 } catch (IllegalBlockSizeException e) {
70 e.printStackTrace();
71 } catch (BadPaddingException e) {
72 e.printStackTrace();
73 }
74
75 return new String(decryptedTextBytes);
76
77}
78
79public static String getSalt() throws Exception {
80
81 SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
82 byte[] salt = new byte[20];
83 sr.nextBytes(salt);
84 return new String(salt);
85}