CSS Tutor Study Hub 메인으로

Computersystemsicherheit 2025/26

AES·ECB·CBC·CTR 완전 초보 강의

이름의 뜻부터 block 내부 변화, mode별 처리 순서, padding과 시험 함정까지 단계별로 설명합니다.

CSS 1타 강사 · ZERO-BASE DEEP DIVE

긴 메시지를 AES로 암호화할 때 실제로 무슨 일이 일어날까요?

AES, ECB, CBC, CTR을 한꺼번에 외우면 네 개의 암호 알고리즘처럼 보입니다. 하지만 실제 구조는 단순합니다. AES는 고정 크기 블록 하나를 바꾸는 핵심 부품이고, ECB·CBC·CTR은 그 부품을 긴 메시지에 반복해서 사용하는 규칙(mode)입니다.

이 페이지를 읽는 가장 쉬운 순서

먼저 AES를 ‘16칸짜리 상자 하나를 잠그는 기계’라고 생각하세요. 그다음 ECB·CBC·CTR을 ‘상자가 여러 개일 때 기계를 운용하는 세 가지 작업 지침’이라고 생각하면 됩니다. 처음 읽을 때는 수식을 외우지 말고, 각 절의 비유와 파란색 축소 예시만 따라가도 충분합니다.

핵심 관계: AES = 기계 / ECB·CBC·CTR = 그 기계의 사용법

00

먼저 여섯 단어만 이해합시다

Bit
0 또는 1 한 자리입니다. 컴퓨터 데이터의 가장 작은 단위입니다.
Byte
bit 8개를 묶은 단위입니다. AES block 하나는 16 bytes, 즉 128 bits입니다.
Block
알고리즘이 한 번에 처리하는 고정 크기 데이터 조각입니다. AES에서는 항상 16 bytes입니다.
Key
같은 평문도 다른 결과로 바꾸는 비밀값입니다. AES key length는 128·192·256 bits 중 하나입니다.
XOR
두 bit가 다르면 1, 같으면 0이 되는 연산입니다. 같은 값을 두 번 XOR하면 원래 값으로 돌아옵니다.
Mode
16 bytes보다 긴 메시지를 여러 block으로 나눈 뒤 AES를 어떤 순서와 연결 관계로 반복 사용할지 정한 규칙입니다.

택배 포장으로 한 번에 이해하기

보낼 물건 전체가 message, 16칸짜리 택배 상자 하나가 block, 상자를 잠그는 비밀 번호가 key, 잠금 기계가 AES입니다. 상자가 여러 개라면 “각자 따로 잠글지, 앞 상자와 연결할지, 번호표로 만든 가림막을 씌울지”를 정해야 하는데 이것이 mode입니다.

즉, block은 알고리즘 이름이 아니라 ‘한 번에 처리하는 데이터 묶음’입니다.

16 bytes가 어느 정도인가요?

영문 ASCII 문자 하나를 1 byte라고 단순화하면 MEET AT NOON!!!!은 정확히 16 bytes입니다. AES는 이런 크기의 조각 하나를 입력으로 받습니다. 한글은 글자 하나가 항상 1 byte가 아니므로, 이 예시는 크기 감각을 위한 영문 예시입니다.

01

AES: 고정 크기 블록 하나를 바꾸는 핵심 부품

AESAdvanced Encryption Standard, 즉 ‘고급 암호화 표준’이라는 이름입니다. 이전 표준 DES의 짧은 키가 더 이상 충분히 안전하지 않게 되자 NIST가 새 표준을 선정했고, Rijndael 알고리즘이 AES가 되었습니다.

AES는 메시지 전체를 직접 처리하지 않습니다. 정확히 128 bits, 즉 16 bytes짜리 입력 block 하나와 key를 받아 같은 길이의 16-byte 출력 block을 만듭니다. 이 변환을 여러 번 반복하는 한 묶음을 round라고 부릅니다.

비유: 네 종류의 작업을 반복하는 특수 세탁기

