데이터를 암호화할 때 단순히 AES 알고리즘만 선택하는 것으로는 충분하지 않다.
AES는 항상 운용 모드(Mode of Operation)와 함께 사용되며, 어떤 모드를 선택하느냐에 따라 보안 특성이 크게 달라진다.
최근 많은 시스템에서 사용되는 방식이 AES-256-GCM이다.
이 글에서는 AES-GCM이 어떤 방식이며 왜 많이 사용되는지 정리해본다.
1. AES란 무엇인가
AES(Advanced Encryption Standard)는 대표적인 대칭키 암호화 알고리즘이다.
대칭키 암호화란
- 같은 키로 암호화
- 같은 키로 복호화
를 수행하는 방식이다.
AES는 키 길이에 따라 세 가지 버전이 존재한다.
| 알고리즘 | 키길이 |
| AES-128 | 128bit |
| AES-192 | 192bit |
| AES-256 | 256bit |
키 길이가 길수록 브루트포스 공격에 대한 저항성이 높다.
AES-256의 경우 키 공간이
2^256
이므로 현실적으로 전수 탐색 공격이 불가능한 수준의 보안을 제공한다.
2. AES는 단독으로 사용되지 않는다
AES는 블록 암호(block cipher)이다.
AES는 128bit 블록 단위로만 데이터를 처리한다.
따라서 실제 데이터를 암호화하려면 다음과 같은 운용 모드가 필요하다.
대표적인 모드는 다음과 같다.
| 모드 | 특징 |
| ECB | 가장 단순하지만 보안 취약 |
| CBC | 오랫동안 널리 사용 |
| GCM | 인증 기능을 포함한 최신 방식 |
3. ECB 모드
ECB(Electronic Codebook)는 가장 단순한 방식이다.
각 블록을 독립적으로 암호화한다.
Plaintext block → AES → Ciphertext block
문제는 같은 평문 블록이 나오면 항상 같은 암호문 블록이 생성된다는 점이다.
즉 데이터 패턴이 그대로 노출된다.
그래서 이미지 파일을 ECB로 암호화하면
암호화된 상태에서도 이미지 형태가 그대로 보이는 사례가 유명하다.
이러한 이유로 ECB는 실제 시스템에서 거의 사용되지 않는다.
4. CBC 모드
CBC(Cipher Block Chaining)는 이전 블록을 이용해 암호화하는 방식이다.
암호화 과정은 다음과 같다.
Plaintext XOR Previous Ciphertext → AES → Ciphertext
첫 번째 블록은 **IV(Initialization Vector)**를 사용한다.
CBC의 특징
- 패턴 노출 방지
- 오랫동안 표준처럼 사용됨
하지만 중요한 문제가 하나 있다.
CBC는 무결성 검증 기능이 없다.
즉 암호문이 중간에서 변조되더라도
복호화 과정에서 이를 감지할 수 없다.
그래서 CBC를 사용할 경우 보통 다음을 함께 사용한다.
- HMAC
- SHA 기반 MAC
즉
암호화 + 무결성 검증
을 별도로 구현해야 한다.
5. GCM 모드
GCM(Galois Counter Mode)은 비교적 최신 방식이며
다음 특징을 가진다.
- 높은 성능
- 병렬 처리 가능
- 무결성 검증 기능 포함
GCM은 AEAD 방식에 해당한다.
AEAD는
Authenticated Encryption with Associated Data
즉
암호화 + 인증
을 동시에 수행하는 방식이다.
6. GCM의 내부 구조
GCM은 두 가지 기술을 결합한 방식이다.
- CTR 모드
- GHASH
CTR 모드
CTR(Counter Mode)는 블록 암호를 스트림 암호처럼 사용하는 방식이다.
암호화 과정은 다음과 같다.
Counter → AES → Keystream
Plaintext XOR Keystream → Ciphertext
CTR 모드는 다음 특징이 있다.
- 병렬 처리 가능
- 매우 빠른 속도
GHASH
GCM에서는 무결성 검증을 위해 GHASH라는 연산을 수행한다.
GHASH는 다음 데이터를 기반으로 계산된다.
- 암호문
- 추가 인증 데이터(AAD)
- IV
이 계산 결과가 Authentication Tag이다.
7. Authentication Tag
GCM에서는 암호화 결과가 다음 구조로 생성된다.
[ Ciphertext ] + [ Authentication Tag ]
Tag는 일반적으로 128bit 길이이다.
복호화 과정에서 다음 검증이 수행된다.
- 암호문 복호화
- Tag 재계산
- Tag 비교
만약 데이터가 조금이라도 변경되었다면
Authentication Tag mismatch
가 발생하고 복호화는 실패한다.
Java에서는 보통 다음 예외가 발생한다.
AEADBadTagException
즉 GCM은
- 데이터 변조
- 잘못된 키
- 잘못된 IV
모두를 감지할 수 있다.
8. GCM에서 중요한 IV
GCM에서 가장 중요한 요소 중 하나는 IV(Nonce)이다.
일반적으로 다음 길이를 사용한다.
12 bytes (96bit)
이 길이가 사용되는 이유는 GCM 내부 구조에서
추가 계산 없이 바로 Counter 생성이 가능하기 때문이다.
만약 IV가 12바이트가 아니라면 추가적인 GHASH 계산이 필요하다.
9. IV 재사용 문제
GCM에서 절대 하면 안 되는 것이 있다.
같은 키 + 같은 IV 재사용
이 경우 다음 문제가 발생할 수 있다.
- 키 스트림 재사용
- 암호문 분석 가능
즉 암호화 보안이 크게 약해질 수 있다.
그래서 보통 IV는 다음 방식으로 생성한다.
SecureRandom
또는
Nonce counter
10. Java에서 AES-256-GCM 사용
Java에서는 다음과 같이 사용할 수 있다.
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
GCMParameterSpec spec = new GCMParameterSpec(128, iv);
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] encrypted = cipher.doFinal(data);
주요 파라미터
| 요소 | 설명 |
| Key | 32 bytes |
| IV | 12 bytes |
| Tag length | 128bit |
11. 스트림 방식 복호화
파일과 같은 큰 데이터를 처리할 때는 스트림 방식이 사용된다.
예시
CipherInputStream cipherIn =
new CipherInputStream(inputStream, cipher);
while ((len = cipherIn.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
여기서 doFinal() 호출이 보이지 않지만
실제로는 스트림이 종료되는 시점에 내부적으로 수행된다.
이때
- Authentication Tag 검증
- 복호화 마무리
과정이 이루어진다.
만약 데이터가 변조되었다면
읽는 과정에서 예외가 발생한다.
정리
AES-256-GCM은 다음 특징을 가진다.
- 강력한 대칭키 암호화
- 인증 기능 포함 (무결성 검증)
- 높은 성능
- 병렬 처리 가능
이러한 이유로 최근 많은 시스템에서
AES-256-GCM이 기본적인 암호화 방식으로 사용되고 있다.
'Back-End' 카테고리의 다른 글
| SSHJ란 무엇인가 (0) | 2026.03.19 |
|---|---|
| 금융기관 API에서 사용하는 Signed JWT + RFC8785 메시지 서명 구조 정리 (0) | 2026.02.25 |
| jstat로 JVM 메모리 모니터링: 실무용 해석 가이드 (3) | 2025.08.12 |
| 웹소켓 정리 2 (0) | 2025.05.07 |
| 웹소켓 정리 (1) | 2025.05.06 |