Block Ciphers , ECB, CBC

Seungyun Lee·2026년 2월 17일

Cybersecurity

목록 보기
7/13

블록 암호의 기본구조

블록 암호의 기본 구조 (상단 다이어그램)

필기 상단의 그림은 AES와 같은 블록 암호가 데이터를 처리하는 기본적인 데이터 패스(Data path)를 보여줍니다.

  • 입력 (Plaintext): 암호화할 긴 데이터가 있을 때, 이를 128비트 단위의 고정된 크기인 블록(x1,x2,x_1, x_2, \dots)으로 자릅니다.
  • 암호화 알고리즘 (ee): 128비트 키 KK를 사용하여 각 평문 블록을 암호화합니다. 그림 우측에 예시로 'AES'가 적혀 있듯, AES가 바로 이 ee에 해당하는 대표적인 128비트 블록 암호입니다.
  • 출력 (Ciphertext): 암호화 과정을 거치면 동일하게 128비트 크기를 가진 암호문 블록(y1,y2,y_1, y_2, \dots)이 출력됩니다.

Some other Tasks?" (블록 암호의 응용)

필기의 중간 부분은 블록 암호가 단순히 데이터를 숨기는(Encryption) 용도를 넘어, 암호학적 시스템을 구축하는 핵심 구성 요소(Building Block)로 사용될 수 있음을 나타냅니다.

  • Different encryption schemes & stream cipher: 형광펜으로 칠해진 부분입니다. 128비트 단위로 묶어서 처리하는 블록 암호를 특정 방식으로 변형하면, 데이터가 1비트나 1바이트 단위로 끊임없이 흘러들어오는 환경에 적합한 '스트림 암호(Stream Cipher)'처럼 사용할 수 있습니다.

  • PRNG (Pseudo-Random Number Generator): 블록 암호의 복잡한 연산 과정을 이용해 암호학적으로 안전하고 예측 불가능한 난수를 생성할 수 있습니다.

  • Hash func. (해시 함수): 데이터의 무결성을 검증하기 위해 파일의 고정된 길이의 '지문'을 만드는 데 블록 암호를 활용할 수 있습니다.

  • MAC (Message Authentication Code): 메시지가 전송 도중 변조되지 않았고, 신뢰할 수 있는 송신자로부터 왔음을 인증(Authentication)하는 태그를 생성하는 데 사용됩니다.

Modes of operations (운용 모드)

이 필기의 핵심 결론입니다. 128비트짜리 블록 암호 모듈 하나만으로는 기가바이트 단위의 큰 파일을 안전하게 암호화하거나, 앞서 언급한 스트림 암호, MAC 등의 Task를 수행할 수 없습니다.

따라서 수많은 데이터 블록을 어떤 순서와 방식으로 엮어서 암호화할 것인가에 대한 규칙이 필요한데, 이것이 바로 운용 모드(Modes of Operation)입니다.

하드웨어 설계 관점에서 이 운용 모드의 선택은 시스템의 전체 성능(Throughput)을 좌우하는 매우 중요한 요소입니다. 예를 들어:

  • CBC (Cipher Block Chaining) 모드: 이전 블록의 암호화 결과가 다음 블록 암호화에 들어가야 하므로 데이터 의존성이 생깁니다. 따라서 파이프라이닝을 통한 병렬 처리가 어렵습니다.

  • CTR (Counter) 모드: 필기에서 언급된 'Stream cipher'를 구현하는 대표적인 모드입니다. 각 블록을 독립적으로 암호화할 수 있어, FPGA 등에서 연산 모듈을 여러 개 인스턴스화하여 병렬 처리(Parallelism)를 극대화하기 매우 좋습니다.

1. 운용 모드의 분류 (Deterministic vs. Probabilistic)

첫 번째 필기 상단에서는 암호화 방식을 두 가지로 나눕니다.

  • Deterministic Encry. (결정론적 암호화): 대표적으로 ECB 모드가 있습니다.
    (Electronic Code Book) 이는 "동일한 평문이 들어가면 항상 동일한 암호문이 나온다"는 뜻입니다.

  • Probabilistic Encry. (확률론적 암호화): CBC나 OFB 모드 등이 있습니다. 이 방식들은 암호화할 때마다 난수나 이전 블록의 결과를 섞기 때문에, 똑같은 평문을 암호화해도 매번 다른 암호문이 나옵니다. 현대 암호학에서는 안전성을 위해 반드시 이 방식을 사용해야 합니다.

2. ECB(Electronic Code Book) 모드의 구조와 치명적 단점

ECB 모드는 가장 단순한 운용 모드입니다. 긴 평문을 블록 단위(DES는 64비트, AES는 128비트)로 자른 뒤, 각각의 블록을 독립적으로 암호화 키(KK)를 이용해 암호화합니다.

  • 장점: 각 블록이 독립적이므로 병렬 처리가 쉽고 속도가 빠릅니다.
  • 단점 (치명적): 앞서 말한 '결정론적' 특성 때문에 데이터의 패턴이 그대로 노출됩니다. 블록 간의 연관성이 없어서 누군가 중간에 특정 암호문 블록을 빼거나 다른 블록으로 바꿔치기해도 수신자는 그 사실을 알아채기 어렵습니다.

3. ECB 공격 시나리오: 은행 간 전자 송금 (Electronic Funds Transfer)

필기의 핵심인 두 번째 장은 악의적인 공격자 'Trudy(트루디)'가 ECB 모드의 독립성을 악용하여 어떻게 돈을 훔치는지 보여주는 고전적이고 유명한 시나리오입니다.

[상황 가정]
은행 A와 은행 B는 KABK_{AB}라는 비밀키를 공유하며 인터넷을 통해 송금 데이터를 주고받습니다. 송금 메시지는 정확히 블록 크기(nn bits)와 일치하는 5개의 블록으로 구성됩니다.
BL1: 송신 은행 (Bank A)
BL2: 송신자 계좌번호 (AIA_I)
BL3: 수신 은행 (Bank B)
BL4: 수신자 계좌번호 (BIB_I) \leftarrow 이 부분이 공격 목표입니다.
BL5: 송금액 (Amount)

[Trudy의 공격 단계]

  1. 준비 (a): Trudy는 은행 A와 은행 B에 각각 자신의 계좌를 개설합니다.

  2. 트래픽 분석 (Traffic Analysis) (b): Trudy는 자신의 은행 A 계좌에서 은행 B 계좌로 아주 적은 금액(11)을 반복적으로(Repeatedly) 송금합니다.

  3. 암호문 블록 수집 (c): Trudy는 인터넷망을 도청(wiretaps)하여 자신이 송금할 때 발생하는 암호문 데이터를 관찰합니다. 여러 번 송금하면서 변하지 않는 특정한 암호문 패턴을 찾아냅니다. 특히 자신의 은행 B 계좌번호가 암호화된 4번째 블록(encrypted Block BL4)을 찾아내어 복사해 저장(stores)해 둡니다. (ECB 모드이므로 Trudy의 계좌번호는 항상 똑같은 암호문으로 변환됩니다.)

  4. 블록 치환 공격 (d): 이제 Trudy는 은행 A에서 은행 B로 가는 다른 사람들의 거액 송금 트래픽을 지켜봅니다. 누군가 송금을 할 때, 그 암호문 메시지를 가로채어 원래 수신자의 4번째 블록(BL4)을 빼버리고, 아까 3번 단계에서 저장해둔 'Trudy 자신의 계좌번호 암호문 블록(her BL4)'으로 쓱 바꿔치기(Replace) 합니다.

[공격의 결과]
은행 B는 조작된 암호문을 받아서 복호화합니다. ECB 모드는 각 블록이 독립적이라 4번째 블록이 바뀌었다고 해서 에러가 나지 않습니다. 복호화 결과, 수신자 계좌번호 칸에 Trudy의 계좌번호가 멀쩡하게 튀어나오게 됩니다. 결국 모든 송금액이 Trudy의 계좌로 입금되는 끔찍한 결과가 초래됩니다.

"블록 암호를 쓸 때 ECB 모드를 절대 쓰면 안 되는 이유"를 완벽하게 증명하고 있습니다. 암호화 알고리즘(AES 자체)이 아무리 강력해도, 암호화된 블록들을 안전하게 연결해주는 운용 모드(CBC, CTR 등)메시지 인증 코드(MAC)가 없으면 이처럼 간단한 블록 바꿔치기(Replay/Substitution)만으로도 시스템이 붕괴될 수 있다는 암호학의 중요한 교훈을 담고 있습니다.

