CBC 모드 (Cipher Block Chaining)
CBC는 AES 같은 블록 암호를 긴 데이터에 적용할 때 쓰는 운용 모드(Operation Mode) 중 하나다.
왜 CBC가 필요한가 — ECB의 문제부터
AES는 128비트 블록 하나를 암호화하는 방법을 정의한다. 그런데 실제 데이터는 대부분 128비트보다 훨씬 길다. 이 긴 데이터를 블록으로 잘라 어떻게 처리할지 정하는 것이 운용 모드인데, 가장 단순한 방식인 ECB(Electronic Codebook) 부터 보는 게 CBC를 이해하는 가장 빠른 길이다.

ECB는 각 블록을 완전히 독립적으로 암호화한다.
P1 → AES_Enc(K) → C1
P2 → AES_Enc(K) → C2
P3 → AES_Enc(K) → C3
문제는 단순하다. P1 = P2이면 C1 = C2다. 같은 평문 블록은 항상 같은 암호문 블록이 나온다. 데이터에 반복 패턴이 있으면 암호문에도 그 패턴이 그대로 드러난다. 유명한 예시가 리눅스 펭귄 이미지를 ECB로 암호화했을 때인데, 암호화를 했음에도 불구하고 펭귄의 윤곽이 그대로 보인다. 암호화의 의미가 없는 것이다.
CBC는 바로 이 문제를 해결하기 위해 나왔다.
CBC의 핵심 아이디어 — 체이닝

CBC의 해결 방법은 직관적이다. 각 블록을 암호화하기 전에, 이전 블록의 암호문과 XOR한다.
C1 = AES_Enc(K, P1 ⊕ IV)
C2 = AES_Enc(K, P2 ⊕ C1)
C3 = AES_Enc(K, P3 ⊕ C2)
이것이 **체이닝(Chaining)**이다. 각 블록이 이전 블록의 결과에 묶여 있어서, 앞 블록이 달라지면 그 이후 블록이 전부 달라진다. P1 = P2라도 C1 ≠ C2가 된다. C1이 P2에 XOR되어 들어가기 때문이다.
그런데 첫 번째 블록 P1은 XOR할 “이전 암호문 블록”이 없다. 여기서 IV가 등장한다.
IV (Initialization Vector) — 가장 중요한 개념
IV는 첫 번째 블록을 위한 가짜 이전 암호문 블록이다. 128비트 랜덤값으로, P1을 암호화하기 전에 XOR한다.
IV의 역할을 한 문장으로 정리하면: “같은 평문을 같은 키로 암호화해도 매번 다른 암호문이 나오게 만드는 장치”다.

