본문 바로가기

STUDY/Java

Java | AES-256 암/복호화

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";

 

👇여기서 키를 만들었다

 

Encryption Key Generator

Encryption Key Generator  The all-in-one ultimate online toolbox that generates all kind of keys ! Every coder needs All Keys Generator in its favorites ! It is provided for free and only supported by ads and donations.

www.allkeysgenerator.com

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"
  );
}

테스트