한양과학기술고등학교

에듀테크 프로젝트 대시보드

고전 암호 (Classical Ciphers)

고전 암호 Classical Ciphers

컴퓨터가 없던 시절, 사람들은 알파벳을 밀거나 바꿔치기하는 방법으로 비밀을 지켰다. 시저 암호와 비주네르 암호를 직접 돌려 보고, 왜 이 방식들이 빈도 분석 앞에서 무너지는지 확인해 보자. 이 실습은 현대 암호(RSA·AES)가 왜 그런 모양이 되었는지를 이해하는 출발점이다.

01 · Substitution

시저 암호 (Caesar Cipher) — 알파벳을 k칸 민다

각 글자를 알파벳에서 k칸 뒤로 옮긴다. E(x) = (x + k) mod 26, 복호화는 D(x) = (x − k) mod 26. 키는 0~25 중 하나뿐이라 경우의 수가 25가지밖에 안 된다 — 전부 시도해 보면 바로 풀린다(brute force).

3
—

ROT13은 k=13인 시저 암호다. 13은 26의 절반이라 암호화와 복호화가 같은 연산이 된다 — 그래서 온라인에서 스포일러를 가릴 때 아직도 쓰인다.

02 · Polyalphabetic

비주네르 암호 (Vigenère Cipher) — 키워드로 자리마다 다르게 민다

키워드의 각 글자(A=0, B=1, …)만큼 평문을 민다. 키워드가 KEY라면 1번째 글자는 10칸, 2번째는 4칸, 3번째는 24칸… 그리고 다시 반복. 같은 평문 글자라도 위치에 따라 다른 암호문 글자가 되므로 단순 빈도 분석이 먹히지 않는다. 300년 가까이 "깰 수 없는 암호(le chiffre indéchiffrable)"로 불렸다.

—

키워드가 길수록(그리고 반복이 없을수록) 안전하다. 키가 평문만큼 길고 완전히 무작위이며 한 번만 쓰이면 그것이 일회용 패드(One-Time Pad) — 수학적으로 절대 깰 수 없는 유일한 암호다. 문제는 그 긴 키를 어떻게 안전하게 나눠 갖느냐인데, 그 답이 바로 디피–헬만 키 교환과 공개키 암호다.

03 · Cryptanalysis

빈도 분석 (Frequency Analysis) — 통계로 시저 암호를 자동으로 깬다

영어에서 E는 약 12.7%, T는 9.1%로 압도적으로 자주 나온다. 시저 암호는 이 분포를 통째로 k칸 회전시킬 뿐이다. 그래서 암호문의 글자 분포를 26가지로 되돌려 보고, 영어의 기대 분포와 가장 비슷한 것(카이제곱 통계량 χ²이 가장 작은 것)을 고르면 키가 튀어나온다.

암호문 분포 영어 기대 분포

04 · Code

파이썬 12줄로 보는 핵심

# 시저 암호 def caesar(text, k): return ''.join( chr((ord(c) - 65 + k) % 26 + 65) if c.isalpha() else c for c in text.upper()) # 빈도 분석으로 k 찾기 (영어 기준) EN = [.082,.015,.028,.043,.127,.022,.020,.061,.070,.002,.008,.040,.024, .067,.075,.019,.001,.060,.063,.091,.028,.010,.024,.002,.020,.001] def crack(cipher): counts = [cipher.upper().count(chr(65+i)) for i in range(26)] n = sum(counts) or 1 def chi2(k): return sum((counts[(i+k) % 26]/n - EN[i])**2 / EN[i] for i in range(26)) return min(range(26), key=chi2) # 가장 영어다운 회전

관련 학습: 공개키 암호화 · 디피–헬만 키 교환 · 블록 암호 운용 모드 · 문자 인코딩