add aes main source
This commit is contained in:
parent
cb48f0bd64
commit
01baf5c752
@ -0,0 +1,183 @@
|
|||||||
|
package com.baeldung.crypto;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.crypto.*;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
import javax.crypto.spec.PBEKeySpec;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.io.*;
|
||||||
|
import java.security.InvalidAlgorithmParameterException;
|
||||||
|
import java.security.InvalidKeyException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
import java.security.spec.KeySpec;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
public class AESUtil {
|
||||||
|
static Logger logger = LoggerFactory.getLogger(AESUtil.class);
|
||||||
|
|
||||||
|
public static String encrypt(String algorithm, String input, SecretKey key, IvParameterSpec iv) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(algorithm);
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
|
||||||
|
byte[] cipherText = cipher.doFinal(input.getBytes());
|
||||||
|
return Base64.getEncoder().encodeToString(cipherText);
|
||||||
|
} catch (NoSuchAlgorithmException | NoSuchPaddingException
|
||||||
|
| InvalidKeyException | InvalidAlgorithmParameterException
|
||||||
|
| IllegalBlockSizeException | BadPaddingException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decrypt(String algorithm, String cipherText, SecretKey key, IvParameterSpec iv) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(algorithm);
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key, iv);
|
||||||
|
byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
|
||||||
|
return new String(plainText);
|
||||||
|
} catch (NoSuchAlgorithmException | NoSuchPaddingException
|
||||||
|
| InvalidKeyException | InvalidAlgorithmParameterException
|
||||||
|
| IllegalBlockSizeException | BadPaddingException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SecretKey generateKey(int n) throws NoSuchAlgorithmException {
|
||||||
|
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
|
||||||
|
keyGenerator.init(n);
|
||||||
|
SecretKey key = keyGenerator.generateKey();
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SecretKey getKeyFromPassword(String password, String salt)
|
||||||
|
throws NoSuchAlgorithmException, InvalidKeySpecException {
|
||||||
|
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
|
||||||
|
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
|
||||||
|
SecretKey secret = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
|
||||||
|
return secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IvParameterSpec generateIv() {
|
||||||
|
byte[] iv = new byte[16];
|
||||||
|
new SecureRandom().nextBytes(iv);
|
||||||
|
return new IvParameterSpec(iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void encryptFile(String algorithm, SecretKey key, IvParameterSpec iv
|
||||||
|
, File inputFile, File outputFile) throws IOException {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(algorithm);
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
|
||||||
|
FileInputStream inputStream = new FileInputStream(inputFile);
|
||||||
|
FileOutputStream outputStream = new FileOutputStream(outputFile);
|
||||||
|
byte[] buffer = new byte[64];
|
||||||
|
int bytesRead;
|
||||||
|
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||||
|
byte[] output = cipher.update(buffer, 0, bytesRead);
|
||||||
|
if (output != null) {
|
||||||
|
outputStream.write(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
byte[] outputBytes = cipher.doFinal();
|
||||||
|
if (outputBytes != null) {
|
||||||
|
outputStream.write(outputBytes);
|
||||||
|
}
|
||||||
|
inputStream.close();
|
||||||
|
outputStream.close();
|
||||||
|
} catch (InvalidAlgorithmParameterException | NoSuchAlgorithmException
|
||||||
|
| NoSuchPaddingException | BadPaddingException
|
||||||
|
| IllegalBlockSizeException | InvalidKeyException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void decryptFile(String algorithm, SecretKey key, IvParameterSpec iv
|
||||||
|
, File encryptedFile, File decryptedFile) throws IOException {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(algorithm);
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key, iv);
|
||||||
|
FileInputStream inputStream = new FileInputStream(encryptedFile);
|
||||||
|
FileOutputStream outputStream = new FileOutputStream(decryptedFile);
|
||||||
|
byte[] buffer = new byte[64];
|
||||||
|
int bytesRead;
|
||||||
|
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||||
|
byte[] output = cipher.update(buffer, 0, bytesRead);
|
||||||
|
if (output != null) {
|
||||||
|
outputStream.write(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
byte[] output = cipher.doFinal();
|
||||||
|
if (output != null) {
|
||||||
|
outputStream.write(output);
|
||||||
|
}
|
||||||
|
inputStream.close();
|
||||||
|
outputStream.close();
|
||||||
|
} catch (InvalidAlgorithmParameterException | NoSuchAlgorithmException
|
||||||
|
| NoSuchPaddingException | BadPaddingException
|
||||||
|
| IllegalBlockSizeException | InvalidKeyException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SealedObject encryptObject(String algorithm, Serializable object, SecretKey key, IvParameterSpec iv) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(algorithm);
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
|
||||||
|
SealedObject sealedObject = new SealedObject(object, cipher);
|
||||||
|
return sealedObject;
|
||||||
|
} catch (NoSuchAlgorithmException | NoSuchPaddingException
|
||||||
|
| InvalidKeyException | InvalidAlgorithmParameterException
|
||||||
|
| IOException | IllegalBlockSizeException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Serializable decryptObject(String algorithm, SealedObject sealedObject
|
||||||
|
, SecretKey key, IvParameterSpec iv) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(algorithm);
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key, iv);
|
||||||
|
Serializable unsealObject = (Serializable) sealedObject.getObject(cipher);
|
||||||
|
return unsealObject;
|
||||||
|
} catch (NoSuchAlgorithmException | NoSuchPaddingException
|
||||||
|
| InvalidKeyException | InvalidAlgorithmParameterException
|
||||||
|
| IOException | ClassNotFoundException | IllegalBlockSizeException
|
||||||
|
| BadPaddingException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String encryptPasswordBased(String plainText, SecretKey key, IvParameterSpec iv) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
|
||||||
|
return Base64.getEncoder().encodeToString(cipher.doFinal(plainText.getBytes()));
|
||||||
|
} catch (NoSuchAlgorithmException | BadPaddingException
|
||||||
|
| InvalidKeyException | InvalidAlgorithmParameterException
|
||||||
|
| NoSuchPaddingException | IllegalBlockSizeException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decryptPasswordBased(String cipherText, SecretKey key, IvParameterSpec iv) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key, iv);
|
||||||
|
return new String(cipher.doFinal(Base64.getDecoder().decode(cipherText)));
|
||||||
|
} catch (NoSuchAlgorithmException | BadPaddingException
|
||||||
|
| InvalidKeyException | InvalidAlgorithmParameterException
|
||||||
|
| NoSuchPaddingException | IllegalBlockSizeException exp) {
|
||||||
|
logger.error(exp.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.baeldung.crypto;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Student implements Serializable {
|
||||||
|
private String name;
|
||||||
|
private int age;
|
||||||
|
|
||||||
|
public Student(String name, int age) {
|
||||||
|
this.name = name;
|
||||||
|
this.age = age;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAge() {
|
||||||
|
return age;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAge(int age) {
|
||||||
|
this.age = age;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
package com.baeldung.crypto;
|
||||||
|
|
||||||
|
import org.assertj.core.api.WithAssertions;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import javax.crypto.*;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
|
||||||
|
//@SpringBootTest
|
||||||
|
class AESUtilUnitTest implements WithAssertions {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void contextLoads() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenString_whenEncrypt_thenSuccess() throws NoSuchAlgorithmException {
|
||||||
|
// given
|
||||||
|
String input = "baeldung";
|
||||||
|
SecretKey key = AESUtil.generateKey(128);
|
||||||
|
IvParameterSpec ivParameterSpec = AESUtil.generateIv();
|
||||||
|
String algorithm = "AES/CBC/PKCS5Padding";
|
||||||
|
|
||||||
|
// when
|
||||||
|
String cipherText = AESUtil.encrypt(algorithm, input, key, ivParameterSpec);
|
||||||
|
String plainText = AESUtil.decrypt(algorithm, cipherText, key, ivParameterSpec);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assertions.assertEquals(input, plainText);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenFile_whenEncrypt_thenSuccess() throws NoSuchAlgorithmException, IOException {
|
||||||
|
// given
|
||||||
|
SecretKey key = AESUtil.generateKey(128);
|
||||||
|
String algorithm = "AES/CBC/PKCS5Padding";
|
||||||
|
IvParameterSpec ivParameterSpec = AESUtil.generateIv();
|
||||||
|
File inputFile = Paths.get("src/test/resources/baeldung.txt").toFile();
|
||||||
|
File encryptedFile = new File("classpath:baeldung.encrypted");
|
||||||
|
File decryptedFile = new File("document.decrypted");
|
||||||
|
|
||||||
|
// when
|
||||||
|
AESUtil.encryptFile(algorithm, key, ivParameterSpec, inputFile, encryptedFile);
|
||||||
|
AESUtil.decryptFile(algorithm, key, ivParameterSpec, encryptedFile, decryptedFile);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(inputFile).hasSameTextualContentAs(decryptedFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenObject_whenEncrypt_thenSuccess() throws NoSuchAlgorithmException {
|
||||||
|
// given
|
||||||
|
Student student = new Student("Baeldung", 20);
|
||||||
|
SecretKey key = AESUtil.generateKey(128);
|
||||||
|
IvParameterSpec ivParameterSpec = AESUtil.generateIv();
|
||||||
|
String algorithm = "AES/CBC/PKCS5Padding";
|
||||||
|
|
||||||
|
// when
|
||||||
|
SealedObject sealedObject = AESUtil.encryptObject(algorithm, student, key, ivParameterSpec);
|
||||||
|
Student object = (Student) AESUtil.decryptObject(algorithm, sealedObject, key, ivParameterSpec);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(student).isEqualToComparingFieldByField(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPassword_whenEncrypt_thenSuccess() throws InvalidKeySpecException, NoSuchAlgorithmException {
|
||||||
|
// given
|
||||||
|
String plainText = "www.baeldung.com";
|
||||||
|
String password = "baeldung";
|
||||||
|
String salt = "12345678";
|
||||||
|
IvParameterSpec ivParameterSpec = AESUtil.generateIv();
|
||||||
|
SecretKey key = AESUtil.getKeyFromPassword(password,salt);
|
||||||
|
|
||||||
|
// when
|
||||||
|
String cipherText = AESUtil.encryptPasswordBased(plainText, key, ivParameterSpec);
|
||||||
|
String decryptedCipherText = AESUtil.decryptPasswordBased(cipherText, key, ivParameterSpec);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assertions.assertEquals(plainText, decryptedCipherText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user