
단계 0 : secret key로 flag를 XOR한 ciphertext가 Hex 형태로 주어짐
ciphertext_hex = "0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104"
단계 1 : XOR 연산을 위해 Hex 값을 bytes화
ciphertext = bytes.fromhex(ciphertext_hex)
print('단계 1 확인 : ', ciphertext)
단계 2 : flag의 앞부분은 b'crypto{'로 시작하므로 이 7바이트와 ciphertext의 7바이트를 XOR 연산하면 key의 앞부분을 알 수 있게 됨
known_bytes = b'crypto{'
part = bytes([c ^ p for c, p in zip(ciphertext[:7], known_bytes)])
print('단계 2 확인 : ', part)
단계 3 : 전 단계 결과를 보고 키를 b'myXORkey'로 추측하고 주어진 힌트인 Repeating-key XOR 에 따라 키와 ciphertext 전체를 한번 XOR 연산해봄
key = b'myXORkey'
# 파이썬 문법 기억이 안 나서 AI 도움 좀 받았습니다...
def xor_with_repeating_key(data: bytes, key: bytes) -> bytes:
result = []
for i, byte in enumerate(data):
# key의 인덱스를 돌려가며(0~7) XOR 연산
result.append(byte ^ key[i % len(key)])
return bytes(result)
print('단계 3 확인 : ', xor_with_repeating_key(ciphertext, key))
단계 4 : flag를 찾음

이 과정에서는 알려진 평문 공격(Known-Plaintext Attack, KPA)을 사용했다.
공격자가 특정 암호문(Ciphertext)과 그에 대응하는 원본 평문(Plaintext)의 일부 또는 전체를 이미 알고 있는 상태에서 암호 시스템을 공격하는 기법
이미 flag가 b'crypto{' 형태라는 사실을 알고 있었고, 이를 flag를 획득하는 과정에 사용했으므로 KPA를 적절하게 적용했다고 볼 수 있다.
고전 암호나 단순 XOR 암호에 이용되는 패턴이라고 하니 Repeating-key XOR 과 함께 알아두면 도움이 될 것이다.