
필기 상단의 그림은 AES와 같은 블록 암호가 데이터를 처리하는 기본적인 데이터 패스(Data path)를 보여줍니다.
필기의 중간 부분은 블록 암호가 단순히 데이터를 숨기는(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)하는 태그를 생성하는 데 사용됩니다.
이 필기의 핵심 결론입니다. 128비트짜리 블록 암호 모듈 하나만으로는 기가바이트 단위의 큰 파일을 안전하게 암호화하거나, 앞서 언급한 스트림 암호, MAC 등의 Task를 수행할 수 없습니다.
따라서 수많은 데이터 블록을 어떤 순서와 방식으로 엮어서 암호화할 것인가에 대한 규칙이 필요한데, 이것이 바로 운용 모드(Modes of Operation)입니다.
하드웨어 설계 관점에서 이 운용 모드의 선택은 시스템의 전체 성능(Throughput)을 좌우하는 매우 중요한 요소입니다. 예를 들어:
CBC (Cipher Block Chaining) 모드: 이전 블록의 암호화 결과가 다음 블록 암호화에 들어가야 하므로 데이터 의존성이 생깁니다. 따라서 파이프라이닝을 통한 병렬 처리가 어렵습니다.
CTR (Counter) 모드: 필기에서 언급된 'Stream cipher'를 구현하는 대표적인 모드입니다. 각 블록을 독립적으로 암호화할 수 있어, FPGA 등에서 연산 모듈을 여러 개 인스턴스화하여 병렬 처리(Parallelism)를 극대화하기 매우 좋습니다.

첫 번째 필기 상단에서는 암호화 방식을 두 가지로 나눕니다.
Deterministic Encry. (결정론적 암호화): 대표적으로 ECB 모드가 있습니다.
(Electronic Code Book) 이는 "동일한 평문이 들어가면 항상 동일한 암호문이 나온다"는 뜻입니다.
Probabilistic Encry. (확률론적 암호화): CBC나 OFB 모드 등이 있습니다. 이 방식들은 암호화할 때마다 난수나 이전 블록의 결과를 섞기 때문에, 똑같은 평문을 암호화해도 매번 다른 암호문이 나옵니다. 현대 암호학에서는 안전성을 위해 반드시 이 방식을 사용해야 합니다.
ECB 모드는 가장 단순한 운용 모드입니다. 긴 평문을 블록 단위(DES는 64비트, AES는 128비트)로 자른 뒤, 각각의 블록을 독립적으로 암호화 키()를 이용해 암호화합니다.

필기의 핵심인 두 번째 장은 악의적인 공격자 'Trudy(트루디)'가 ECB 모드의 독립성을 악용하여 어떻게 돈을 훔치는지 보여주는 고전적이고 유명한 시나리오입니다.
[상황 가정]
은행 A와 은행 B는 라는 비밀키를 공유하며 인터넷을 통해 송금 데이터를 주고받습니다. 송금 메시지는 정확히 블록 크기( bits)와 일치하는 5개의 블록으로 구성됩니다.
BL1: 송신 은행 (Bank A)
BL2: 송신자 계좌번호 ()
BL3: 수신 은행 (Bank B)
BL4: 수신자 계좌번호 () 이 부분이 공격 목표입니다.
BL5: 송금액 (Amount)
[Trudy의 공격 단계]
준비 (a): Trudy는 은행 A와 은행 B에 각각 자신의 계좌를 개설합니다.
트래픽 분석 (Traffic Analysis) (b): Trudy는 자신의 은행 A 계좌에서 은행 B 계좌로 아주 적은 금액()을 반복적으로(Repeatedly) 송금합니다.
암호문 블록 수집 (c): Trudy는 인터넷망을 도청(wiretaps)하여 자신이 송금할 때 발생하는 암호문 데이터를 관찰합니다. 여러 번 송금하면서 변하지 않는 특정한 암호문 패턴을 찾아냅니다. 특히 자신의 은행 B 계좌번호가 암호화된 4번째 블록(encrypted Block BL4)을 찾아내어 복사해 저장(stores)해 둡니다. (ECB 모드이므로 Trudy의 계좌번호는 항상 똑같은 암호문으로 변환됩니다.)
블록 치환 공격 (d): 이제 Trudy는 은행 A에서 은행 B로 가는 다른 사람들의 거액 송금 트래픽을 지켜봅니다. 누군가 송금을 할 때, 그 암호문 메시지를 가로채어 원래 수신자의 4번째 블록(BL4)을 빼버리고, 아까 3번 단계에서 저장해둔 'Trudy 자신의 계좌번호 암호문 블록(her BL4)'으로 쓱 바꿔치기(Replace) 합니다.
[공격의 결과]
은행 B는 조작된 암호문을 받아서 복호화합니다. ECB 모드는 각 블록이 독립적이라 4번째 블록이 바뀌었다고 해서 에러가 나지 않습니다. 복호화 결과, 수신자 계좌번호 칸에 Trudy의 계좌번호가 멀쩡하게 튀어나오게 됩니다. 결국 모든 송금액이 Trudy의 계좌로 입금되는 끔찍한 결과가 초래됩니다.
"블록 암호를 쓸 때 ECB 모드를 절대 쓰면 안 되는 이유"를 완벽하게 증명하고 있습니다. 암호화 알고리즘(AES 자체)이 아무리 강력해도, 암호화된 블록들을 안전하게 연결해주는 운용 모드(CBC, CTR 등)나 메시지 인증 코드(MAC)가 없으면 이처럼 간단한 블록 바꿔치기(Replay/Substitution)만으로도 시스템이 붕괴될 수 있다는 암호학의 중요한 교훈을 담고 있습니다.

