Back-End

AES-256-GCM 암호화 방식 정리

isTrue 2026. 3. 17. 00:02
반응형

데이터를 암호화할 때 단순히 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은 두 가지 기술을 결합한 방식이다.

  1. CTR 모드
  2. 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 길이이다.

복호화 과정에서 다음 검증이 수행된다.

  1. 암호문 복호화
  2. Tag 재계산
  3. 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이 기본적인 암호화 방식으로 사용되고 있다.

반응형