촉촉한초코칩
[Dreamhack] SingleByteXor 본문
문제 파일이 하나 주어지는데 HxD로 여니, 문제에 있는 문자열이 있었다.
쪽지 ^ 어떤 단일 바이트 = flag 라는 건가?
그런데 암,복호화를 할 때는 키가 있어야 한다.
평문 : P 키 : K 암호문 : C |
P[i] ^ K[i] = C[i] |
평문과 암호문 각각에 키와 xor 연산을 한다.
키가 있어야 하는데..
키를 찾는 파이썬 코드를 실행해보았다.
def xor_decrypt(ciphertext: bytes, key: bytes) -> bytes:
return bytes([c ^ key[i % len(key)] for i, c in enumerate(ciphertext)])
def brute_force_xor_key(ciphertext: bytes):
possible_keys = []
for key in range(256): # 0 ~ 255의 모든 단일 바이트 키 시도
decrypted = xor_decrypt(ciphertext, bytes([key]))
try:
text = decrypted.decode('utf-8') # UTF-8로 변환 가능한 경우 유효한 키로 간주
if all(32 <= ord(ch) <= 126 for ch in text): # 대부분의 가독 가능한 문자 범위
possible_keys.append((key, text))
except UnicodeDecodeError:
continue # 디코딩 불가능한 경우 무시
return possible_keys
# 예제 암호문
ciphertext = bytes.fromhex('54586b6458754f7b215c7c75424f21634f744275517d6d')
# 브루트포스로 키 찾기
results = brute_force_xor_key(ciphertext)
# 결과 출력
for key, text in results:
print(f'키: {key} (0x{key:02x}) | 복호화된 텍스트: {text}')
16진수로 표현된 암호문을 바이트로 바꾸고(xor 연산이 비트 단위로 진행되기 때문),
0~255을 키로 넣어서 복호화한다음, DH로 시작하는 문장을 찾으면 되는 것 같다.
'Study > Crypto' 카테고리의 다른 글
[Dreamhack] ROT128 (0) | 2025.01.21 |
---|---|
[Dreamhack] Basic_Crypto1 (0) | 2025.01.19 |