촉촉한초코칩

[Dreamhack] SingleByteXor 본문

Study/Crypto

[Dreamhack] SingleByteXor

햄친구베이컨 2025. 2. 9. 00:10

 

문제 파일이 하나 주어지는데 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