AES (Advanced Encryption Standard)
AES는 현재 전 세계에서 가장 널리 쓰이는 대칭키 블록 암호화 알고리즘이다. 2001년 NIST(미국 국립표준기술연구소)가 표준으로 채택했고, 지금도 HTTPS, Wi-Fi 암호화(WPA2), 파일 암호화, 군사 통신 등 거의 모든 보안 시스템의 핵심에 자리하고 있다.
핵심 개념 두 가지 — 대칭키와 블록 암호
대칭키(Symmetric Key): 암호화할 때 쓴 키와 복호화할 때 쓰는 키가 같다. 빠르고 효율적이지만, 키를 상대방에게 안전하게 전달하는 문제가 항상 따라온다. (참고로 이 문제를 해결하는 게 RSA 같은 비대칭키 방식이다.)
블록 암호(Block Cipher): 데이터를 128비트(16바이트) 단위로 잘라서 처리한다. 한 번에 통째로 암호화하는 것이 아니라, 블록 단위로 반복 처리하는 방식이다.
키 크기는 세 가지 중에 선택할 수 있다.
| 종류 | 키 길이 | 라운드 수 |
|---|---|---|
| AES-128 | 128비트 | 10라운드 |
| AES-192 | 192비트 | 12라운드 |
| AES-256 | 256비트 | 14라운드 |
키가 길수록 더 안전하지만, 그만큼 연산도 늘어난다. 대부분의 일반적인 용도에는 AES-128로도 충분하다.
State — AES가 데이터를 다루는 방식
AES는 128비트(16바이트)를 그냥 일렬로 처리하지 않는다. 내부적으로 아래처럼 **4×4 바이트 행렬(State)**로 배치해서 연산한다.
[ b0 b4 b8 b12 ]
[ b1 b5 b9 b13 ]
[ b2 b6 b10 b14 ]
[ b3 b7 b11 b15 ]
이 행렬 위에서 4가지 연산이 반복된다. 데이터가 이 행렬을 여러 라운드 통과하면서 원본과 완전히 다른 값으로 변해가는 것이 AES의 핵심 원리다.

전체 암호화 흐름
AES-128 기준으로 전체 흐름은 이렇다.
① 키 확장 (Key Expansion) 원래 키 128비트를 가지고 라운드마다 쓸 서브키를 미리 만들어둔다. AES-128 기준으로 총 11개의 128비트 라운드 키가 생성된다.
② Initial Round — AddRoundKey 평문과 첫 번째 라운드 키를 XOR한다. 본격적인 암호화 시작 전에 키를 한 번 섞어두는 것이다.
③ Round 1~9 — 4가지 연산 반복 매 라운드마다 아래 4가지 연산을 순서대로 수행한다.
④ Final Round (Round 10) — MixColumns 제외 마지막 라운드는 MixColumns를 생략한다. 복호화할 때 대칭성을 맞추기 위해서다.
4가지 핵심 연산

① SubBytes — 혼돈(Confusion)
16개 바이트 각각을 S-Box 테이블에 넣어 다른 값으로 교체한다. S-Box는 GF(2⁸) 유한체의 역원 계산으로 만들어져 있어서, 입력과 출력 사이에 선형 관계가 전혀 없다. 덕분에 공격자가 평문-암호문 쌍을 아무리 많이 모아도 패턴을 찾을 수가 없다.
예: 0x53 → S-Box → 0xED

② ShiftRows — 확산 준비(Permutation)
각 행을 왼쪽으로 순환 시프트한다.
행 0: 이동 없음 [ a b c d ] → [ a b c d ]
행 1: 1칸 이동 [ e f g h ] → [ f g h e ]
행 2: 2칸 이동 [ i j k l ] → [ k l i j ]
행 3: 3칸 이동 [ m n o p ] → [ p m n o ]
얼핏 보면 단순한 이동이지만, 세로로 보면 각 열이 이제 서로 다른 행의 바이트를 포함하게 된다. 바로 다음 MixColumns가 열 단위로 작동하기 때문에, ShiftRows가 없으면 열들이 독립적으로만 암호화돼 확산이 일어나지 않는다.

③ MixColumns — 강력한 확산(Diffusion)
각 열(4바이트)에 고정된 4×4 행렬을 GF(2⁸) 위에서 곱한다.
s0' = (2·s0) ⊕ (3·s1) ⊕ s2 ⊕ s3
s1' = s0 ⊕ (2·s1) ⊕ (3·s2) ⊕ s3
s2' = s0 ⊕ s1 ⊕ (2·s2) ⊕ (3·s3)
s3' = (3·s0) ⊕ s1 ⊕ s2 ⊕ (2·s3)
입력 바이트 하나만 바뀌어도 출력 4바이트가 전부 달라진다. 이것이 **눈사태 효과(Avalanche Effect)**다. 단 몇 라운드만에 원본 1비트 변화가 암호문 전체로 퍼진다. 마지막 라운드에서는 이 연산이 빠진다.

