목록Write-up/Crypto (20)
또 뭐하지
풀이import hashlibdef birthday_hash(msg): return hashlib.sha256(msg).digest()[12:17]msg1 = bytes.fromhex(input("Input message 1 in hex: "))msg2 = bytes.fromhex(input("Input message 2 in hex: "))if msg1 == msg2: print("Those two messages are the same! >:(")elif birthday_hash(msg1) != birthday_hash(msg2): print("Those two messages don't have the same birthday! T.T")else: print("Finally! They have th..
풀이from AES import AES_implementedimport os# For real AES without modification, this challenge is unsolvable with modern technology.# But let's remove a step.ret = lambda x: NoneAES_implemented._sub_bytes = retAES_implemented._sub_bytes_inv = ret# Will it make a difference?secret = os.urandom(16)key = os.urandom(16)flag = open("flag.txt", "r").read()cipher = AES_implemented(key)secret_enc = ciphe..
풀이먼저 주어진 코드를 살펴보면 아래와 같다.# DREAMHACK CHALLENGE - INSECURE SEED #import osimport randomfrom typing import Listclass Seed: def __init__ (self) -> None: self.a: int = os.urandom(1) @staticmethod def GenerateSeed() -> List[int]: # seed는 8비트 4개로 이루어진 리스트 seed: bytearray = bytearray(random.getrandbits(8) for x in range(4)) return list(seed) def CalculateKey..
풀이치환 암호화라는 것을 확인하고 주어진 로마자 암호문을 살펴보면 wi, wo, okize 같이 반복되는 것을 확인할 수 있다. 그리고 주어진 한국어 명사들도 뜻들이 반복되는 것 (밤, 불, 장난 遊 등)을 보아 그냥 하나하나 맞춰봐야할 것 같다. 그나마 확실한 단어불장난 -> hiasobi야유 -> yoasobi로 맞춰보면2. seokize = hiasobi (C)3. wiokize = yoasobi (E)인 것을 알 수 있다. 이를 바탕으로 나머지를 추측해보자.1. hizese -> _obihi -> 불로 끝나니까 불똥이겠지 tobihi (B)4. witogu -> yo_ a _ _ -> 밤으로 시작하니까 밤바람 yokaze (A)5. woneehe -> ya_ii_i -> 소거법으로 (D) yam..
풀이from Crypto.Util.number import getPrime, isPrime, bytes_to_longfrom flag import FLAGdef getSafePrime(n): while True: p1 = getPrime(n) p1 = 122925338396977892377812264658939951801210314312238212067059595148447406166769716855936119104014353481162826500622396956338370238037713303129667973570418205129792800094492802512333202767609745542480301632710243676880179931490273979269048908..
풀이제공된 prob.txt 파일을 확인을 해보니 엄청 긴 문자열이 있었는데 base64 인코딩이 된 것 같아서 한 번 디코딩을 해봤다.디코딩을 했는데 또 엄청 긴 문자열이 나오는데 ==으로 끝난다. 딱 한 번만 더 디코딩을 해보자.여전히.. base64 인코딩된 문자열 같다.while True : code_bytes = str.encode('ascii') decoded = base64.b64decode(code_bytes) str = decoded.decode('UTF-8') if str.startswith("DH"): print(f"Decrypted flag: {str}") break설마하는 마음으로 반복문을 걸어봤다. 플래그 형식에 맞는 문자열이 나오면 ..
풀이#!/usr/bin/env python3from cipher import STREAMimport randomif __name__ == "__main__": with open("flag", "rb") as f: flag = f.read() assert flag[:3] == b'DH{' and flag[-1:] == b'}' seed = random.getrandbits(16) stream = STREAM(seed, 16) print(f"encrypted flag > {stream.encrypt(flag).hex()}")문제의 prob.py 코드를 살펴보면 flag를 암호화하는 것을 확인할 수 있다. 이때 seed를 랜덤 16비트로 사용하고 있고, 그 seed를 S..
풀이from AES import AES_implementedimport os# For real AES without modification, this challenge is unsolvable with modern technology.# But let's remove a step.ret = lambda x: NoneAES_implemented._shift_rows = retAES_implemented._shift_rows_inv = ret# Will it make a difference?secret = os.urandom(16)key = os.urandom(16)flag = open("flag.txt", "r").read()cipher = AES_implemented(key)secret_enc = cip..