AES(Advanced Encryption Standard) 암호화
- 암호화와 복호화 과정에서 동일한 키를 사용하는 대칭키 알고리즘이다.
- 대입 치환 SPN(substitution-Permutation Network)을 사용하는 블록암호 방식이다.
- 키 값의 길이에 따라 AES128, AES192, AES256으로 나뉜다.
- 128bit의 고정된 블록 단위로 암호화를 수행한다. (Block Cipher Mode - EBC, CBC 등)
주의
- JDK 8 이상의 환경에서는 Java 자체적으로 AES-256을 지원하지만, 일부 구버전에서는 제한이 있을 수 있습니다.
- Key 길이가 정확히 32바이트(256비트)여야 합니다.
자바(Java)에서 양방향 암호화 방식인 AES-256를 지원하는 기본 유틸리티 클래스 예제입니다.
아래는 IV(초기화 벡터)를 사용하지 않고 AES-256 ECB 모드로 동작하는 자바 유틸리티 코드입니다.
단, ECB 모드는 보안에 취약하니 실제 서비스에서는 CBC 등 IV를 사용하는 방식을 권장합니다.
JAVA
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AES256NoIVUtil {
private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
// 암호화
public static String encrypt(String key, String plainText) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
}
// 복호화
public static String decrypt(String key, String encrypted) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encrypted));
return new String(decrypted, StandardCharsets.UTF_8);
}
}
사용 예
public class Example {
public static void main(String[] args) throws Exception {
String key = "12345678901234567890123456789012"; // 32-byte key (256bit)
String text = "Hello,AES256!";
String enc = AES256Util.encrypt(key, text);
System.out.println("Encrypted: " + enc);
//출력 Encrypted: 3+L9mHNCNRUdUM6wdBoSFQ==
String dec = AES256Util.decrypt(key, enc);
System.out.println("Decrypted: " + dec);
}
}
URL로 AES 암호화 값 파라미터 전달 예시
https://yourdomain.com/api?ciphertext=3+L9mHNCNRUdUM6wdBoSFQ==
그런데 AES 암호화 값에 +, / 등 특수문자가 포함된 base64 문자열을 전달 시
서버에서 복호화할 때 아래와 같이 에러가 발생됨
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character 20
at java.base/java.util.Base64$Decoder.decode0(Base64.java:746)
at java.base/java.util.Base64$Decoder.decode(Base64.java:538)