βοΈ Cryptography/Dreamhack
[Dreamhack] Basic_Crypto1 λλ¦Όν΅ μκ²μ λ¬Έμ νμ΄
A Lim Han
2023. 8. 16. 18:55
β€οΈ Basic_Crypto1 λλ¦Όν΅ μκ²μ λ¬Έμ νμ΄
1. λ¬Έμ μ λν μ€λͺ μ μ½μ ν λ¬Έμ νμΌ λ€μ΄λ‘λ
++ Roman Emperor's Cipher (μμ μνΈλ?)
μμ μνΈ(Caesar cipher)λ κ°μ₯ κ°λ¨ν λμΉ μνΈ(substitution cipher) μ€ νλλ‘, λ‘λ§μ ν©μ μμ κ° μ¬μ©νλ€κ³ μ ν΄μ§λ μνΈν λ°©λ²μ΄λ€.
μμ μνΈ(Caesar cipher)λ κ° κΈμλ₯Ό μΌμ ν 거리λ§νΌ λ°μ΄μ μνΈννλ λ°©μμΌλ‘ μλνλ©°, μνΈν λ° λ³΅νΈν 곡μμ μλμ κ°λ€. 곡μμμ nμ μνΈν€λ₯Ό, x λ νλ¬Έ μνλ²³μ μμΉ(0 ~ 25)λ₯Ό λνλΈλ€.
μνΈν | 볡νΈν |
E(x) = (x + n) % 26 | D(x) = (x - n + 26) % 26 |
2. λ€μ΄λ°μ encode.txt νμΌ μ€ν --> μνΈνλ FLAG λ°κ²¬
3. μμ μνΈ ν΄λ μ μν μ€ν¬λ¦½νΈ μμ±
def caesar_decrypt(ciphertext, shift):
decrypted_text = "" # ν΄λ
λ ν
μ€νΈλ₯Ό μ μ₯ν λ³μ μ΄κΈ°ν
for char in ciphertext:
if char.isalpha(): # μνλ²³μΈμ§ νμΈ
ascii_offset = ord('A') if char.isupper() else ord('a') # λλ¬Έμμ μλ¬Έμμ ASCII μ½λ μμκ°μ κ²°μ
decrypted_char = chr((ord(char) - ascii_offset - shift) % 26 + ascii_offset)
# μνΈλ¬Έ λ¬Έμμ ASCII μ½λ κ°μμ μμκ°μ λΊ λ€, μμ μνΈμ ν€λ₯Ό λΊ κ°μ λν λͺ¨λλ‘ μ°μ° μν ν λ€μ μμκ°μ λνμ¬ ν΄λ
λ¬Έμ ꡬν¨
decrypted_text += decrypted_char # ν΄λ
λ¬Έμλ₯Ό ν΄λ
λ ν
μ€νΈμ μΆκ°
else:
decrypted_text += char # μνλ²³μ΄ μλλΌλ©΄ κ·Έλλ‘ μΆκ° (곡백, νΉμλ¬Έμ λ±)
return decrypted_text # μ 체 λ¬Έμ₯μ ν΄λ
νμ¬ λ°ν
ciphertext = "EDVLF FUBSWR GUHDPKDFN" # μνΈλ¬Έ
for shift in range(1, 26): # λͺ¨λ κ°λ₯ν μνΈ ν€μ λν΄ λ°λ³΅
decrypted_message = caesar_decrypt(ciphertext, shift) # ν΄λΉ μνΈ ν€λ‘ μνΈλ¬Έ ν΄λ
print(f"Shift {shift}: {decrypted_message}") # μνΈ ν€μ ν΄λΉ ν€λ‘ ν΄λ
λ κ²°κ³Ό μΆλ ₯
++ κ°λ₯ν λͺ¨λ μμ λνμ¬ μνΈν€λ₯Ό μ€μ ν ν, κ°μ 볡νΈν μ§ν
4. μ€ν¬λ¦½νΈ μ€ν ν κ²°κ³Ό λΆμ --> FLAGλ‘ λ³΄μ΄λ κ²°κ³Όκ° λ°κ²¬
5. FLAG μ λ ₯ νμ΄μ§λ‘ μ΄λνμ¬ κ²°κ³Όκ° μ λ ₯