Crypto ★★★☆☆ 소요시간: 25분 작성일: 2026.07.02

04. 대칭키 암호 (Symmetric Ciphers)

1. 혼돈(Confusion)과 확산(Diffusion)

클로드 섀넌(Claude Shannon)이 제안한 안전한 암호의 두 가지 핵심 원리입니다.

  • 혼돈 (Confusion): 암호문과 키(Key) 사이의 관계를 복잡하게 만드는 성질. 주로 치환(Substitution) 함수를 통해 구현됩니다.
  • 확산 (Diffusion): 평문의 통계적 성질(예: 알파벳 빈도수)이 암호문 전반에 흩어지게 만드는 성질. 한 비트의 평문 변화가 암호문 전체에 영향을 미치게 합니다. 주로 순열(Permutation) 연산으로 구현됩니다.

2. 블록 암호 (Block Ciphers): DES와 AES

평문을 일정한 크기의 '블록(Block)' 단위로 나누어 암호화하는 방식입니다.

Data Encryption Standard (DES)

1970년대 IBM이 개발하고 미국 표준으로 채택된 암호 알고리즘입니다. 64비트 블록 크기와 56비트 키 길이를 가지며, Feistel 구조를 사용합니다. 현재는 키 길이가 너무 짧아(56비트) 전수 조사(Brute-force) 공격에 의해 몇 시간 안에 해독되므로 사용되지 않습니다.

[Wikipedia: DES (Data Encryption Standard)]

Advanced Encryption Standard (AES)

DES를 대체하기 위해 공모전을 거쳐 채택된 Rijndael 알고리즘입니다. 128비트 블록 크기를 지원하며, 키 길이는 128, 192, 256비트 중 선택 가능합니다. Feistel 구조가 아닌 SPN (Substitution-Permutation Network) 구조를 취하며, 현재 전 세계에서 가장 널리 쓰이는 표준입니다.

[Wikipedia: AES (Advanced Encryption Standard)]

3. AES 암호화 예제 (Python)


from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os

# 256-bit (32 bytes) 랜덤 키 생성
key = os.urandom(32)
# CBC 모드를 위한 16 bytes 초기화 벡터(IV) 생성
iv = os.urandom(16)

# AES-CBC Cipher 객체 생성
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()

# 암호화 (데이터는 16바이트 배수여야 함)
plaintext = b"a secret message"
ciphertext = encryptor.update(plaintext) + encryptor.finalize()
print(f"Ciphertext: {ciphertext.hex()}")
        

4. 블록 암호 운영 모드 (Modes of Operation)

블록 암호는 정해진 크기(예: AES의 경우 16바이트)의 데이터만 암호화할 수 있습니다. 그보다 긴 데이터를 암호화하기 위해 여러 블록을 어떻게 연결할 것인지 정의한 것이 운영 모드입니다.

[Wikipedia: Block cipher mode of operation]

ECB (Electronic Codebook) 모드

가장 단순한 모드입니다. 각 블록을 독립적으로 암호화합니다. 동일한 평문 블록은 항상 동일한 암호문 블록을 생성한다는 치명적인 단점이 있어, 이미지와 같은 데이터에 적용하면 원본의 윤곽이 그대로 드러납니다.

CBC (Cipher Block Chaining) 모드

이전 블록의 암호문과 현재 블록의 평문을 XOR 연산한 뒤 암호화합니다. 최초의 블록을 위해서는 IV (Initialization Vector)가 필요합니다. 동일한 평문이라도 다른 암호문이 생성되어 보안성이 높습니다.

graph TD; P1[Plaintext Block 1] --> XOR1((XOR)); IV[IV] --> XOR1; XOR1 --> E1[AES Encryption]; Key[(Key)] --> E1; E1 --> C1[Ciphertext Block 1]; P2[Plaintext Block 2] --> XOR2((XOR)); C1 --> XOR2; XOR2 --> E2[AES Encryption]; Key --> E2; E2 --> C2[Ciphertext Block 2];

5. Interactive: ECB vs CBC 작동 방식 비교

아래 애니메이션은 동일한 AAAA 평문 블록이 두 개 연속으로 주어졌을 때, ECB 모드와 CBC 모드가 어떻게 다른 결과를 내는지 보여줍니다.

ECB vs CBC 모드 비교

ECB Mode

AAAA
AAAA
X7X7
X7X7

CBC Mode

AAAA
AAAA
X7X7
Z9Y2
"비교 시작" 버튼을 누르세요.