16벌의 옷을 4×4 바구니에 넣는다고 생각해 봅시다. 기계는 매 round마다 ① 옷의 색을 정해진 표에 따라 바꾸고(SubBytes), ② 줄마다 옷의 위치를 옮기고(ShiftRows), ③ 같은 세로줄의 색을 서로 섞고(MixColumns), ④ 비밀 세제인 round key를 넣습니다(AddRoundKey). 이 과정을 여러 번 반복하면 처음 배치의 흔적을 알아보기 어려워집니다.

비유의 대응: 옷 한 벌 = 1 byte / 4×4 바구니 = state / 세탁 한 회차 = round

모바일에서는 그림 내부를 좌우로 움직여 각 AES 단계를 읽으세요.
  1. 16 bytes를 state에 배치합니다.AES는 입력을 4행×4열의 byte 표로 생각합니다. 이 표를 state라고 부릅니다.
  2. Key expansion을 수행합니다.원래 key 하나에서 각 round에 사용할 round key들을 만들어 둡니다.
  3. 처음에 AddRoundKey를 합니다.state와 첫 round key를 XOR해 key의 영향을 데이터에 섞습니다.
  4. 중간 rounds를 반복합니다.SubBytes → ShiftRows → MixColumns → AddRoundKey 순서로 처리합니다.
  5. 마지막 round를 수행합니다.SubBytes → ShiftRows → AddRoundKey만 하며 MixColumns는 생략합니다.
  6. 16-byte ciphertext block을 출력합니다.AES-128·192·256은 각각 10·12·14 rounds를 사용합니다.

SubBytes

Substitute bytes, 즉 각 byte를 S-box 표에 따라 다른 byte로 치환합니다. 단순한 직선 관계를 깨는 비선형 단계입니다.

ShiftRows

Shift rows, 즉 state의 각 행을 서로 다른 칸 수만큼 왼쪽으로 회전합니다. 같은 열에 있던 byte를 다른 열로 이동시킵니다.

MixColumns

Mix columns, 즉 한 열의 네 byte를 수학적으로 섞습니다. 입력의 작은 변화가 여러 출력 byte로 퍼지게 합니다.

AddRoundKey

현재 state와 해당 round key를 XOR합니다. 이 단계 때문에 올바른 key 없이는 전체 변환을 역으로 따라갈 수 없습니다.

A~P는 실제 암호값이 아니라 변화의 종류를 보여 주는 표식입니다. 모바일에서는 그림 안을 좌우로 움직여 보세요.

A 한 칸을 따라가 보면

입력A라는 byte가 state의 한 칸에 들어갑니다.
SubBytesS-box에서 A에 대응하는 새 값 s(A)로 바뀝니다.
ShiftRows그 칸이 속한 행의 규칙에 따라 옆 열로 이동할 수 있습니다.
MixColumns같은 열의 다른 세 값과 섞이므로 이제 결과 한 칸은 A 하나만의 흔적이 아닙니다.
AddRoundKey그 결과를 round key의 대응 byte와 XOR합니다.

주의: 실제 AES 계산은 유한체 연산과 실제 S-box 값을 사용합니다. 여기서는 “무엇이 바뀌는가”만 보기 위해 기호로 표시했습니다.

스스로 확인

SubBytes는 값, ShiftRows는 위치, MixColumns는 같은 열의 관계, AddRoundKey는 key의 영향을 바꾼다고 말할 수 있다면 내부 흐름을 제대로 잡은 것입니다.

02

ECB: 각 블록을 서로 모르는 독립된 책 항목처럼 처리

ECBElectronic Codebook의 약자입니다. 옛날 codebook에서 어떤 기호를 찾으면 정해진 대응 기호가 나오는 것처럼, 같은 key 아래에서는 같은 plaintext block이 언제나 같은 ciphertext block으로 바뀌기 때문에 이런 이름이 붙었습니다.

비유: 똑같은 도장이 찍히는 독립 포장대

