· 4 years ago · Feb 03, 2021, 08:42 PM
1import java.security.Key;
2import java.util.Base64;
3
4import javax.crypto.Cipher;
5import javax.crypto.spec.IvParameterSpec;
6import javax.crypto.spec.SecretKeySpec;
7public class StringEnc {
8 private static final String Algorithm = "AES";
9
10 private static final byte[] keyValue = new byte[] {'S', 'A', 'l', 'L', 'o', 's', 'I', 's', 't', 'O', 'o', 'P', 'f', 'o', 'R', 'u' };
11
12 public static String AESEncrypt(String Data, int messageNumber) throws Exception {
13
14 Key key = generateKey();
15 IvParameterSpec ivSpec = createCtrlvForAES(messageNumber);
16 Cipher c = Cipher.getInstance("AES/CTR/PKCS5PADDING");
17 c.init(Cipher.ENCRYPT_MODE, key, ivSpec);
18 byte[] encVal = c.doFinal(Data.getBytes());
19 byte[] encryptedValue = Base64.getEncoder().encode(encVal);
20 return new String(encryptedValue);
21 }
22
23 /**
24 * Generate one SecretKey for Encode and Decode Method.
25 *
26 * @return key (Secret Key)
27 * @throws Exception
28 */
29
30 private static Key generateKey() throws Exception {
31 Key key = new SecretKeySpec(keyValue, Algorithm);
32 return key;
33 }
34
35
36 public static String AESDecrypt(String encryptedData, int messageNumber) throws Exception {
37 Key key = generateKey();
38 IvParameterSpec ivSpec = createCtrlvForAES(messageNumber);
39 Cipher c = Cipher.getInstance("AES/CTR/PKCS5PADDING");
40 c.init(Cipher.DECRYPT_MODE, key, ivSpec);
41 byte[] decodedValue = Base64.getDecoder().decode(encryptedData);
42 byte[] decValue = c.doFinal(decodedValue);
43 String decryptedValue = new String(decValue);
44 return decryptedValue;
45 }
46 /**
47 * @param messageNumber
48 * @param ivBytes
49 */
50
51 public static IvParameterSpec createCtrlvForAES(int messageNumber) {
52 byte[] ivBytes = new byte[16];
53 ivBytes[0] = (byte) (messageNumber >> 32);
54 ivBytes[1] = (byte) (messageNumber >> 24);
55 ivBytes[2] = (byte) (messageNumber >> 16);
56 ivBytes[3] = (byte) (messageNumber >> 8);
57 ivBytes[4] = (byte) (messageNumber >> 0);
58 for (int i = 0; i != 8; i++) {
59 ivBytes[8 + i] = 0;
60 }
61 ivBytes[15] = 1;
62 return new IvParameterSpec(ivBytes);
63 }
64
65}
66
67
68