ECB 공격의 시사점과 확률론적 암호화

필기 상단의 "Note" 부분은 이전의 '은행 송금 조작 공격(Trudy의 공격)'이 남긴 중요한 교훈을 정리하고 있습니다.

  • Trudy는 암호화 알고리즘 자체(e()e(\cdot), 즉 AES)를 해킹한 것이 아닙니다.
  • 문제는 평문과 암호문이 1대1 매핑(One-to-one mapping) 되는 ECB 모드의 결정론적(Deterministic) 특성이었습니다. 똑같은 입력이 항상 똑같은 출력을 만들기 때문에 패턴이 노출된 것입니다.

이를 해결하기 위해 CBC (Cipher Block Chaining) 모드가 등장합니다. CBC의 핵심 목표는 두 가지입니다.

  1. 무작위성(Randomness) 부여: 암호화 과정을 확률론적(Probabilistic)으로 만들어, 똑같은 평문이 들어가도 매번 다른 암호문이 나오게 합니다.

  2. 블록 간의 결합(Combine encryption of all blocks): 각 블록을 독립적으로 처리하지 않고, 앞 블록의 암호화 결과가 뒤 블록에 영향을 미치도록 사슬(Chain)처럼 엮습니다.

필기 하단의 그림처럼, 단순한 ECB는 xx가 바로 yy로 변환되지만, CBC는 τ\tau(무작위성 요소)가 추가되어 결과를 예측할 수 없게 만듭니다.

CBC (Cipher Block Chaining) 모드의 동작 원리와 수식

두 번째 필기는 CBC 모드의 실제 데이터 패스와 수식을 완벽하게 보여줍니다. 여기서 중요한 구성 요소는 IV (Initial Vector, 초기화 벡터)입니다.

[암호화 과정 (Encryption)]
각 블록을 암호화하기 전에, 이전 블록의 암호문(yi1y_{i-1})과 현재 평문(xix_i)을 먼저 XOR(\oplus) 연산합니다.

yi=eK(xiyi1)(단, i2)y_i = e_K(x_i \oplus y_{i-1}) \quad (\text{단, } i \ge 2)

하지만 첫 번째 평문 블록(x1x_1)은 짝지어줄 '이전 암호문'이 없습니다. 이때 사용하는 것이 바로 IV (초기화 벡터)입니다.

y1=eK(x1IV)y_1 = e_K(x_1 \oplus IV)

이렇게 되면 설령 똑같은 메시지를 여러 번 전송하더라도, 매번 다른 IV를 사용하면 완전히 다른 암호문 스트림이 생성되어 앞선 Trudy의 공격(패턴 수집)을 완벽히 방어할 수 있습니다.

[복호화 과정 (Decryption)]
복호화는 암호화의 역순으로 진행됩니다. 수신받은 암호문(yiy_i)을 먼저 복호화 알고리즘(eK1e_K^{-1})에 통과시킨 뒤, 이전 블록의 암호문(yi1y_{i-1})과 XOR 하여 원래의 평문(xix_i)을 얻습니다.

x1=eK1(y1)IVx_1 = e_K^{-1}(y_1) \oplus IV
xi=eK1(yi)yi1(단, i2)x_i = e_K^{-1}(y_i) \oplus y_{i-1} \quad (\text{단, } i \ge 2)

[IV (Initial Vector)의 중요 규칙]필기 하단에 IV를 다루는 매우 중요한 보안 규칙이 적혀 있습니다.

  1. 한 번만 사용할 것 (should be used only once): 동일한 키로 암호화할 때 동일한 IV가 재사용되면 확률론적 암호화의 의미가 퇴색됩니다. 카운터 값이나 송수신자 ID+시간 조합 등을 사용하여 매번 다르게 생성해야 합니다.

  2. 공개되어도 무방함 (IV can be public): IV는 키(KK)가 아닙니다. 수신자도 복호화를 하려면 어떤 IV가 쓰였는지 알아야 하므로, 암호문과 함께 평문 형태로 그냥 전송해도 보안상 문제가 없습니다. (Trudy가 IV 값을 알아도 키가 없으면 암호문을 풀 수 없습니다).

profile
RTL, FPGA Engineer

0개의 댓글