Basic_Crypto1
이 문제는 로마 황제 암호(Roman emperor’s cipher)를 해독하는 문제입니다. 주어진 암호문 "EDVLF FUBSWR GUHDPKDFN"을 해독하여 "DH{decode_Text}"로 변환해야 합니다. 암호문은 알파벳 대문자와 공백으로 이루어져 있으며, 해독 과정에서 알파벳 대문자를 그대로 사용하고 공백은 "_"로 대체합니다.
로마 황제 암호(Roman emperor’s cipher)
로마 황제 암호는 알파벳을 암호화하는 간단한 치환 암호입니다.
각 알파벳을 암호화하기 위해 알파벳의 아스키 코드 값을 사용하며, 암호화에는 아스키 코드 값에서 3을 뺀 후 알파벳으로 변환하는 방식을 사용합니다.
이때, 알파벳이 A보다 작은 경우, 즉 아스키 코드 값이 65 미만인 경우에는 알파벳을 Z로부터 거꾸로 세어나가야 합니다.
즉, 아스키 코드 값에서 3을 뺀 값이 65 미만이라면 26을 더하여 원래 알파벳의 아스키 코드 값을 구합니다.
주어진 문제에서는 암호화된 텍스트를 파일로부터 읽어와 로마 황제 암호를 해독하여 포맷에 맞춰 출력해야 합니다.
코드에서는 decode_cipher 함수를 정의하여 암호를 해독하고, encode.txt 파일로부터 암호문을 읽어와 해독된 결과를 출력합니다.
아래는 문제를 해결하는 코드입니다.
#!/usr/bin/env python3
def decrypt_cipher(ciphertext):
words = ciphertext.split() # 암호문을 공백을 기준으로 분리하여 단어 리스트로 만듭니다.
decrypted_words = []
for word in words:
decrypted_word = ""
for char in word:
ascii_code = ord(char) # 알파벳의 아스키 코드 값을 가져옵니다.
decrypted_ascii = ascii_code - 3 # 아스키 코드 값에서 3을 뺍니다.
if decrypted_ascii < 65: # 아스키 코드 값이 65 미만인 경우
decrypted_ascii += 26 # 26을 더하여 원래 알파벳의 아스키 코드 값을 구합니다.
decrypted_char = chr(decrypted_ascii) # 아스키 코드 값을 문자로 변환하여 해독된 알파벳을 얻습니다.
decrypted_word += decrypted_char
decrypted_words.append(decrypted_word)
decrypted_text = " ".join(decrypted_words) # 해독된 단어를 공백으로 연결하여 해독된 문장을 만듭니다.
decrypted_text = decrypted_text.replace(" ", "_") # 공백을 "_"로 대체합니다.
return decrypted_text
# 암호문을 파일에서 읽어옵니다.
with open("encode.txt", "r") as file:
ciphertext = file.read()
# 암호 해독 함수를 호출하여 해독된 결과를 얻습니다.
decrypted_text = decrypt_cipher(ciphertext)
# 포맷에 맞춰 해독된 결과를 출력합니다.
output = "DH{" + decrypted_text + "} "
print(output)
코드를 실행하면 encode.txt 파일로부터 암호문을 읽어와 해독된 결과를 출력합니다.
로마 황제 암호는 간단한 치환 암호이므로 코드에서 사용된 암호 해독 과정은 비교적 간단합니다. 각 알파벳을 아스키 코드로 변환한 후 3을 뺀 값으로 해독하며, 그 결과를 다시 알파벳으로 변환하여 해독된 텍스트를 얻습니다. 암호문은 공백을 기준으로 단어로 분리되므로, 해독된 단어를 공백으로 연결하여 해독된 문장을 만들고, 공백을 언더스코어(_)로 대체하여 출력합니다.
실행화면 ( flag )
암호 해독은 암호학과 보안에서 흥미로운 주제 중 하나입니다. 이번 포스팅에서는 로마 황제 암호를 해독하는 방법과 그 과정을 다루었습니다. 암호학과 보안에 대한 지식을 활용하여 다양한 문제를 해결할 수 있도록 노력해 보세요. 감사합니다.
'CTF 풀이' 카테고리의 다른 글
[드림핵] r-xor-t 풀이 (2) | 2024.02.13 |
---|---|
[드림핵] Relative Path Overwrite Advanced 풀이 (1) | 2024.02.07 |
[드림핵] php-1 풀이 (+LFI치트시트) (1) | 2024.02.01 |
[드림핵] cpp-type-confusion (0) | 2023.05.12 |