필기 상단의 "Note" 부분은 이전의 '은행 송금 조작 공격(Trudy의 공격)'이 남긴 중요한 교훈을 정리하고 있습니다.
이를 해결하기 위해 CBC (Cipher Block Chaining) 모드가 등장합니다. CBC의 핵심 목표는 두 가지입니다.
무작위성(Randomness) 부여: 암호화 과정을 확률론적(Probabilistic)으로 만들어, 똑같은 평문이 들어가도 매번 다른 암호문이 나오게 합니다.
블록 간의 결합(Combine encryption of all blocks): 각 블록을 독립적으로 처리하지 않고, 앞 블록의 암호화 결과가 뒤 블록에 영향을 미치도록 사슬(Chain)처럼 엮습니다.
필기 하단의 그림처럼, 단순한 ECB는 가 바로 로 변환되지만, CBC는 (무작위성 요소)가 추가되어 결과를 예측할 수 없게 만듭니다.

두 번째 필기는 CBC 모드의 실제 데이터 패스와 수식을 완벽하게 보여줍니다. 여기서 중요한 구성 요소는 IV (Initial Vector, 초기화 벡터)입니다.
[암호화 과정 (Encryption)]
각 블록을 암호화하기 전에, 이전 블록의 암호문()과 현재 평문()을 먼저 XOR() 연산합니다.
하지만 첫 번째 평문 블록()은 짝지어줄 '이전 암호문'이 없습니다. 이때 사용하는 것이 바로 IV (초기화 벡터)입니다.
이렇게 되면 설령 똑같은 메시지를 여러 번 전송하더라도, 매번 다른 IV를 사용하면 완전히 다른 암호문 스트림이 생성되어 앞선 Trudy의 공격(패턴 수집)을 완벽히 방어할 수 있습니다.
[복호화 과정 (Decryption)]
복호화는 암호화의 역순으로 진행됩니다. 수신받은 암호문()을 먼저 복호화 알고리즘()에 통과시킨 뒤, 이전 블록의 암호문()과 XOR 하여 원래의 평문()을 얻습니다.
[IV (Initial Vector)의 중요 규칙]필기 하단에 IV를 다루는 매우 중요한 보안 규칙이 적혀 있습니다.
한 번만 사용할 것 (should be used only once): 동일한 키로 암호화할 때 동일한 IV가 재사용되면 확률론적 암호화의 의미가 퇴색됩니다. 카운터 값이나 송수신자 ID+시간 조합 등을 사용하여 매번 다르게 생성해야 합니다.
공개되어도 무방함 (IV can be public): IV는 키()가 아닙니다. 수신자도 복호화를 하려면 어떤 IV가 쓰였는지 알아야 하므로, 암호문과 함께 평문 형태로 그냥 전송해도 보안상 문제가 없습니다. (Trudy가 IV 값을 알아도 키가 없으면 암호문을 풀 수 없습니다).