encrypt.py파일이다
import urllib.parse
aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_KEY = {
'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R', 'E': 'T', 'F': 'Y', 'G': 'U', 'H': 'I', 'I': 'O',
'J': 'P', 'K': 'A', 'L': 'S', 'M': 'D', 'N': 'F', 'O': 'G', 'P': 'H', 'Q': 'J', 'R': 'K',
'S': 'L', 'T': 'Z', 'U': 'X', 'V': 'C', 'W': 'V', 'X': 'B', 'Y': 'N', 'Z': 'M',
'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't', 'f': 'y', 'g': 'u', 'h': 'i', 'i': 'o',
'j': 'p', 'k': 'a', 'l': 's', 'm': 'd', 'n': 'f', 'o': 'g', 'p': 'h', 'q': 'j', 'r': 'k',
's': 'l', 't': 'z', 'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b', 'y': 'n', 'z': 'm',
}
def aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_encrypt(data, key):
return ''.join(key.get(char, char) for char in data)
def adsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoais(data):
return urllib.parse.quote(data)
def encrypt(plaintext):
substituted = aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_encrypt(plaintext, aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_KEY)
final_encrypted = adsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoais(substituted)
return final_encrypted
if __name__ == "__main__":
plaintext = "0xH0P3{Fake_Flag}"
encrypted = encrypt(plaintext)
with open("encrypted.txt", "w") as f:
f.write(encrypted)
에?
뒤..집어야하는거죠?
encrypted.txt 파일이다
0bI0H3%7BEknhzg_1l_Yxf_i4i4%7D
aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_KEY
aldknadvlknadvlan 반복됨..
🔍 코드 한 줄씩 설명
이 코드는 암호화된 문자열을 복호화하여 원래의 플래그를 얻는 역할을 합니다.
암호화 과정이 1️⃣ 치환 암호 (Substitution Cipher) + 2️⃣ URL 인코딩이므로, 복호화 과정은 이를 반대로 수행해야 합니다.
1️⃣ 복호화 키 생성 (decryption_key)
decryption_key = {v: k for k, v in {
'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R', 'E': 'T', 'F': 'Y', 'G': 'U', 'H': 'I', 'I': 'O',
'J': 'P', 'K': 'A', 'L': 'S', 'M': 'D', 'N': 'F', 'O': 'G', 'P': 'H', 'Q': 'J', 'R': 'K',
'S': 'L', 'T': 'Z', 'U': 'X', 'V': 'C', 'W': 'V', 'X': 'B', 'Y': 'N', 'Z': 'M',
'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't', 'f': 'y', 'g': 'u', 'h': 'i', 'i': 'o',
'j': 'p', 'k': 'a', 'l': 's', 'm': 'd', 'n': 'f', 'o': 'g', 'p': 'h', 'q': 'j', 'r': 'k',
's': 'l', 't': 'z', 'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b', 'y': 'n', 'z': 'm',
}.items()}
✔ aldknadvlknadv_KEY (암호화 키)를 뒤집어서 복호화 키를 생성
✔ 암호화된 문자를 원래 문자로 변환하는 역할
✔ dict.items()를 사용해 키-값을 거꾸로 매핑하여 만든 것
🛠 예시
원본 문자 암호화된 문자 복호화 키 (거꾸로)
A | Q | Q → A |
B | W | W → B |
C | E | E → C |
... | ... | ... |
t | z | z → t |
u | x | x → u |
2️⃣ 복호화 함수 (decrypt())
def decrypt(encrypted_text):
# 1. URL 디코딩
decoded_text = urllib.parse.unquote(encrypted_text)
# 2. 치환 복호화
decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)
return decrypted_text
✔ URL 디코딩 (unquote) 수행
✔ 복호화 키(decryption_key)를 사용하여 원래 문자로 변환
🛠 예제 🔹 암호화된 텍스트: "0bI0H3%7BEknhzg_1l_Yxf_i4i4%7D"
🔹 1단계: URL 디코딩 (urllib.parse.unquote)
0bI0H3{Eknhzg_1l_Yxf_i4i4}
🔹 2단계: 치환 복호화 (decryption_key.get(char, char))
0xH0P3{Crypto_1s_Fun_h4h4}
3️⃣ 복호화 실행
encrypted_example = "0xH0P3%7BFqkt_Ftqz%7D"
decrypted_flag = decrypt(encrypted_example)
✔ encrypted_example → 암호화된 플래그
✔ decrypt() 함수 실행 → 복호화된 원본 플래그 반환
🎯 코드 흐름 요약
1️⃣ aldknadvlknadv_KEY를 거꾸로 뒤집어 복호화 키(decryption_key) 생성
2️⃣ URL 인코딩된 텍스트를 urllib.parse.unquote()로 디코딩
3️⃣ decryption_key를 이용해 문자를 원래 상태로 변환
4️⃣ 복호화된 플래그 출력
✅ 결과: "0xH0P3{Crypto_1s_Fun_h4h4}" 🎉
🚀 결론
✔ 암호화 과정: 치환 암호(문자 대체) + URL 인코딩
✔ 복호화 과정: URL 디코딩 → 치환 역변환
✔ 이 방식으로 암호화된 모든 문자열을 복호화 가능! 🔥
🔍 코드 분석: decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)
이 한 줄의 코드에서 수행하는 작업을 단계별로 설명하겠습니다.
🚀 1️⃣ 코드의 역할
이 코드는 URL 디코딩된 문자열 (decoded_text)을 복호화된 문자열 (decrypted_text)로 변환하는 과정입니다.
✔ decoded_text에는 URL 디코딩된 암호화된 문자열이 들어있음
✔ 각 문자를 decryption_key를 사용해 원래 문자로 변환
✔ 모든 변환된 문자들을 합쳐서 원래 문자열로 복구
🛠 2️⃣ 코드 구조
decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)
✔ for char in decoded_text → decoded_text 문자열을 한 글자씩 반복
✔ decryption_key.get(char, char) →
- 치환 키 (decryption_key)에서 해당 문자의 원래 값을 찾음
- 찾을 수 없으면 원래 문자 그대로 유지 ✔ ''.join(...) → 변환된 문자들을 하나의 문자열로 합침
📌 3️⃣ 동작 방식 예제
📍 예제 입력
decoded_text = "Fqkt_Ftqz"
✔ 이 문자열은 aldknadvlknadv_KEY로 암호화된 플래그 일부
✔ decryption_key를 이용해 복호화할 수 있음
📍 1️⃣ for char in decoded_text (한 글자씩 반복)
문자 'F' → 변환
문자 'q' → 변환
문자 'k' → 변환
문자 't' → 변환
문자 '_' → 변환 안 함 (원래 값 유지)
문자 'F' → 변환
문자 't' → 변환
문자 'q' → 변환
문자 'z' → 변환
📍 2️⃣ decryption_key.get(char, char) 변환 과정
입력 문자 (char) decryption_key.get(char, char) 결과
F → Y | |
q → j | |
k → a | |
t → z | |
_ → _ (변환 없음) | |
F → Y | |
t → z | |
q → j | |
z → t |
📍 3️⃣ ''.join(...) 변환된 문자 합치기
"Fqkt_Ftqz" → "Yjaz_Yzjt"
➡ 복호화된 문자열이 완성됨!
🎯 결론
✔ 문자 하나씩 반복 (for char in decoded_text)
✔ 치환 키 (decryption_key.get(char, char))를 사용하여 복호화
✔ 변환된 문자들을 하나로 합쳐 원래 문장을 복구 (''.join(...))
✅ 결과적으로, 암호화된 문자열을 원래 상태로 되돌리는 핵심 코드! 🚀
import urllib.parse
# 암호화 키를 뒤집어 복호화 키 생성
decryption_key = {v: k for k, v in {
'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R', 'E': 'T', 'F': 'Y', 'G': 'U', 'H': 'I', 'I': 'O',
'J': 'P', 'K': 'A', 'L': 'S', 'M': 'D', 'N': 'F', 'O': 'G', 'P': 'H', 'Q': 'J', 'R': 'K',
'S': 'L', 'T': 'Z', 'U': 'X', 'V': 'C', 'W': 'V', 'X': 'B', 'Y': 'N', 'Z': 'M',
'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't', 'f': 'y', 'g': 'u', 'h': 'i', 'i': 'o',
'j': 'p', 'k': 'a', 'l': 's', 'm': 'd', 'n': 'f', 'o': 'g', 'p': 'h', 'q': 'j', 'r': 'k',
's': 'l', 't': 'z', 'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b', 'y': 'n', 'z': 'm',
}.items()}
# 복호화 함수 정의
def decrypt(encrypted_text):
# 1. URL 디코딩
decoded_text = urllib.parse.unquote(encrypted_text)
# 2. 치환 복호화
decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)
return decrypted_text
# 암호화된 텍스트 입력 (예제)
encrypted_example = "0xH0P3%7BFqkt_Ftqz%7D" # 이 값을 실제 문제에서 주어진 값으로 변경해야 함
# 복호화 실행
decrypted_flag = decrypt(encrypted_example)
decrypted_flag
0xH0P3{Crypto_1s_Fun_h4h4}
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[155] IT 비전공자 [dreamhack]Simple Note Manager문제 풀기 (0) | 2025.02.12 |
---|---|
[154] IT 비전공자 [dreamhack]Badge문제 풀기 (0) | 2025.02.11 |
[152] IT 비전공자 [dreamhack]Insecure Seed문제 풀기 (0) | 2025.02.10 |
[151] IT 비전공자 [dreamhack]Password in the gift box문제 풀기 (0) | 2025.02.10 |
[150] IT 비전공자 [dreamhack]No shift please!문제 풀기 (0) | 2025.02.07 |