AES?
- AES(Advanced Encryption Standard): 고급 암호화 표준
- 암호화와 복호화에 동일한 키를 사용하는 대칭키 알고리즘방식
- 대칭키 방식을 사용하기 때문에 비대칭키 보다 빠른 속도
- AES-128, AES-192, AES-256의 종류가 있음 (뒤에 붙은 숫자는 키의 길이(단위: bit))
- Java에서는 AES 암/복호화를 위한 API를 제공하고 있다! (java.security, javax.crypto)
AES 암/복호화에 필요한 것들
SecretKey
말그대로 암/복호화에 사용되는 key다. 종류(AES 128, 192, 256)에 따라 길이가 달라진다.
private static final String SECRET_KEY = "fUjXn2r5u8x/A?D(G+KbPdSgVkYp3s6v"; // 32byte == 256bit
IV(Initialize Vector)
16byte(128bit)크기여야 한다.
private static final String IV = "ShVmYq3t6w9y$B&E";
👇여기서 키를 만들었다
Block Cipher
128bit(16byte)의 블록 단위로 암호화를 수행하는데, 이 방식을 결정할 수 있다.
Cipher Mode
: 블록 암호화 모드를 결정 - CBC방식 이용Padding Mode
: 블록 암호화 단위보다 작은 블록이 생길 경우 패딩 작업이 필요. 이 방식에 대한 모드를 결정 - PKCS5 이용
블록 암호화..까지 알아보기엔 머리가 너무 아ㅍ...
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
암호화
public static String encrypt(String str) throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
return Base64.getEncoder()
.encodeToString(
cipher.doFinal(str.getBytes(StandardCharsets.UTF_8))
);
}
복호화
public static String decrypt(String str) throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
return new String(
cipher.doFinal(Base64.getDecoder().decode(str)), "UTF-8"
);
}
테스트
'STUDY > Java' 카테고리의 다른 글
JPA | 복합 키 (Composite Key) 사용하기 (@IdClass) (1) | 2021.09.01 |
---|---|
Java | SHA-256 (0) | 2021.04.30 |
Java | Excel 파일 생성하기 (0) | 2021.04.12 |
Java | 정규식으로 특정 문자 사이 값 추출하기 (0) | 2021.04.09 |
Java | Builder패턴 (Lombok @Builder) (0) | 2021.03.29 |