세 명의 직원이 각자 상자 하나를 받습니다. 직원들은 옆 사람의 상자를 전혀 보지 않고, 모두 같은 비밀 도장 기계에 자기 상자를 넣습니다. 내용물이 완전히 같은 두 상자는 결과 도장도 완전히 같습니다. 도장만 보고 내용은 읽지 못해도 “이 두 상자의 내용이 같다”는 사실은 알 수 있습니다.

Electronic Codebook이라는 이름도 ‘같은 항목을 찾으면 같은 대응 결과가 나온다’는 성질에서 기억하면 됩니다.

각 plaintext block이 같은 key를 사용하는 독립 block cipher를 거쳐 ciphertext가 되는 ECB 암호화 도식
ECB 암호화세로줄 하나가 block 하나입니다. 옆 블록과 연결되는 가로 화살표가 없다는 점이 핵심입니다.
각 ciphertext block이 독립적으로 block cipher decryption을 거쳐 plaintext가 되는 ECB 복호화 도식
ECB 복호화각 ciphertext도 다른 블록을 기다리지 않고 독립적으로 복호화됩니다.

강의 스크립트 원본: Vorlesung/03 Symmetrische Kryptographie.pdf, pp.6–7.

  1. 메시지를 16-byte blocks로 나눕니다.P₁, P₂, P₃처럼 번호를 붙입니다.
  2. 마지막 block이 짧으면 padding합니다.AES에는 반드시 정확히 16 bytes를 넣어야 하기 때문입니다.
  3. 각 block에 AES를 독립적으로 적용합니다.Cᵢ = AESₖ(Pᵢ)이며 다른 block 결과를 사용하지 않습니다.
  4. 암호문 blocks를 이어 붙입니다.독립적이므로 병렬 처리와 특정 block만의 복호화가 쉽습니다.

두 블록이 같을 때 단계별 축소 예시

평문P₁=AAAA, P₂=AAAA
독립 입력두 블록 모두 아무것도 섞지 않고 같은 AES key에 바로 넣습니다.
가상 결과C₁=7F2C, C₂=7F2C
공격자가 보는 것AAAA라는 내용은 모르지만 C₁=C₂이므로 두 원본 블록이 같았다는 패턴을 압니다.

AAAA와 7F2C는 원리를 위한 축소 표기이며 실제 AES는 16-byte 블록을 사용합니다.

문제는 독립성입니다. P₁=P₂이면 C₁=C₂입니다. 공격자는 내용을 읽지 못해도 “같은 데이터가 반복된다”는 구조를 볼 수 있습니다. 그래서 이미지처럼 반복 구조가 많은 데이터에서는 윤곽이 남을 수 있으며, 일반적인 메시지 암호화에 ECB를 사용하면 안 됩니다.

스스로 확인

ECB에서 두 같은 평문 블록이 왜 같은 암호문이 되는가? “각 블록이 같은 key로 독립 처리되고, 매번 달라지는 입력값이 없기 때문”이라고 답하면 됩니다.

03

CBC: 앞 암호문을 다음 평문에 연결하는 사슬

CBCCipher Block Chaining의 약자입니다. ‘암호문 block을 사슬처럼 연결한다’는 이름 그대로, 직전 ciphertext block을 다음 plaintext block과 XOR한 뒤 AES에 넣습니다.

비유: 앞 상자의 봉인 색을 다음 물감에 섞는 포장대

첫 상자를 잠그기 전에 IV라는 시작 물감을 섞습니다. 첫 상자를 잠근 뒤 나온 봉인 색 C₁을 두 번째 상자의 내용 P₂에 섞고, 그 결과를 다시 잠급니다. 따라서 두 상자의 원래 내용이 같더라도 앞에서 섞인 색이 다르면 최종 봉인은 달라집니다. 이것이 Chaining, 즉 사슬 연결입니다.

CBC에서는 이전 암호문이 다음 AES 입력의 재료가 됩니다.

