목록Write-up/Crypto (22)
또 뭐하지
풀이#!/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..
풀이#!/usr/bin/env python3from Crypto.Cipher import DESimport signalimport osif __name__ == "__main__": signal.alarm(15) with open("flag", "rb") as f: flag = f.read() key = b'Dream_' + os.urandom(4) + b'Hacker' key1 = key[:8] key2 = key[8:] print("4-byte Brute-forcing is easy. But can you do it in 15 seconds?") cipher1 = DES.new(key1, DES.MODE_ECB) cipher2 = DES...
문제풀이제공된 코드를 살펴봤을때, 평문 p가 주어졌을 때 암호화 방식은 아래 공식과 같다. 이 식을 아래와 같이 정리해보면 복호화 방식을 알 수 있다.여기서 readme 파일을 확인해보면 p 를 구하기 위해 필요한 것 중 모르는 것은 key1 밖에 없는 것을 확인할 수 있다. 이때코드에서 key2 보다 key1 이 작다는 것을 알 수 있고 , key1 은 1~94 까지의 값을 가진다 . 큰 범위가 아니므로 전수조사를 시행한다 .복호화 공식에 따라 코드를 작성하고, 나누어 떨어지는 경우만 프린트하도록 하면 p 값을 얻을 수 있다 .
풀이#!/usr/bin/env python3import randomimport signalimport sysMENU_GAMBLE = 1MENU_VERIFY = 2MENU_FLAG = 3MENU_LEAVE = 4money = 500verified = Falsedef show_menu(): print('=======================================') print('1. go to gamble') print('2. verify you\'re a robot') print('3. buy flag') print('4. leave')def get_randn(): return random.randint(0, 0xfffffffe)..
풀이제공된 문제파일에는 암호화된 플래그 파일 flag.txt와 공개키 파일 public_key.pem이 포함되어 있다. RSA-wiener에 대한 내용은 아래 글을 참고하였다.https://dokhakdubini.tistory.com/289 [RSA] RSA 공격법RSA 공격법 CTF에서 크립토문제로 생각보다 자주 출제되는 RSA 이다. 크게 분류하면 적절하지 못한 소수를 택한 경우 / 구조상 문제로 나뉜다. 0. 개인키 유출 p, q, ϕ(n), d 중 단 하나라도 노출된다면dokhakdubini.tistory.comWiener attack은 RSA 암호에서 공개된 큰 모듈러스 n과 비교적 작은 비밀 지수 d를 가진 경우, 연속된 분수를 사용하여 d를 추정하는 공격 방법이라고 한다. 블로그 글에 나온..
풀이 #!/usr/bin/python3 from Crypto.Util.number import getStrongPrime, bytes_to_long, inverse class RSA(object): def __init__(self): self.p = getStrongPrime(512) self.q = getStrongPrime(512) self.N = self.p * self.q self.e = 0x10001 self.d = inverse(self.e, self.N - self.p - self.q + 1) def encrypt(self, pt): return pow(pt, self.e, self.N) def decrypt(self, ct): return pow(ct, self.d, self.N) rsa ..
풀이 CRT (중국인의 나머지 정리, Chinese Remainder Theorem) - 정수론에서 중요한 정리 중 하나 - 소수로 나눈 나머지 연산에서 유용하게 사용 제공된 문제 파일을 살펴보면 prob.py와 output.txt 파일이 있다. prob.py는 flag를 정수로 변환하고, CRT를 적용할 수 있도록 3개의 소수와 이를 이용한 연립합동식을 생성하는 코드이다. output.txt는 prob.py 코드의 실행결과이다. 위 코드를 수식으로 바꿔보면 flag = c1 (mod p1) flag = c2 (mod p2) flag = c3 (mod p3) 이다. from sympy.ntheory.modular import solve_congruence from Crypto.Util.number imp..