촉촉한초코칩
[Dreamhack] ROT128 본문
문제 풀이 분석
#!/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)
* zfill : 자릿수만큼 0을 채워넣는다.
* hex() : 16진수로 변환
- hex_list에 256을 대문자로 바꾸고 16진수로 변환해서 넣는다..?
- flag.png에서 한줄씩 읽어서 plain_s에 넣음
- plain_list : plain_s에서 한줄씩 읽어서 대문자로, 16진수로 변환해서 넣는다.
- enc_list : plain_list 길이만큼 list로 변환
- plain_list 길이만큼 for문 돌리기
- hex_b : plain_list 요소 하나씩 넣기
- index : hex_list에서 hex_b의 인덱스 반환 (위치)
- enc_list[i] : index+128한 값과 hex_list의 길이를 나눈 나머지의 위치를 hex_list에서 찾아서 그 값을 넣는다.
우선 rot128에 대해 찾아보았다.
위 코드를 반대로 수행하는 복호화 코드를 짜야할 것 같다.
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()
enc_s = [enc_s[i:i+2] for i in range(0, len(enc_s), 2)]
enc_list = list(range(len(enc_s)))
for i in range(len(enc_s)):
hex_b = enc_s[i]
index = hex_list.index(hex_b)
enc_list[i] = hex_list[(index - 128) % len(hex_list)]
enc_list = bytearray.fromhex(''.join(enc_list))
with open('decoding.png', 'wb') as f:
f.write(enc_list)
- 암호화된 파일을 열 때는 utf-8 형식으로 연다.
- enc_s에는 2개씩 잘라야 하기 때문에 enc_s만큼 for문을 돌려서 2문자씩 나눈다.
- 암호화할 때는 128을 더했지만 복호화할 때는 128을 빼야 한다. ROT128는 단순히 128만큼 이동시키기 때문이다.
'Study > Crypto' 카테고리의 다른 글
[Dreamhack] Basic_Crypto1 (0) | 2025.01.19 |
---|