IV와 이전 ciphertext가 다음 plaintext의 XOR 입력으로 연결되는 CBC 암호화 도식
CBC 암호화첫 XOR에는 IV가, 그다음 XOR에는 직전 ciphertext가 들어갑니다. 위에서 아래로 내려간 뒤 다음 블록으로 되돌아가는 선을 따라가세요.
ciphertext를 복호화한 값과 IV 또는 이전 ciphertext를 XOR하여 plaintext를 얻는 CBC 복호화 도식
CBC 복호화현재 ciphertext를 먼저 block cipher로 복호화하고, IV 또는 이전 ciphertext와 XOR해 plaintext를 복원합니다.

강의 스크립트 원본: Vorlesung/03 Symmetrische Kryptographie.pdf, pp.13–14.

  1. 무작위·예측 불가능한 IV를 준비합니다.첫 block 앞에는 이전 ciphertext가 없으므로 같은 크기의 Initialization Vector를 C₀처럼 사용합니다. IV는 비밀일 필요는 없지만 재사용·예측 문제를 조심해야 합니다.
  2. 첫 평문과 IV를 XOR합니다.X₁=P₁⊕IV입니다. 같은 P₁이라도 IV가 달라지면 X₁이 달라집니다.
  3. X₁을 AES로 암호화합니다.C₁=AESₖ(X₁)입니다.
  4. 다음 평문에 직전 암호문을 연결합니다.X₂=P₂⊕C₁, C₂=AESₖ(X₂)입니다. 이 과정을 끝까지 반복합니다.
  5. 복호화에서는 순서를 반대로 연결합니다.Pᵢ=AESₖ⁻¹(Cᵢ)⊕Cᵢ₋₁입니다.

4-bit로 줄여 본 XOR 연결 예시

준비P₁=1010, IV=0011
먼저 XORP₁⊕IV = 1001. 같은 자리 bit가 다를 때만 1입니다.
AES에 입력원래 P₁이 아니라 섞인 값 1001을 암호화하여 C₁을 얻습니다.
두 번째 블록P₂⊕C₁을 만든 뒤 AES에 넣습니다. C₁이 바뀌면 두 번째 입력도 바뀝니다.
복호화AES로 C₁을 되돌린 결과에 IV를 다시 XOR하면 P₁이 나옵니다. 같은 값을 두 번 XOR하면 사라지기 때문입니다.

실제 CBC는 4 bits가 아니라 AES의 128-bit 블록 전체를 XOR합니다. 이 예시는 XOR 순서만 보여 줍니다.

같은 평문 block이 반복되어도 직전 ciphertext가 다르면 AES에 들어가는 값이 달라져 ECB처럼 눈에 띄는 반복 패턴이 남지 않습니다. 대신 암호화는 앞 결과가 있어야 다음 block을 처리할 수 있어 순차적입니다.

CBC는 마지막 block을 완전하게 만들어야 하므로 일반적으로 padding이 필요합니다. 서버가 padding이 맞는지 틀리는지를 서로 다른 반응으로 알려 주면 padding oracle attack의 단서가 될 수 있습니다.

스스로 확인

CBC의 두 번째 블록을 암호화하려면 왜 첫 번째 암호문을 기다려야 할까요? P₂보다 먼저 C₁을 XOR해야 하기 때문입니다.

04

CTR: 증가하는 counter를 암호화해 일회용 흐름을 생성

CTRCounter mode의 약자입니다. 실제 plaintext를 AES에 직접 넣지 않고, nonce와 1·2·3처럼 증가하는 counter 값을 AES로 암호화해 keystream을 만듭니다. 그 keystream을 plaintext와 XOR합니다.

비유: 번호표마다 다른 불투명 필름을 찍어 주는 기계

