문제를 보자
rot128.py를 보면
#!/usr/bin/env python3
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
with open('flag.png', 'rb') as f:
plain_s = f.read()
plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]
enc_list = list(range(len(plain_list)))
for i in range(len(plain_list)):
hex_b = plain_list[i]
index = hex_list.index(hex_b)
enc_list[i] = hex_list[(index + 128) % len(hex_list)]
enc_list = ''.join(enc_list)
with open('encfile', 'w', encoding='utf-8') as f:
f.write(enc_list)
이 코드는 PNG 이미지 파일을 Caesar cipher 방식으로 인코딩
일반적인 시저 암호가 알파벳을 시프트하는 것처럼, 이 코드는 바이트값을 128만큼 시프트합니다. 각 바이트에 대해 (현재값 + 128) % 256 연산을 수행하는 단순한 대체 암호화
복호화하려면 반대로 -128 시프트를 적용하면 됩니다. 간단한 대체 암호(substitution cipher)의 한 형태
그대로 복호화하면 된다
#!/usr/bin/env python3
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
with open('encfile', 'r') as f:
enc_str = f.read()
dec_bytes = bytearray()
for i in range(0, len(enc_str), 2):
hex_b = enc_str[i:i+2]
index = hex_list.index(hex_b)
dec_hex = hex_list[(index - 128) % len(hex_list)]
dec_bytes.append(int(dec_hex, 16))
with open('decoded.png', 'wb') as f:
f.write(dec_bytes)
이걸 실행하면 png가 생성된다