2주차 스크립팅 챌린지: 시저 암호
Source: Dev.to
Source: …
Week 2 보안 챌린지: 시저 암호
💡 따라하고 계신가요? 모든 연습 문제는 오픈소스입니다! ⭐️ AppSec‑Exercises 레포지토리에 ⭐️ 를 눌러 인텔 보안팀에서 AppSec 엔지니어까지 48주 여정을 추적하세요.
“왜 2 000년 전부터 깨진 암호를 보안 엔지니어가 알아야 할까요?”
바로 Grace Nolan의 보안 인터뷰 리스트에 시저 암호와 기본 암호학이 일반적인 코딩 과제로 명시되어 있기 때문입니다. 그 의미를 살펴보겠습니다.
보안 인터뷰에서 시저 암호가 왜 나오나요?
-
문자열 조작 기본기 테스트
보안 엔지니어는 로그를 파싱하고, 악성코드를 분석하며, 네트워크 데이터를 처리합니다 – 모두 강력한 문자열 처리 능력이 필요합니다. 시저 암호는 다음을 테스트합니다:- 문자 반복
- ASCII/Unicode 조작
- 모듈러 연산
- 대소문자 유지
-
암호학 이해도 확인
면접관은 지원자가 다음을 이해했는지 확인하고 싶어합니다:- 암호화 vs. 인코딩 – 시저 암호는 대칭 암호화(키가 필요)입니다.
- 키 공간 – 가능한 키가 26개뿐 → 아주 쉽게 무차별 대입이 가능합니다.
- 빈도 분석 – 대체 암호에 대한 통계적 공격.
- 현대 암호가 존재하는 이유 – AES‑256과 같은 암호가 왜 다른지 이해.
-
실제 보안 개념의 기초
- 시프트 연산 → ROT13, XOR 연산.
- 대칭 키 → 공유 비밀 암호화.
- 암호 분석 → 약한 암호 깨기.
- 깊이 있는 방어 → 하나의 암호화 방법에만 의존하지 않는 이유.
도전 과제
기원전 58년에 율리우스 카이사르가 군사 메시지를 보호하기 위해 사용한 시저 암호는 알파벳에서 각 문자를 고정된 위치만큼 이동시킵니다.
예시
HELLO + shift(3) = KHOOR
XYZ + shift(3) = ABC (wrap‑around!)
여러분의 과제는 대소문자를 유지하면서 이 변환을 구현하고, 다양한 예외 상황을 처리하는 것입니다.
Source: …
당신의 임무: 만들기
파트 1 – 암호화
"""
Exercise 3: Caesar Cipher Encoder/Decoder
Week 2 – Python Strings Practice
Inspired by: Python Workout, Second Edition by Reuven M. Lerner
- Chapter 3 (Strings), pages 962‑1200
- Exercise 5 (Pig Latin), demonstrating string transformation
Security Context: Grace Nolan's Security Coding Challenges
Reference: Extended 48‑Week Security Engineering Curriculum, Week 90
"""
def caesar_encrypt(plaintext: str, shift: int) -> str:
"""
Caesar 암호를 사용해 텍스트를 암호화합니다.
매개변수:
plaintext: 암호화할 텍스트.
shift: 이동할 위치 수 (음수이거나 26보다 클 수 있음).
반환값:
원래 대소문자를 유지하고,
알파벳이 아닌 문자는 그대로 두는 암호화된 ciphertext.
"""
# Your code here
pass
파트 2 – 복호화
def caesar_decrypt(ciphertext: str, shift: int) -> str:
"""
Caesar 암호화된 텍스트를 복호화합니다.
매개변수:
ciphertext: 암호화된 텍스트.
shift: 암호화에 사용된 이동 위치 수.
반환값:
원래 대소문자를 유지한 복호화된 plaintext.
"""
# Your code here
pass
요구 사항
- ✅ 대소문자 유지 –
Hello→Khoor(notkhoor). - ✅ 문자 이외의 문자 유지 –
Hello, World!→Khoor, Zruog!. - ✅ 순환 처리 –
XYZ + 3→ABC. - ✅ 음수 시프트 지원 –
shift(-3)=shift(3)으로 복호화. - ✅ 모든 시프트값 지원 –
shift(26),shift(0),shift(100)포함.
샘플 테스트 케이스 (95개 중 10개)
# Test 1: Basic encryption
assert caesar_encrypt("HELLO", 3) == "KHOOR"
# Test 2: Wraparound
assert caesar_encrypt("XYZ", 3) == "ABC"
# Test 3: Mixed case preserved
assert caesar_encrypt("Hello, World!", 13) == "Uryyb, Jbeyq!"
# Test 4: Non‑alphabetic preserved
assert caesar_encrypt("test@example.com", 5) == "yjxy@jcfruqj.htr"
# Test 5: Negative shift (decrypt)
assert caesar_encrypt("KHOOR", -3) == "HELLO"
# Test 6: Decryption
assert caesar_decrypt("KHOOR", 3) == "HELLO"
# Test 7: Round‑trip
assert caesar_decrypt(caesar_encrypt("SECURITY", 7), 7) == "SECURITY"
# Test 8: ROT13 (shift 13)
assert caesar_encrypt("HELLO", 13) == "URYYB"
# Test 9: ROT13 property (apply twice = original)
assert caesar_encrypt(caesar_encrypt("Python", 13), 13) == "Python"
# Test 10: Large shift (modulo 26)
assert caesar_encrypt("HELLO", 29) == "KHOOR" # 29 % 26 = 3
Source: …
시저 암호에서 배우는 보안 교훈
교훈 1 – 무차별 대입은 쉬움
def brute_force_caesar(ciphertext: str):
"""Try all 26 possible shifts and print the results."""
for shift in range(26):
plaintext = caesar_decrypt(ciphertext, shift)
print(f"Shift {shift}: {plaintext}")
# Example
brute_force_caesar("KHOOR")
실제 사례: 키 공간이 작은 약한 비밀번호(예: 4자리 PIN = 10 000가지 경우).
교훈 2 – 빈도 분석으로 깨진다
def frequency_analysis(ciphertext: str) -> int:
"""
Estimate the shift by assuming the most common letter in English
('E') corresponds to the most common letter in the ciphertext.
"""
freq = {}
for ch in ciphertext.upper():
if ch.isalpha():
freq[ch] = freq.get(ch, 0) + 1
most_common = max(freq, key=freq.get)
likely_shift = (ord(most_common) - ord('E')) % 26
return likely_shift
실제 사례: 사이드 채널 공격, 타이밍 공격, 트래픽 분석.
교훈 3 – 보안은 은폐만으로는 실패한다
시저 암호는 시프트 값을 비밀로 유지한다는 전제에 의존한다. 시프트 값을 몰라도 쉽게 깨진다.
실제 사례:
- API 엔드포인트를 숨긴다고 보안이 확보되지 않는다.
- 코드를 난독화한다고 역공학을 막을 수 없다.
- “보안은 은폐에 의존한다”는 방어 전략은 통하지 않는다.
현대 암호가 다른 점은?
| 특징 | Caesar Cipher | AES‑256 |
|---|---|---|
| 키 공간 | 가능한 키 26개 | 가능한 키 2²⁵⁶개 |
| 무차별 대입 공격에 대한 저항 | 사소함 (몇 초) | 현재 기술로는 실질적으로 불가능 |
| 빈도 분석에 대한 저항 | 없음 (단순 치환) | 강함 (혼돈 및 확산) |
| 사용 사례 | 교육용 / 장난감 | 실제 데이터 보호 |
코딩을 즐기세요, 그리고 여러분의 시프트가 언제나 정확하기를 바랍니다!
Possible Keys
-
주파수 분석
-
알려진 평문 공격에 대한 저항성
-
같은 문자 → 같은 출력
-
CBC/GCM 모드는 패턴을 방지합니다
-
몇 초 만에 깨짐
-
계산적으로 깨기 불가능
인터뷰 후속 질문
Be prepared to answer:
Q: “시프트를 모른 채 이 암호를 어떻게 풀 수 있나요?”
A:
- 모든 26개의 시프트를 무차별 대입한다.
- 영어 문자 빈도와 비교하는 빈도 분석을 수행한다.
Q: “Caesar 암호와 XOR 암호의 차이점은 무엇인가요?”
A: 둘 다 대칭 암호이지만, XOR은 이진 연산을 사용하고 가변 길이 키를 사용할 수 있다.
Q: “왜 ROT13을 특수한 경우라고 부르나요?”
A: 13칸 시프트는 자체 역함수이며: encrypt(encrypt(x)) = x 왜냐하면 13 + 13 = 26 ≡ 0 (mod 26)이기 때문이다.
Q: “Unicode/이모지를 지원하도록 이 방법을 어떻게 확장할 수 있나요?”
A: 서로 다른 코드 포인트 범위를 처리하거나 모듈러 연산 대신 조회 테이블을 사용한다.
실제 적용 사례 (역사적)
1. ROT13 (오늘도 사용됨!)
# Hide spoilers on forums, email, Usenet
rot13 = lambda s: caesar_encrypt(s, 13)
print(rot13("Darth Vader is Luke's father"))
# → "Qnegu Inqre vf Yhxr'f sngure"
2. 간단한 난독화
# Hide config values (NOT secure, just obscured)
api_key = caesar_encrypt("secret_key_12345", 7)
# Decode when needed
real_key = caesar_decrypt(api_key, 7)
경고: 실제 보안에 시저 암호를 절대 사용하지 마세요!
연습할 파이썬 기술
From Python Workout – Chapter 3 (pages 962‑1200):
- ✅ 문자열 반복 –
for char in text - ✅ 문자 검사 –
.isalpha(),.isupper(),.islower() - ✅ ASCII 변환 –
ord(),chr() - ✅ 문자열 생성 – concatenation vs. list joining
- ✅ 모듈러 연산 –
(x + shift) % 26
From Grace Nolan’s Interview Prep:
- ✅ 알고리즘적 사고 – shift operations
- ✅ 예외 상황 처리 – empty strings, special characters
- ✅ 코드 가독성 – clean, readable implementation
- ✅ 테스트 마인드셋 – comprehensive test coverage
다음 단계: 암호 깨기
1. 암호 해독 도구 만들기
def crack_caesar(ciphertext):
"""
Automatically crack Caesar cipher using:
1. Brute force (try all 26 shifts)
2. Frequency analysis
3. Dictionary matching (check if result contains English words)
"""
pass
2. 비제네르 암호로 확장하기
다중 문자 키: HELLO에 키 ABC 적용 → HFNLP
- 키 반복: H+A, E+B, L+C, L+A, O+B
- 시저 암호보다 더 안전하지만 여전히 깨질 수 있음!
3. 현대 암호와 비교하기
간단한 XOR 암호를 구현한 뒤 다음을 조사합니다:
- 무작위 키(일회용 패드)와 함께 사용하는 XOR이 이론적으로 깨지지 않는 이유.
- 키를 재사용하면 XOR이 깨지는 이유.
- AES가 대체 암호와 어떻게 다른지.
리소스
암호학
- “The Code Book” by Simon Singh – 암호학의 훌륭한 역사.
- “Cryptography Engineering” by Ferguson, Schneier, Kohno – 현대 암호학.
- Stanford Cryptography I (Coursera) – Dan Boneh의 강의.
파이썬 문자열 조작
- Python Workout, Second Edition by Reuven M. Lerner – 3장 (페이지 962‑1200).
- Effective Python by Brett Slatkin – 항목 11: 시퀀스 슬라이싱.
보안 면접 준비
- Grace Nolan’s Notes (GitHub:
gracenolan/Notes). - “Cracking the Coding Interview” – 보안 중심 문제.
- PortSwigger Web Security Academy – 현대 암호 취약점.
전체 연습 문제 받기
⭐ GitHub에서 AppSec‑Exercises 저장소에 스타를 눌러 95개의 테스트 케이스를 모두 받고 내 보안 엔지니어링 여정을 따라가세요!
저장소에 포함된 내용:
exercise_03_caesar_cipher.py– 95개의 테스트 케이스가 포함된 전체 연습 문제.- 내 솔루션 – 상세 코드가 포함된 전체 구현.
- 48주 커리큘럼에 맞춘 주간 보안 챌린지.
- 면접 준비에 최적화된 LeetCode 스타일 포맷.
왜 스타를 눌러야 할까요?
- Intel Security → AppSec Engineer로의 나의 성장 과정을 추적할 수 있습니다.
- 새로운 연습 문제가 매주 추가될 때 알림을 받을 수 있습니다.
- 직접 솔루션과 테스트 케이스를 기여할 수 있습니다.
- 나와 함께 포트폴리오를 구축하세요.
모든 연습 문제는 MIT 라이선스로 제공됩니다 – 면접 준비에 자유롭게 활용하세요!
나의 진행 상황: 48주 중 2주차
- ✅ DNS 기본
- ✅ TLS/SSL 보안
- ✅ 파이썬 워크아웃 챕터 3‑4 (문자열, 리스트)
- ✅ 8개의 PortSwigger SQL 인젝션 실습
- 🔄 현재: 시저 암호 + 암호 스위트 분석기
- 📚 Grace Nolan의 코딩 챌린지: 1/10 완료
목표: 2026년 6월까지 AppSec 엔지니어로 전환
⭐ GitHub에서 내 여정을 팔로우하세요 – 매주 새로운 연습문제!
큰 그림
시저 암호가 깨지는 이유를 이해하면 다음을 배울 수 있습니다:
- ✅ 암호학을 안전하게 만드는 요소(키 공간, 공격에 대한 저항성)를 인식한다.
- ✅ 공격자처럼 생각한다(빈도 분석, 무차별 대입).
- ✅ 직접 암호를 구현하지 않는 이유를 이해한다(검증된 알고리즘 사용).
- ✅ 현대 암호학(AES, RSA, 타원곡선)의 기반을 다진다.
5주차에는 실제 암호학을 다룰 것입니다: AES, RSA, bcrypt/Argon2를 이용한 비밀번호 해싱, 그리고 취약점을 초래하는 실수들.
지금은 깨진 것을 직접 만들어 기본을 마스터하고, 왜 깨졌는지 배우세요.
🚀 행동하기
- ⭐ GitHub에서 AppSec‑Exercises에 스타 달기 – 매주 보안 코딩 챌린지를 받아보세요.
- 💬 댓글 달기 – 인터뷰에서 시저 암호를 본 적 있나요? 다른 “깨진” 보안 개념은 무엇이 있나요?
- 🔔 팔로우하기 on Dev.to and GitHub for my full 48‑week journey.
현재 찾고 있는 직무: 원격 보안 엔지니어링 역할
Tags
Python #Security #Cryptography #Interview #CyberSecurity #AppSec