이미테이션 게임을 본 적이 있다면 이 개념이 훨씬 직관적으로 다가올 것이다. 영화에서 블레츨리 파크 팀이 에니그마를 풀 수 있었던 결정적 이유 중 하나는, 독일군이 매일 같은 패턴의 평문을 반복해서 암호화했기 때문이다. 실제 역사에서는 매일 아침 발송되는 기상 보고에 독일어로 날씨를 뜻하는 단어가 반드시 들어갔고, 많은 메시지가 정해진 형식의 인사로 끝났다. 영화에서는 이를 “HEIL HITLER”로 단순화해서 보여줬지만, 핵심은 같다 — 같은 내용이 같은 암호화 설정으로 매일 반복됐다는 것이다.
앨런 튜링 팀은 이 패턴을 이용해 평문의 일부를 추측(crib)하고, 그것으로 당일의 에니그마 설정을 역추적했다. 공격자가 암호문을 몰라도 “오늘도 저 위치에 날씨 단어가 있을 것이다”라는 사실만으로 경우의 수를 극적으로 줄일 수 있었던 것이다.
CBC의 IV 재사용 문제는 구조가 정확히 같다. IV가 항상 같으면 같은 평문은 항상 같은 암호문 첫 블록을 만든다. 공격자는 내용을 몰라도 “오늘도 어제와 같은 메시지가 왔다”는 사실을 알 수 있고, 이 반복성이 공격의 발판이 된다. 독일군이 매일 같은 형식의 메시지를 보내다가 암호가 풀린 것처럼, IV를 재사용하는 순간 암호화는 패턴을 숨기지 못하게 된다.
IV의 3가지 조건
① 매 암호화마다 새로 생성해야 한다 같은 키 + 같은 IV 조합을 절대 재사용하면 안 된다. 재사용하는 순간, 두 암호문의 첫 블록을 XOR하면 두 평문의 첫 블록 XOR값이 그대로 노출된다.
C1_a = AES(K, P1_a ⊕ IV)
C1_b = AES(K, P1_b ⊕ IV)
→ C1_a ⊕ C1_b = P1_a ⊕ P1_b (평문 정보 노출!)
② 예측 불가능해야 한다 (unpredictable) 단순히 “매번 달라지는” 것만으로는 부족하다. 순차적인 카운터(0, 1, 2, 3…)를 IV로 쓰면 공격자가 다음 IV를 예측할 수 있고, 이를 이용한 공격(BEAST 공격 등)이 가능하다. IV는 반드시 암호학적으로 안전한 난수여야 한다.
③ 비밀일 필요는 없다 IV는 보통 암호문 앞에 평문으로 붙여서 수신자에게 전달한다. 공격자가 IV를 알더라도 키를 모르면 복호화할 수 없다. IV의 목적은 비밀성이 아니라 유일성(uniqueness)이다.
체이닝의 효과를 더 자세히
체이닝이 만들어내는 효과는 두 가지다.
① 동일 평문 블록 → 다른 암호문 블록 앞에서 설명한 ECB의 패턴 노출 문제가 사라진다. 같은 내용의 블록이라도 위치가 다르면 XOR되는 이전 암호문이 다르기 때문에 결과가 달라진다.
② 암호화는 순차적, 복호화는 병렬 가능 암호화할 때는 C1이 나와야 P2를 처리할 수 있으니 순서대로 해야 한다. 하지만 복호화는 다르다. Ci를 복호화할 때 필요한 건 AES_Dec(K, Ci)와 C(i-1) 두 가지인데, 이 두 가지는 이미 다 알고 있다. 그래서 복호화는 모든 블록을 동시에 병렬로 처리할 수 있다.
③ 오류 전파 블록 하나가 전송 중 손상되면, 그 블록 자체와 바로 다음 블록의 복호화가 깨진다. 그 이후 블록은 정상적으로 복호화된다. 이 특성은 양날의 검인데, 오류 탐지에는 유용하지만 오류가 다음 블록에 전파된다는 단점이기도 하다.
복호화 흐름

복호화는 암호화의 정확한 역순이다.
P1 = AES_Dec(K, C1) ⊕ IV
P2 = AES_Dec(K, C2) ⊕ C1
P3 = AES_Dec(K, C3) ⊕ C2
수신자는 IV와 키만 알면 전체 평문을 복원할 수 있다. IV는 보통 암호문 맨 앞 16바이트에 붙어서 전달된다.
패딩 (Padding)
CBC는 블록 단위로 처리하기 때문에, 마지막 블록이 128비트에 딱 맞지 않으면 채워야 한다. 이것을 패딩이라 한다. 가장 많이 쓰이는 방식은 PKCS#7으로, 부족한 바이트 수를 그 값으로 채운다.
예: 마지막 블록이 13바이트라면 부족한 3바이트를
0x03 0x03 0x03으로 채운다.
패딩은 작지만 중요한데, 잘못 구현하면 **패딩 오라클 공격(Padding Oracle Attack)**에 취약해진다. CBC의 유명한 약점 중 하나다.
CBC의 한계와 현재
CBC는 오랫동안 표준이었지만, 몇 가지 구조적 한계가 있다.
① 암호화가 순차적 — 병렬 처리 불가로 속도가 느릴 수 있다. ② 무결성 검증 없음 — CBC 자체는 데이터가 변조됐는지 알 수 없다. 암호문을 공격자가 일부 바꿔도 수신자는 모른다. 별도의 MAC(메시지 인증 코드)을 함께 써야 한다. ③ 패딩 오라클 공격 — 구현이 잘못되면 패딩 검증 결과를 이용한 복호화 공격이 가능하다.
이런 이유로 요즘은 CBC보다 **GCM(Galois/Counter Mode)**을 많이 쓴다. GCM은 암호화와 무결성 검증을 동시에 제공하고, 병렬 처리도 가능하다. TLS 1.3에서도 CBC는 제거되고 GCM 계열만 남았다.
그럼에도 CBC는 여전히 많은 레거시 시스템과 파일 암호화에서 쓰이고 있고, AES가 어떻게 실제 데이터에 적용되는지 이해하는 데 가장 좋은 출발점이다.


