AES-256 암호화 Java Util

 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)