1. 문제 설명
2. 문제 풀이
1. 먼저 문제 파일의 압축을 푼다.
2. rot128.py의 코드를 확인한다.
encfile이 어떻게 암호화됐는지 살펴보기 위해 rot128.py 코드를 확인해야 한다.
코드에 hex_list라는 게 먼저 나오는데, 이게 어떤 것인지 살펴봤다.
0부터 1씩 증가하는 hex 리스트인 것을 볼 수 있다.
plain_list는 평문이 hex로 파싱된 list이다.
그리고 저 flag.png가 우리가 복호화해야 할 평문의 원본이다.
아래 코드에서 암호문이 카이사르 암호라는 걸 알 수 있다.
카이사르 암호는 간단한 치환암호 중 하나다.
평문의 각 단위를 일정한 거리만큼 밀어서 다른 문자로 치환하는 방식이다.
왜 카이사르 암호냐면, hex로 파싱된 평문을 순회하면서
hex_list를 참조해 128만큼 뒤로 밀어 치환하고 있기 때문이다.
따라서 복호화하려면 다시 128만큼 앞으로 밀면 된다.
3. 복호화 코드를 작성한다.
# hex 테이블 생성
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
# 암호문 encfile 불러오기
with open('encfile', 'r') as f:
cipher_s = f.read()
# 암호문을 리스트로 파싱
cipher_list = [cipher_s[i:i+2] for i in range(0, len(cipher_s), 2)]
# 복호화한 데이터를 담을 plain_list 생성
plain_list = list(range(len(cipher_list)))
# 복호화
for i in range(len(cipher_list)):
hex_b = cipher_list[i]
index = hex_list.index(hex_b)
plain_list[i] = hex_list[(index - 128) % len(hex_list)]
plain_s = ''.join(plain_list)
# 바이트 단위로 변환
plain_s = bytes.fromhex(plain_s)
# 평문 생성
with open('flag.png', 'wb') as f:
f.write(plain_s)
4. 정답을 확인하고 제출한다.
아래처럼 flag.png에 DH{...} 형태의 정답이 나온다.