090. CTR (Counter) 모드
⚠️ 이 문서는 CBC 모드의 치명적 단점인 '직렬 병목 현상'을 완전히 걷어차 버리고, 블록을 쇠사슬로 엮는 대신 독립적인 일련번호(Counter)를 블록 암호 믹서기에 넣어 무한대의 난수를 뿜어내는 '스트림 암호'처럼 둔갑시켜 극한의 초고속 병렬 처리를 달성한 위대한 운영 모드인 CTR을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: CTR(Counter) 모드는 평문을 믹서기(AES)에 집어넣는 것이 아니라, 1, 2, 3... 올라가는 번호표(Nonce+Counter)를 믹서기에 넣고 갈아 만든 거대한 난수표(Keystream)를 원본 평문과 단순 엑스오어(XOR)하는 방식이다.
- 가치: 블록들이 앞뒤로 꼬리를 물고 기다릴(Chaining) 필요가 완벽히 사라졌다. 100개의 코어를 가진 CPU라면 1번부터 100번 블록까지 한 방에(동시 병렬) 암호화와 복호화를 박살 낼 수 있어 성능의 한계를 돌파했다.
- 융합: 블록 암호를 실시간 데이터 처리에 강한 스트림 암호(Stream Cipher)로 변신시켰을 뿐만 아니라, 크기가 안 맞는 데이터를 강제로 늘리는 '패딩(Padding)' 과정 자체를 삭제시켜 패딩 오라클 공격(CBC의 급소)의 위협까지 원천 소멸시켰다.
Ⅰ. 개요 및 탄생 배경 (Context & Necessity)
과거의 황제였던 CBC 모드는 앞 블록의 암호화가 끝나야만 뒤 블록이 시작될 수 있는 '가내수공업' 구조였다. 스마트폰 보급과 4G, 5G 시대가 도래하며 1초에 기가바이트(GB) 단위의 유튜브 영상이 암호화되어 쏟아지는데, 코어 하나만 끙끙대며 일하는 CBC 모드로는 네트워크 칩이 폭발할 지경이었다.
학자들의 발상 전환: "왜 굳이 평문을 섞으려고 안달인가? 그냥 AES 믹서기를 난수 생성기(Random Generator)로 써먹자!" 평문은 가만히 냅두고, 믹서기에는 [1번, 2번, 3번...]이라는 카운터를 넣고 돌려버린다. 믹서기에서 무시무시한 쓰레기 난수가 쏟아져 나오면, 그걸 지나가는 평문 위에 페인트처럼 덮어버리면(XOR) 끝난다. 앞차가 뒤차를 기다릴 필요가 전혀 없는 CTR (카운터) 모드의 혁명적 탄생이다.
📢 섹션 요약 비유: CBC 모드는 학생 10명이 릴레이로 앞사람의 숙제를 받아 이어서 풀어야 해서 한 시간 내내 1명씩만 고생하는 방식입니다. CTR 모드는 선생님이 학생 10명에게 1번부터 10번까지 각자 독립된 문제지를 확 뿌려버리고 "동시에 풀어!"라고 지시하여 5분 만에 끝내는 방식입니다.
Ⅱ. CTR 모드의 핵심 작동 원리 (난수 공장)
CTR 모드에서는 블록 암호(AES) 기계가 평문을 씹지 않는다. 평문은 구경만 한다.
1. 키 스트림(Keystream) 생성 공장
- 재료: 128비트 상자 안에 변하지 않는 **Nonce(일회용 난수)**와 1씩 톱니바퀴처럼 올라가는 **Counter(카운터: 0, 1, 2...)**를 합쳐서 넣는다.
- 1번 상자:
Nonce + 0001 - 2번 상자:
Nonce + 0002
- 1번 상자:
- 갈아 넣기: 이 번호표 상자를 AES 믹서기(암호화키 사용)에 쑥 밀어 넣으면, 수학 마법에 의해 128비트짜리 완벽한 **쓰레기 난수(키 스트림)**가 폭포수처럼 쏟아져 나온다.
2. 평문과의 XOR 버무리기 (암호화 & 복호화가 완벽히 동일)
- 이 쏟아져 나온 난수를 지나가는 평문 블록에
XOR ⊕로 비비기만 하면 암호문이 완성된다! - 엄청난 대반전: 복호화할 때도 "역 AES(복호화 모듈)"를 쓰지 않는다! 그냥 아까 썼던
Nonce + 0001을 똑같이 AES 믹서기에 한 번 더 돌려서 똑같은 난수를 뿜어낸 뒤, 암호문에XOR하면 다시 평문으로 돌아온다. (XOR의 쌍둥이 성질: $A \oplus B = C \rightarrow C \oplus B = A$)
┌──────────────────────────────────────────────────────────────────────────┐
│ CTR 모드의 독립적, 병렬적 암호화 작동 방식 시각화 │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ [ 1번 CPU 코어의 일 ] [ 2번 CPU 코어의 일 ] │
│ Nonce + 카운터 1 Nonce + 카운터 2 │
│ │ │ │
│ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ │
│ │ AES 믹서기 │ │ AES 믹서기 │ │
│ └───────────┘ └───────────┘ │
│ │ 난수 1 콸콸 │ 난수 2 콸콸 │
│ ▼ ▼ │
│ ( XOR ⊕ ) ◀── [ 평문 1 ] ( XOR ⊕ ) ◀── [ 평문 2 ] │
│ │ │ │
│ ▼ ▼ │
│ [ 암호문 1 ] [ 암호문 2 ] │
│ │
│ * 핵심: 1번 코어와 2번 코어는 서로 아무런 대화를 나누지 않는다. │
│ 앞 블록의 결과가 뒷 블록에 필요하지 않으므로 무한대 병렬 처리가 가능! │
└──────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] 이 그림이 왜 혁명인가? 하드웨어 칩 디자이너 입장에서는 기절할 노릇이다. 암호문을 풀 때도 비싸고 회로 면적을 많이 차지하는 역함수(Inverse AES) 칩을 만들 필요가 없이, 그냥 암호화(Forward AES) 칩 하나만 달랑 달아놓고 엑스오어만 갈기면 복호화가 끝난다. 칩이 작아지고 무지막지하게 빨라진다.
- 📢 섹션 요약 비유: 수백 명의 페인트공(CPU 코어)에게 1번부터 100번까지 각자 칠해야 할 벽돌 번호표(카운터)를 나눠줍니다. 1번 벽돌이 다 칠해지길 기다릴 필요 없이, 100명의 페인트공이 동시에 벽에 달라붙어 순식간에 페인트칠(암호화)을 끝내버리는 초고속 공사판입니다.
Ⅲ. 패딩(Padding)의 종말과 스트림 암호화
블록 암호(AES)의 고질병은 데이터가 128비트(16바이트)로 딱 안 떨어지면 뒤에 억지로 쓰레기 값을 쑤셔 넣는 '패딩'이었다. 이 패딩 때문에 해커가 에러를 분석해 뚫어내는 패딩 오라클 공격의 비극이 생겼다.
- CTR의 위력: CTR 모드는 사실상 AES를 이용해 무한대의 난수 테이프(Keystream)를 만들어내는 스트림 암호(Stream Cipher) 변환기다.
- 만약 내가 보낼 평문이 3바이트짜리
Hi!라면?- 믹서기에서 나온 16바이트 난수 중에서 앞의 3바이트만 똑 떼어서
Hi!에 엑스오어 하고 끝내버린다! 뒤에 강제로 글자를 채워 넣을 필요(패딩)가 0%다.
- 믹서기에서 나온 16바이트 난수 중에서 앞의 3바이트만 똑 떼어서
- 패딩이 사라지니, 암호문 크기가 평문과 1바이트 오차 없이 100% 동일해지며, 해커가 파고들던 패딩 오류 공격 표면 자체가 원천 증발해 버렸다.
Ⅳ. 치명적인 금기 사항: Nonce 재사용 (Never Reuse Nonce)
이렇게 완벽한 CTR 모드에도 딱 하나의 약점이 있는데, 이것은 사용자의 무지로 터진다.
- 원리: 암호화 = $P \oplus K$, 해커가 훔친 것 = $C$
- 치명적 실수: 내일 또 다른 파일(P2)을 보낼 때, 바보 같은 개발자가 똑같은 비밀키에 똑같은 Nonce + 1을 또 넣어버렸다고 치자.
- $C_1 = P_1 \oplus K$
- $C_2 = P_2 \oplus K$
- 해커는 인터넷에서 주운 암호문 두 개를 서로 엑스오어 해버린다!
- $C_1 \oplus C_2 = (P_1 \oplus K) \oplus (P_2 \oplus K) = P_1 \oplus P_2$
- 파국: 마법의 난수 방패($K$)가 서로 부딪혀 증발해 버리고, 평문 두 개가 서로 비벼진 값($P_1 \oplus P_2$)이 툭 튀어나온다. 언어학자(해커)는 이 값을 조금만 분석하면 원본 편지 두 장을 비밀번호 없이 그대로 읽어버린다. 과거 소련군 암호(One-Time Pad 재사용)가 이렇게 털렸다.
철칙: 동일한 비밀키를 쓸 때, Nonce(초기화 난수) 값은 우주가 멸망할 때까지 두 번 다시 똑같은 것을 쓰면 안 된다. 무조건 유일무이해야 한다.
Ⅴ. 결론
"CTR 모드는 암호학의 구속구(체인)를 끊고 자유(병렬성)를 쟁취한 해방자다." 느려 터진 CBC 모드를 대체하여 CTR 모드가 등장함으로써, 기가비트 이더넷과 5G의 쏟아지는 트래픽을 서버가 감당할 수 있게 되었다. 병렬 처리의 극의에 달한 CTR 모드는, 이후 해커가 데이터를 변조(Tampering)하는 것마저 잡아내는 인증 태그(MAC) 기술과 합체하여 현대 웹 보안(TLS 1.3)의 황제인 GCM 모드로 완전체 진화를 이루게 된다.
📌 관련 개념 맵
- 전신 (해결 대상): CBC 모드 (직렬 구조 병목 해결)
- 내부 동작 특성: 블록 암호를 스트림 암호(Stream Cipher)처럼 동작하게 만듦
- 구현 특이점: 패딩(Padding) 불필요, 역 암호화(Decryption) 하드웨어 칩 불필요
- 주의 사항: Nonce (Number Used Once) 재사용 시 평문 평탄화 공격에 노출
👶 어린이를 위한 3줄 비유 설명
- CBC 암호는 체인점처럼 1번 가게가 요리를 끝내야 2번 가게가 재료를 받아 요리를 시작해서 속도가 무지 느렸어요.
- CTR 암호는 요리사 100명에게 각자 1번부터 100번까지 번호표를 나눠주고, 서로 눈치 보지 말고 동시에 100그릇을 볶으라고 시킨 거예요!
- 그래서 100배나 빨리 요리(암호화)가 끝나고, 남는 재료를 억지로 끼워 넣을(패딩) 필요도 없는 엄청나게 똑똑한 방법이랍니다.