메시지 상자를 AES 기계에 직접 넣지 않습니다. 대신 “이번 메시지 번호 nonce + 상자 번호 1, 2, 3…”를 넣어 상자마다 다른 불투명 필름을 만듭니다. 그 필름을 평문 위에 겹치는 동작이 XOR입니다. 받는 사람은 같은 번호표로 같은 필름을 다시 만든 뒤 한 번 더 겹쳐 원문을 복원합니다.

Counter mode라는 이름은 AES 입력에 증가하는 counter 번호를 사용하기 때문에 붙었습니다.

nonce와 counter가 block cipher encryption을 거쳐 plaintext와 XOR되어 ciphertext를 만드는 CTR 암호화 도식
CTR 암호화위쪽의 nonce·counter가 AES에 들어갑니다. AES 출력과 아래쪽 plaintext를 XOR해 ciphertext를 만듭니다.
같은 nonce와 counter에서 만든 AES 출력과 ciphertext를 XOR해 plaintext를 복원하는 CTR 복호화 도식
CTR 복호화암호화 때와 같은 AES encryption을 사용합니다. 아래쪽 입력만 ciphertext로 바뀌고 XOR 결과가 plaintext가 됩니다.

강의 스크립트 원본: Vorlesung/03 Symmetrische Kryptographie.pdf, pp.22–23.

  1. 메시지마다 겹치지 않는 nonce를 정합니다.Nonce는 ‘number used once’, 즉 한 번만 사용하는 값이라는 뜻입니다.
  2. 각 block 번호 counter를 붙입니다.nonce∥1, nonce∥2, nonce∥3처럼 서로 다른 AES 입력을 만듭니다.
  3. Counter block을 AES로 암호화합니다.Sᵢ=AESₖ(nonce∥counterᵢ)가 keystream block입니다.
  4. 평문과 keystream을 XOR합니다.Cᵢ=Pᵢ⊕Sᵢ입니다. 복호화도 Pᵢ=Cᵢ⊕Sᵢ로 같은 연산을 사용합니다.
  5. 마지막 조각에는 필요한 keystream만 사용합니다.평문이 2 bytes만 남았다면 keystream의 앞 2 bytes만 XOR하면 되므로 padding하지 않습니다.

같은 XOR을 두 번 하면 복호화되는 예시

평문 P1010
Keystream Snonce와 counter를 AES로 처리해 0110이 나왔다고 가정합니다.
암호화C=P⊕S = 1010⊕0110 = 1100
복호화P=C⊕S = 1100⊕0110 = 1010
마지막 조각평문이 2 bytes만 남으면 keystream도 앞 2 bytes만 사용합니다. 그래서 padding이 필요 없습니다.

0110은 가상의 keystream입니다. 실제로는 nonce∥counter로 만든 128-bit AES 출력입니다.

각 counter block은 서로 독립적으로 만들 수 있어 병렬 처리와 random access가 가능합니다. 하지만 같은 key에서 nonce와 counter 조합을 재사용하면 같은 keystream이 다시 나오고, 두 ciphertext를 XOR했을 때 plaintext의 관계가 노출됩니다.

Nonce를 재사용하면 왜 위험할까요?

서로 다른 두 평문 P와 Q에 같은 keystream S를 사용하면 C₁=P⊕S, C₂=Q⊕S가 됩니다. 공격자가 두 암호문을 XOR하면 S가 두 번 나타나 사라지고 C₁⊕C₂ = P⊕Q가 남습니다. 원문끼리의 관계가 드러나므로 nonce는 같은 key에서 반복되면 안 됩니다.

스스로 확인

CTR에서 AES에 들어가는 것은 평문이 아니라 nonce와 counter입니다. 이 한 문장을 말할 수 있으면 CBC와 가장 중요한 차이를 이해한 것입니다.

05

Padding: AES가 받을 수 있도록 마지막 상자의 빈칸을 채우기

ECB와 CBC는 AES에 완전한 16-byte block을 넣어야 합니다. 마지막에 14 bytes만 남았다면 두 칸을 채워야 합니다. PKCS#7 방식에서는 ‘두 칸을 채웠다’는 의미로 02 02를 붙입니다.

