목록Write-up/Crypto (20)
또 뭐하지
풀이#!/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..
풀이 base64 인코딩은 바이너리를 6자리씩 끊어서 총 2**6 = 64개의 문자로 표현하는 것이다. 주어진 힌트에서는 문자가 총 2**5 =32개이므로 바이너리를 5자리씩 끊어서 문자로 인코딩했다고 추측해볼 수 있다. 즉 base32 인코딩을 한 것이다. dreamhack tool에서 From Base32를 이용할 것이다. 문제에서 힌트가 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef 라고 주어졌기 때문에 Alphabet을 'A-Za-f='로 설정하고 돌려보면 flag 값을 얻을 수 있다.
PEM Public Key Infrastructure Enhanced Mail X.509 디지털 인증서와 키를 저장하고 전송하기 위한 표준 형식 텍스트 형식으로 인코딩되어 있으며, 보통 .pem 확장자를 가짐 일반적으로는 인증서, 개인 키, 공개 키 등의 암호학적 자격 증명 요소를 포함 RSA 비대칭 키 암호화 방식 (공개 키 - 데이터 암호화 / 개인 키 - 데이터 복호화)소인수분해의 어려움에 기반 Key Generation 1. 큰 소수 2개 p와 q를 선택2. n 계산 : n = p*q3. 오일러 파이 함수 계산 : ϕ(n) = (p-1) * (q-1) 4. ϕ(n)과 서로소인 정수 e 선택 5. e의 역원을 계산하여 d를 구함 : e * d ≡ 1 (mod ϕ(n)) → 공개키 (n,e) / 개인..