Skip to content

Commit 84060fd

Browse files
Updated Example
1 parent e42c253 commit 84060fd

File tree

2 files changed

+65
-39
lines changed

2 files changed

+65
-39
lines changed
Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.howtodoinjava.core.security;
22

3-
import java.nio.charset.StandardCharsets;
43
import java.security.SecureRandom;
54
import java.security.spec.KeySpec;
65
import java.util.Base64;
7-
86
import javax.crypto.Cipher;
97
import javax.crypto.SecretKey;
108
import javax.crypto.SecretKeyFactory;
@@ -14,53 +12,65 @@
1412

1513
public class AES256 {
1614

17-
private AES256(){
18-
}
15+
private static final int KEY_LENGTH = 256;
16+
private static final int ITERATION_COUNT = 65536;
1917

20-
private static final String SECRET_KEY = "my_super_secret_key_ho_ho_ho";
21-
private static final byte[] SALT;
22-
private static final SecureRandom random;
23-
private static final IvParameterSpec ivspec;
24-
static {
25-
random = new SecureRandom();
26-
27-
SALT = new byte[16];
28-
random.nextBytes(SALT);
29-
30-
byte[] bytesIV = new byte[16];
31-
random.nextBytes(bytesIV);
32-
ivspec = new IvParameterSpec(bytesIV);
33-
}
18+
public static String encrypt(String strToEncrypt, String secretKey, String salt) {
3419

35-
public static String encrypt(String strToEncrypt) {
3620
try {
21+
22+
SecureRandom secureRandom = new SecureRandom();
23+
byte[] iv = new byte[16];
24+
secureRandom.nextBytes(iv);
25+
IvParameterSpec ivspec = new IvParameterSpec(iv);
26+
3727
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
38-
KeySpec spec = new PBEKeySpec(SECRET_KEY.toCharArray(), SALT, 65536, 256);
28+
KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), ITERATION_COUNT, KEY_LENGTH);
3929
SecretKey tmp = factory.generateSecret(spec);
40-
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
30+
SecretKeySpec secretKeySpec = new SecretKeySpec(tmp.getEncoded(), "AES");
4131

4232
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
43-
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
44-
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
33+
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);
34+
35+
byte[] cipherText = cipher.doFinal(strToEncrypt.getBytes("UTF-8"));
36+
byte[] encryptedData = new byte[iv.length + cipherText.length];
37+
System.arraycopy(iv, 0, encryptedData, 0, iv.length);
38+
System.arraycopy(cipherText, 0, encryptedData, iv.length, cipherText.length);
39+
40+
return Base64.getEncoder().encodeToString(encryptedData);
4541
} catch (Exception e) {
46-
System.out.println("Error while encrypting: " + e.toString());
42+
// Handle the exception properly
43+
e.printStackTrace();
44+
return null;
4745
}
48-
return null;
4946
}
5047

51-
public static String decrypt(String strToDecrypt) {
48+
public static String decrypt(String strToDecrypt, String secretKey, String salt) {
49+
5250
try {
51+
52+
byte[] encryptedData = Base64.getDecoder().decode(strToDecrypt);
53+
byte[] iv = new byte[16];
54+
System.arraycopy(encryptedData, 0, iv, 0, iv.length);
55+
IvParameterSpec ivspec = new IvParameterSpec(iv);
56+
5357
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
54-
KeySpec spec = new PBEKeySpec(SECRET_KEY.toCharArray(), SALT, 65536, 256);
58+
KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), ITERATION_COUNT, KEY_LENGTH);
5559
SecretKey tmp = factory.generateSecret(spec);
56-
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
60+
SecretKeySpec secretKeySpec = new SecretKeySpec(tmp.getEncoded(), "AES");
61+
62+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
63+
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivspec);
64+
65+
byte[] cipherText = new byte[encryptedData.length - 16];
66+
System.arraycopy(encryptedData, 16, cipherText, 0, cipherText.length);
5767

58-
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
59-
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
60-
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
68+
byte[] decryptedText = cipher.doFinal(cipherText);
69+
return new String(decryptedText, "UTF-8");
6170
} catch (Exception e) {
62-
System.out.println("Error while decrypting: " + e.toString());
71+
// Handle the exception properly
72+
e.printStackTrace();
73+
return null;
6374
}
64-
return null;
6575
}
6676
}
Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
11
package com.howtodoinjava.core.security;
22

33
public class AES256Example {
4+
45
public static void main(String[] args) {
5-
String originalString = "howtodoinjava.com";
6+
// Define your secret key and salt (keep these secure and don't hardcode in production)
7+
String secretKey = "MySecretKey";
8+
String salt = "MySalt";
9+
10+
// String to be encrypted
11+
String originalString = "Hello, this is a secret message.";
612

7-
String encryptedString = AES256.encrypt(originalString);
8-
String decryptedString = AES256.decrypt(encryptedString);
13+
// Encrypt the string
14+
String encryptedString = AES256.encrypt(originalString, secretKey, salt);
15+
if (encryptedString != null) {
16+
System.out.println("Encrypted: " + encryptedString);
17+
} else {
18+
System.err.println("Encryption failed.");
19+
return;
20+
}
921

10-
System.out.println(originalString);
11-
System.out.println(encryptedString);
12-
System.out.println(decryptedString);
22+
// Decrypt the string
23+
String decryptedString = AES256.decrypt(encryptedString, secretKey, salt);
24+
if (decryptedString != null) {
25+
System.out.println("Decrypted: " + decryptedString);
26+
} else {
27+
System.err.println("Decryption failed.");
28+
}
1329
}
1430
}

0 commit comments

Comments
 (0)