반응형
일을 하다 보니 AES 256 알고리즘으로 암복호화할 일이 생겨서 간단하게 유틸 클래스를 만들어보았다.
256 암호화라서 32자의 암호화 키를 사용해야하며, iv 파라미터를 이용한다. iv 파라미터 값은 암호화 키 16자를 활용한다.
import lombok.extern.slf4j.Slf4j;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
@Slf4j
public class AES256Utils {
// Util class do not have public constructor
private AES256Utils() {
}
public static String encrypt(final String key, final String data) {
try {
byte[] keyData = key.getBytes(StandardCharsets.UTF_8);
byte[] ivData = key.substring(0, 16).getBytes(StandardCharsets.UTF_8);
SecretKey secretKey = new SecretKeySpec(keyData, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivData));
byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return new String(Base64.getEncoder().encode(encrypted));
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException
| InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) {
log.error("AES Util Encrypt Error", e);
}
}
public static String decrypt(final String key, final String encryptedData) {
byte[] keyData;
try {
keyData = key.getBytes(StandardCharsets.UTF_8);
byte[] ivData = key.substring(0, 16).getBytes(StandardCharsets.UTF_8);
SecretKey secretKey = new SecretKeySpec(keyData, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(ivData));
byte[] decrypted = Base64.getDecoder().decode(encryptedData.getBytes(StandardCharsets.UTF_8));
return new String(cipher.doFinal(decrypted), StandardCharsets.UTF_8);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException
| InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) {
log.error("AES Util Decrypt Error", e);
}
}
}
반응형
'Programming > Java' 카테고리의 다른 글
[Java] CMD 또는 Shell 환경에서 Java 컴파일 및 Jar 파일 만들기 (0) | 2021.01.12 |
---|---|
[Java8] 윤년, 다음달 말일 계산 (0) | 2020.07.17 |
[Java] 사용하는 라이브러리의 라이선스 내용 출력하기 (0) | 2020.07.04 |
[Intellij IDEA Plugin, Java] SonarLint 코드 퀄리티를 높여보자! (3) | 2020.02.03 |
[Java8] Stream API 공부 정리 (1) (2) | 2020.01.16 |