2주차 스크립팅 챌린지: 시저 암호

발행: (2025년 12월 26일 오전 05:59 GMT+9)
15 min read
원문: Dev.to

Source: Dev.to

Source:

Week 2 보안 챌린지: 시저 암호

💡 따라하고 계신가요? 모든 연습 문제는 오픈소스입니다! ⭐️ AppSec‑Exercises 레포지토리에 ⭐️ 를 눌러 인텔 보안팀에서 AppSec 엔지니어까지 48주 여정을 추적하세요.

“왜 2 000년 전부터 깨진 암호를 보안 엔지니어가 알아야 할까요?”
바로 Grace Nolan의 보안 인터뷰 리스트시저 암호와 기본 암호학이 일반적인 코딩 과제로 명시되어 있기 때문입니다. 그 의미를 살펴보겠습니다.

보안 인터뷰에서 시저 암호가 왜 나오나요?

  1. 문자열 조작 기본기 테스트
    보안 엔지니어는 로그를 파싱하고, 악성코드를 분석하며, 네트워크 데이터를 처리합니다 – 모두 강력한 문자열 처리 능력이 필요합니다. 시저 암호는 다음을 테스트합니다:

    • 문자 반복
    • ASCII/Unicode 조작
    • 모듈러 연산
    • 대소문자 유지
  2. 암호학 이해도 확인
    면접관은 지원자가 다음을 이해했는지 확인하고 싶어합니다:

    • 암호화 vs. 인코딩 – 시저 암호는 대칭 암호화(키가 필요)입니다.
    • 키 공간 – 가능한 키가 26개뿐 → 아주 쉽게 무차별 대입이 가능합니다.
    • 빈도 분석 – 대체 암호에 대한 통계적 공격.
    • 현대 암호가 존재하는 이유 – AES‑256과 같은 암호가 왜 다른지 이해.
  3. 실제 보안 개념의 기초

    • 시프트 연산 → 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

요구 사항

  • 대소문자 유지HelloKhoor (not khoor).
  • 문자 이외의 문자 유지Hello, World!Khoor, Zruog!.
  • 순환 처리XYZ + 3ABC.
  • 음수 시프트 지원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 CipherAES‑256
키 공간가능한 키 26개가능한 키 2²⁵⁶개
무차별 대입 공격에 대한 저항사소함 (몇 초)현재 기술로는 실질적으로 불가능
빈도 분석에 대한 저항없음 (단순 치환)강함 (혼돈 및 확산)
사용 사례교육용 / 장난감실제 데이터 보호

코딩을 즐기세요, 그리고 여러분의 시프트가 언제나 정확하기를 바랍니다!

Possible Keys

  • 주파수 분석

  • 알려진 평문 공격에 대한 저항성

  • 같은 문자 → 같은 출력

  • CBC/GCM 모드는 패턴을 방지합니다

  • 몇 초 만에 깨짐

  • 계산적으로 깨기 불가능

인터뷰 후속 질문

Be prepared to answer:

Q: “시프트를 모른 채 이 암호를 어떻게 풀 수 있나요?”
A:

  1. 모든 26개의 시프트를 무차별 대입한다.
  2. 영어 문자 빈도와 비교하는 빈도 분석을 수행한다.

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

Back to Blog

관련 글

더 보기 »

문제 8: 모음 세기

여러분, 안녕하세요! 👋 오늘은 문자열 조작 문제인 모음 개수 세기를 다룹니다. 목표는 주어진 문자열에서 모음의 개수를 세는 함수를 작성하는 것입니다.

React 코딩 챌린지 : TypeHead

Zeeshan Ali !ZeeshanAli-0704https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws...