rot128.py는 flag.png 파일을 암호화하여 encfile로 저장하는 프로그램의 소스 코드입니다. (풀이자가 프로그램을 직접 실행할 수는 없습니다.) 주어진 encfile을 복호화하여 flag 파일 내용을 알아낸 뒤, flag.png에서 플래그를 획득하세요! 플래그의 형식은 DH{...} 입니다
문제 풀이
#!/usr/bin/env python3
# 0부터 255까지의 정수 16진수 문자열로 변환 , 소문자를 대문자로 변경하여 리스트 저장(ex 정수 10 = OA로 변환)
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
# flag 파일을 이진 읽기 모드(rb)로 열고 바이트 단위로 읽어 plain_s에 저장
with open('flag.png', 'rb') as f:
plain_s = f.read()
# plain_s의 각 바이트 16진수 형태의 문자열로 변환 > plain_list에 저장
plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]
# enc_list 초기화
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)
# 얻은 인덱스에 128을 더하고, 결과를 256으로 모듈로 연산해 새로운 인덱스 계산 후 enc_list에 저장
enc_list[i] = hex_list[(index + 128) % len(hex_list)]
# enc_list의 모든 원소를 하나의 문자열로 결합
enc_list = ''.join(enc_list)
# 암호화 된 데이터 encfile로 저장 UTF-8인코딩으로 작성됨
with open('encfile', 'w', encoding='utf-8') as f:
f.write(enc_list)
위의 파일은 암호화 과정을 나타낸 코드이다.
해당 코드 확인 후 복호화 코드 작성
단순히 각 바이트를 128만큼 순환 이동(shift)시키는 간단한 암호화 방식이다.
결과는 기존의 이미지 파일에서 순수 텍스트 형태로 저장된다.
복호화하면 텍스트에서 다시 이미지 파일로 확인이 가능하다는것
복호화 코드
#!/usr/bin/env python3
# 0부터 255까지의 값을 16진수 문자열로 변환하고, 대문자로 만든 후 리스트에 저장합니다.
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
# 암호화된 파일을 읽습니다.
with open('encfile', 'r', encoding='utf-8') as f:
enc_s = f.read()
# 두 글자씩 잘라서 리스트에 저장합니다. (암호화된 데이터는 16진수 형식 문자열입니다.)
enc_list = [enc_s[i:i+2] for i in range(0, len(enc_s), 2)]
# 복호화된 데이터를 저장할 리스트를 초기화합니다.
dec_list = list(range(len(enc_list)))
# 각 암호화된 16진수 문자열에 대해 복호화 작업을 수행합니다.
for i in range(len(enc_list)):
hex_b = enc_list[i]
index = hex_list.index(hex_b)
# 원본 인덱스를 얻기 위해 암호화 시에 적용한 128을 빼고 모듈로 연산을 수행합니다.
dec_list[i] = hex_list[(index - 128) % len(hex_list)]
# 복호화된 16진수 문자열들을 바이트로 변환합니다.
dec_bytes = bytes([int(hex_val, 16) for hex_val in dec_list])
# 복호화된 데이터를 이미지 파일로 저장합니다.
with open('decrypted.png', 'wb') as f:
f.write(dec_bytes)
위 암호화 과정을 역으로 수행하는 코드이다.
암호화된 데이터를 다시 원본 이미지 데이터로 변환하여 decrypted.png 파일로 저장한다.