· 9 years ago · Nov 19, 2016, 12:08 AM
1import java.security.*
2import javax.crypto.*
3import javax.crypto.spec.*
4import javax.xml.bind.DatatypeConverter
5
6class PBE {
7 def secretKey;
8 def salt = getSalt();
9 def iterations = 65536 ;
10 def keySize = 256;
11 def ivBytes;
12 def saltBytes = getSalt()
13
14 def getSalt() {
15 def salt = new byte[20]
16 SecureRandom.getInstance("SHA1PRNG").nextBytes(salt)
17 return new String(salt);
18 }
19
20 def encrypt(char[] plaintext) {
21 byte[] saltBytes = salt.getBytes();
22
23 // def skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
24 def skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); // only in java 8, uncomment above for java 7
25 def spec = new PBEKeySpec(plaintext, saltBytes, iterations, keySize);
26 secretKey = skf.generateSecret(spec);
27 def secretSpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
28
29 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
30 cipher.init(Cipher.ENCRYPT_MODE, secretSpec);
31 def params = cipher.getParameters();
32 ivBytes = params.getParameterSpec(IvParameterSpec).getIV();
33 byte[] encryptedTextBytes = cipher.doFinal(String.valueOf(plaintext).getBytes("UTF-8"));
34
35 return DatatypeConverter.printBase64Binary(encryptedTextBytes);
36 }
37
38 def decrypt(char[] encryptedText) {
39
40 def encryptedTextBytes = DatatypeConverter.parseBase64Binary(new String(encryptedText));
41 SecretKeySpec secretSpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
42
43 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
44 cipher.init(Cipher.DECRYPT_MODE, secretSpec, new IvParameterSpec(ivBytes));
45
46 def decryptedTextBytes = null;
47
48 try {
49 decryptedTextBytes = cipher.doFinal(encryptedTextBytes);
50 } catch (IllegalBlockSizeException e) {
51 e.printStackTrace();
52 } catch (BadPaddingException e) {
53 e.printStackTrace();
54 }
55
56 return new String(decryptedTextBytes);
57
58 }
59}
60
61def pbe = new PBE()
62def message = "PasswordToEncrypt".toCharArray();
63def cipher = pbe.encrypt(message)
64def plaintext = pbe.decrypt(cipher.toCharArray())
65println("Message: " + String.valueOf(message));
66println("Encrypted: " + cipher);
67println("Decrypted: " + plaintext);