촉촉한초코칩

[Dreamhack] ROT128 본문

Study/Crypto

[Dreamhack] ROT128

햄친구베이컨 2025. 1. 21. 14:00

 

문제 풀이 분석

#!/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진수로 변환

  1. hex_list에 256을 대문자로 바꾸고 16진수로 변환해서 넣는다..?
  2. flag.png에서 한줄씩 읽어서 plain_s에 넣음
  3. plain_list : plain_s에서 한줄씩 읽어서 대문자로, 16진수로 변환해서 넣는다. 
  4. enc_list : plain_list 길이만큼 list로 변환 
  5. plain_list 길이만큼 for문 돌리기
    1. hex_b : plain_list 요소 하나씩 넣기 
    2. index : hex_list에서 hex_b의 인덱스 반환 (위치)
    3. 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)
  1. 암호화된 파일을 열 때는 utf-8 형식으로 연다. 
  2. enc_s에는 2개씩 잘라야 하기 때문에 enc_s만큼 for문을 돌려서 2문자씩 나눈다. 
  3. 암호화할 때는 128을 더했지만 복호화할 때는 128을 빼야 한다. ROT128는 단순히 128만큼 이동시키기 때문이다. 

 

 

참고 : https://lucykorea414.tistory.com/7

'Study > Crypto' 카테고리의 다른 글

[Dreamhack] Basic_Crypto1  (0) 2025.01.19