④ AddRoundKey — 키 혼합(Key Mixing)
현재 State의 각 바이트와 해당 라운드 키를 XOR한다. 4가지 연산 중 유일하게 키에 의존하는 연산이다. XOR의 수학적 성질 덕분에 같은 키로 한 번 더 XOR하면 원래 값이 나온다.
암호화: A ⊕ K = C
복호화: C ⊕ K = A
키를 모르면 절대 복원이 불가능하다.
왜 이 4가지 조합인가?
암호학에서 좋은 암호는 두 가지 성질을 가져야 한다고 정의된다.
- 혼돈(Confusion): 암호문과 키의 관계를 복잡하게 만들기 → SubBytes가 담당
- 확산(Diffusion): 평문 하나의 변화가 암호문 전체에 영향을 주도록 만들기 → ShiftRows + MixColumns가 담당
- 키 의존성: AddRoundKey가 담당
이 세 역할을 10번 반복하면, 원본 데이터와 암호문 사이의 연관성이 수학적으로 추적 불가능한 수준으로 사라진다.
장단점
AES가 30년 가까이 표준 자리를 지키는 이유는 속도와 보안의 균형 때문이다. 하드웨어 가속(AES-NI 명령어 세트)을 지원하는 CPU에서는 거의 메모리 속도 수준으로 빠르게 동작한다.
다만 단점도 있다. 대칭키 방식이라 키 배포 문제가 항상 따라온다. 처음 키를 어떻게 상대방에게 안전하게 전달할 것인가 — 이 문제를 해결하기 위해 실제로는 RSA나 Diffie-Hellman 같은 비대칭키 방식으로 키를 교환하고, 실제 데이터 암호화는 AES로 처리하는 하이브리드 방식을 많이 쓴다. HTTPS가 바로 이 구조다.
운용 모드 (Operation Mode)
AES 자체는 128비트 블록 하나를 암호화하는 방법을 정의한다. 그런데 실제 데이터는 128비트보다 훨씬 길다. 이 긴 데이터를 여러 블록으로 나눠 어떻게 처리할지 정하는 것이 운용 모드다.
| 모드 | 특징 | 주요 사용처 |
|---|---|---|
| ECB | 각 블록 독립 처리. 같은 평문 → 같은 암호문. 패턴 노출로 보안 취약 | 거의 사용 안 함 |
| CBC | 이전 암호문 블록과 XOR 후 암호화. 패턴 숨김. IV 필요 | 파일 암호화, TLS |
| CTR | 카운터를 암호화해 키스트림 생성 후 XOR. 병렬 처리 가능 | 스트리밍, 디스크 암호화 |
| GCM | CTR + 무결성 검증(MAC) 포함. 현재 가장 권장되는 모드 | HTTPS(TLS 1.3), SSH |
CBC는 이전 블록의 암호문이 다음 블록에 영향을 줘서 ECB의 패턴 노출 문제를 해결하지만, 오류가 전파되고 병렬 처리가 안 된다는 단점이 있다. 요즘은 무결성 검증까지 함께 제공하는 GCM 모드가 표준으로 자리 잡는 추세다.
실제 사용 사례
- HTTPS / TLS: 브라우저와 서버 사이의 모든 통신
- Wi-Fi (WPA2/WPA3): 무선 네트워크 암호화
- 파일 시스템 암호화: BitLocker(Windows), FileVault(macOS)
- 메시지 앱: WhatsApp, Signal의 종단간 암호화
- VPN: IPsec, OpenVPN의 데이터 암호화
- 하드웨어: SSD 자체 암호화(Self-Encrypting Drive)
마무리
AES는 단순히 “많이 쓰이는 알고리즘”이 아니다. 현대 보안 인프라의 사실상 기반이다. 지금 이 글을 읽고 있는 브라우저도, 스마트폰의 Wi-Fi 연결도, 잠금 화면 뒤의 저장 데이터도 — 대부분 AES로 보호되고 있다.
SubBytes가 혼돈을 만들고, ShiftRows와 MixColumns가 확산을 만들고, AddRoundKey가 키를 섞는다. 이 단순한 구조를 10번 반복하는 것으로 수학적으로 뚫기 거의 불가능한 암호가 완성된다. 하나씩 뜯어보면 각 연산 자체는 그리 복잡하지 않은데, 그 조합이 만들어내는 결과는 놀랍도록 강력하다.