비유: 16칸 상자의 빈칸에 개수표를 넣기

마지막 상자에 물건이 14개뿐이면 빈칸이 2개입니다. 그냥 아무 종이나 넣으면 받는 사람이 어디까지가 원래 물건인지 알 수 없습니다. 그래서 두 빈칸 모두에 “빈칸은 2개”라는 표식 02를 넣습니다. 받는 사람은 마지막 02를 보고 뒤의 2 bytes를 제거합니다.

원래 마지막 조각 · 14 bytes4142434445464748494A4B4C4D4E
Padding 후 · 16 bytes4142434445464748494A4B4C4D4E0202

평문 길이가 이미 정확히 16 bytes여도 PKCS#7에서는 `10`을 16개 붙인 새 block을 추가합니다. 그렇지 않으면 마지막 byte가 실제 데이터인지 padding 표시인지 구분할 수 없기 때문입니다.

세 가지 길이를 비교해 보기

15 bytes1칸이 비므로 01 하나를 붙입니다.
14 bytes2칸이 비므로 02 02를 붙입니다.
16 bytes이미 꽉 찼지만 새 블록에 10을 16개 붙입니다. 10은 16진수로 16이라는 뜻입니다.
스스로 확인

PKCS#7에서 붙이는 각 byte의 값은 “추가한 padding byte의 총개수”입니다. 남은 빈칸에 0을 무조건 채우는 방식이 아닙니다.

같은 입력을 세 mode에 넣어 한 번에 비교하기

06

시험장에서 바로 쓰는 비교표

세 mode를 고르는 질문 하나

“AES 기계에 이번에 무엇을 넣는가?”만 확인하세요. ECB는 평문 자체, CBC는 평문⊕이전 암호문, CTR은 nonce∥counter를 AES에 넣습니다. 이 차이에서 패턴 노출, 순차 처리, padding 여부가 모두 따라 나옵니다.

질문ECBCBCCTR
이름의 핵심Codebook처럼 독립 대응Ciphertext를 chain으로 연결Counter로 keystream 생성
AES에 넣는 값평문 block평문 ⊕ 이전 암호문/IVnonce ∥ counter
Padding필요필요불필요
반복 패턴노출됨IV와 chaining으로 숨김서로 다른 keystream으로 숨김
병렬 encryption가능불가능가능
특별히 지켜야 할 값ECB 사용 자체를 피함올바른 IV와 padding 처리nonce-counter 절대 재사용 금지
위변조 탐지제공하지 않음제공하지 않음제공하지 않음

짧은 상황 문제를 푸는 시범

문제: 마지막 평문 조각이 3 bytes이고, AES에는 nonce와 증가하는 block 번호를 넣은 뒤 그 출력을 평문과 XOR한다. 어떤 mode이며 padding이 필요한가?

단서 1nonce와 증가 번호를 AES에 넣으므로 Counter mode, 즉 CTR입니다.
단서 2AES 출력인 keystream 중 앞 3 bytes만 평문과 XOR할 수 있습니다.
결론CTR이며 padding은 필요 없습니다. 단, 같은 key에서 nonce-counter 조합을 재사용하면 안 됩니다.

서술형 답안 골격

“AES는 128-bit block cipher이고, [mode]는 여러 block을 처리하는 규칙이다. 이 mode에서는 [AES 입력이 만들어지는 방식]으로 각 block을 처리한다. 따라서 [padding 여부와 이유]이며, [IV/nonce/chaining 조건]을 지켜야 한다. 다만 encryption만으로 integrity는 보장되지 않는다.”

강의 근거

Vorlesung/03 Symmetrische Kryptographie.pdf — ECB pp.6–12, CBC pp.13–18, CTR pp.22–26, AES pp.28–29. 일반 보안 지식은 강의의 정의와 흐름을 초심자용으로 풀어 쓴 것입니다.

Krypto 개념 카드로 돌아가기