[학습기록] AES 암호화 모드 비교: ECB, CBC, GCM 차이와 GCM을 사용하는 이유
데이터를 안전하게 보호하기 위해 암호화는 선택이 아니라 필수 요소입니다. 다양한 암호화 알고리즘이 사용되고 있지만, 최근에는 대칭키 알고리즘인 AES가 사실상의 표준으로 자리 잡았습니다.
하지만 AES를 사용한다고 해서 모두 같은 수준의 보안을 제공하는 것은 아닙니다. 어떤 암호화 모드를 선택하느냐에 따라 보안 특성이 크게 달라집니다.
동일한 알고리즘을 사용하더라도 암호화 모드에 따라 데이터 패턴이 노출될 수도 있고, 무결성을 보장하지 못할 수도 있습니다.
그래서 AES의 대표적인 암호화 모드인 ECB, CBC, GCM을 비교하고, 왜 현재는 GCM의 사용이 권장되는지 정리해봤습니다.
1. 대칭키 알고리즘의 암호화 모드
AES는 데이터를 일정한 크기의 블록 단위로 암호화하는 블록 암호(Block Cipher) 알고리즘입니다. 하지만 AES는 블록 하나를 암호화하는 방법만 정의할 뿐, 여러 개의 블록을 어떻게 처리할지는 정의하지 않습니다. 이 역할을 하는 것이 암호화 모드(Mode of Operation)입니다.
암호화 모드는 단순한 구현 방식의 차이가 아닙니다. 보안 수준과 특성을 결정짓는 중요한 요소이며, 시간의 흐름에 따라 점진적으로 발전해 왔습니다.
1.1. ECB 모드
가장 단순한 방식은 ECB(Electronic Codebook) 모드입니다. 각 블록을 독립적으로 암호화하는 방식으로 동일한 평문 블록은 항상 동일한 암호문 블록으로 변환됩니다.
[ P1 ] → AES → [ C1 ]
[ P2 ] → AES → [ C2 ]
[ P3 ] → AES → [ C3 ]
[ P4 ] → AES → [ C4 ]
P1~4: PlainText Block
C1~4: Ciphered Block(Result)
구현이 단순하지만 데이터의 패턴이 그대로 노출되는 치명적인 문제가 있습니다.
동일한 평문 블록은 동일한 암호문 블록으로 변환되므로, 아래와 같이 반복되는 데이터 구조가 암호문에도 그대로 남게 됩니다.
AAAA → XXXX
AAAA → XXXX
BBBB → YYYY
BBBB → YYYY
1.2. CBC 모드
CBC(Cipher Block Chaining) 모드는 첫 번째 평문 블록에 IV를 결합하고, 이후에는 이전 블록의 암호화 결과를 다음 블록에 반영합니다. 따라서 동일한 평문 블록이 반복되더라도 서로 다른 암호문 블록이 생성됩니다.
IV(Initial Vector)
↓
[ P1 ] ⊕ IV → AES → [ C1 ]
[ P2 ] ⊕ C1 → AES → [ C2 ]
[ P3 ] ⊕ C2 → AES → [ C3 ]
[ P4 ] ⊕ C3 → AES → [ C4 ]
P1~4: PlainText Block
C1~4: Ciphered Block(Result)
ECB의 패턴 노출 문제를 해결했지만, 데이터의 위·변조 여부를 확인하는 무결성 검증 기능은 제공하지 않습니다. 따라서 무결성을 함께 보장하려면 MAC(Message Authentication Code)을 별도로 생성해 함께 검증해야 합니다.
1.3. GCM 모드
GCM 모드는 패턴 노출 문제를 해결하고, 무결성 검증까지 함께 제공하는 AEAD(Authenticated Encryption with Associated Data) 방식입니다.
다음 그림은 GCM의 동작 원리를 이해하기 쉽도록 단순화한 구조입니다.
Nonce (Initial Value for Counter)
↓
Counter Mode (암호화)
[ CTR1 ] → AES → [ K1 ] ⊕ [ P1 ] → [ C1 ]
[ CTR2 ] → AES → [ K2 ] ⊕ [ P2 ] → [ C2 ]
[ CTR3 ] → AES → [ K3 ] ⊕ [ P3 ] → [ C3 ]
[ CTR4 ] → AES → [ K4 ] ⊕ [ P4 ] → [ C4 ]
↓
Authentication (무결성 검증)
[ C1, C2, C3, C4 ] → GHASH → Authentication Tag
CTR1 = Counter Block 1
CTR2 = Counter Block 2
CTR3 = Counter Block 3
CTR4 = Counter Block 4
K1 = AES(Key, CTR1)
K2 = AES(Key, CTR2)
K3 = AES(Key, CTR3)
K4 = AES(Key, CTR4)
Nonce: Number used once
P1~4: PlainText Block
C1~4: Ciphered Block(Result)
GCM은 CTR(Counter) 방식을 이용해 암호화를 수행하고, 인증 태그(Authentication Tag)를 생성해 암호문이 위·변조되지 않았는지 검증합니다.
이러한 특성 덕분에 현재는 TLS를 비롯한 다양한 보안 프로토콜과 애플리케이션에서 기본적으로 GCM 모드가 권장되고 있습니다.
2. IV와 Nonce를 같은 개념으로 생각하면 안 되는 이유
CBC 모드의 IV(Initial Vector)와 GCM 모드의 Nonce가 비슷한 개념처럼 보일 수 있습니다.
실제로 두 값 모두 암호화 과정에서 초기값으로 사용된다는 공통점이 있습니다. 하지만 중요한 차이가 있습니다.
2.1. CBC 모드의 IV
CBC 모드의 IV는 첫 번째 블록을 암호화할 때 사용되는 초기값입니다.
C1 = AES(P1 ⊕ IV)
IV의 가장 중요한 요구사항은 예측 불가능성(Unpredictability)입니다.
IV는 일반적으로 암호화할 때마다 새롭게 생성해야 합니다. 동일한 IV를 반복해서 사용하거나, 예측 가능한 값을 사용하면 암호문의 관계가 노출되어 보안성이 약화될 수 있습니다.
IV를 상수로 고정하거나 재사용하는 구현은 대표적인 잘못된 사용 사례입니다.
2.2. GCM 모드의 Nonce
GCM 모드에서는 Nonce는 카운터의 시작값으로 사용됩니다.
Counter Block = Nonce + Counter
CTR1 = Counter Block(1)
CTR2 = Counter Block(2)
...
이 값은 AES의 입력으로 사용되어 키스트림을 생성하는 데 사용됩니다. Nonce의 가장 중요한 요구사항은 유일성(Uniqueness) 입니다.
즉, 같은 암호화 키를 사용하는 동안에는 Nonce를 절대 재사용해서는 안 됩니다. 같은 키에서 동일한 Nonce가 재사용되면 동일한 키스트림이 생성되기 때문입니다.
같은 키에서 동일한 Nonce를 재사용하면 동일한 키스트림이 생성될 수 있습니다. 이 경우 암호문 사이의 관계를 이용해 평문 정보를 유추할 수 있을 뿐 아니라 인증 태그의 안전성도 훼손되어 암호문 위조가 가능해질 수 있습니다.
2.3. 핵심 차이 요약
| 항목 | CBC (IV) | GCM (Nonce) |
|---|---|---|
| 역할 | 첫 블록 랜덤화 | 카운터 시작값 |
| 요구 조건 | 예측 불가능하게 생성 | 동일한 키에서 중복되지 않게 생성 |
| 재사용 | 권장되지 않음 | 절대 금지 |
| 영향 | 암호문 간 관계 노출 가능 | 평문 유추 및 위조 가능 |
IV와 Nonce를 동일하게 생각할 수 있지만, 실제로는 보안 요구사항이 완전히 다른 개념입니다.
CBC의 IV는 예측할 수 없도록 생성하는 것이 중요하며, GCM의 Nonce는 같은 키에서 절대 중복되지 않도록 관리하는 것이 가장 중요합니다.
3. GCM 모드의 장점
특별한 호환성이나 운영상의 제약이 없다면 신규 시스템의 대칭키 암호화에는 GCM 모드를 우선 고려할 수 있습니다. 주요 장점은 다음과 같습니다.
3.1. 암호화와 무결성을 동시에 제공 (AEAD)
CBC 모드에서는 무결성을 보장하기 위해서 별도로 MAC(Message Authentication Code)을 구성해야 했지만, GCM 모드를 사용하면 데이터의 기밀성과 무결성을 동시에 보장할 수 있습니다.
이로 인해 구현이 단순해지고, 잘못된 구성으로 인한 보안 취약점 발생 가능성도 줄어듭니다.
3.2. 높은 성능 (병렬 처리 가능)
GCM은 CTR(Counter) 모드를 기반으로 동작하기 때문에 블록 간 의존성이 없습니다.
따라서 여러 블록을 동시에 처리할 수 있어 병렬 처리가 가능합니다. 특히 CPU에서 AES 연산을 지원하는 하드웨어 가속(AES-NI)과 함께 사용할 경우 매우 높은 성능을 제공합니다.
이는 대량의 데이터를 처리해야 하는 환경에서 큰 장점이 됩니다.
3.3. 현대 보안 표준에서의 채택
GCM은 현재 주요 보안 표준에서 기본적으로 사용되고 있습니다.
대표적으로 TLS 1.3에서는 AEAD 기반 암호화만 지원하며, GCM은 가장 널리 사용되는 방식 중 하나입니다.
이는 GCM이 현대 보안 환경에서 신뢰받는 AEAD 방식 중 하나임을 보여줍니다.
3.4. 구현 실수 가능성 감소
CBC 모드를 안전하게 사용하기 위해서는 암호화와 MAC을 올바른 순서로 결합(Encrypt-then-MAC)해야 합니다. 하지만 이러한 구성은 구현 난이도가 높고, 실수로 인해 취약점이 발생할 가능성이 존재합니다.
반면 GCM은 암호화와 인증 기능이 하나의 AEAD 방식으로 설계되어 있으므로, 개발자가 암호화와 MAC을 직접 조합할 필요가 없습니다. 따라서 잘못된 조합이나 검증 순서로 인해 발생할 수 있는 구현 실수를 줄일 수 있습니다.
4. 마무리
AES 자체도 중요하지만, 실제 보안 수준은 어떤 암호화 모드를 선택하느냐에 크게 좌우됩니다.
| 항목 | ECB | CBC | GCM |
|---|---|---|---|
| 패턴 노출 | 있음 | 없음 | 없음 |
| 무결성 검증 | 없음 | 별도 MAC 필요 | 인증 태그 제공 |
| 병렬 암호화 | 가능 | 불가능 | 가능 |
| 초기값 요구사항 | 없음 | 예측 불가능한 IV | 중복되지 않는 Nonce |
| 실무 권장 | ❌ 사용 금지 | ⚠️ 별도 보호 필요 | ✅ 우선 고려 |
과거에는 CBC 모드가 널리 사용되었지만, 현재는 암호화와 인증을 함께 제공하는 AEAD 방식이 표준적인 선택으로 자리 잡았습니다. 그 결과 GCM은 다양한 보안 프로토콜과 애플리케이션에서 널리 사용되고 있습니다.
특별한 호환성 문제가 없다면 신규 시스템에서는 GCM을 기본 선택으로 고려하는 것이 바람직합니다.