목록Write-up/Crypto (22)
또 뭐하지
풀이 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) / 개인..
풀이 제공된 파일에는 chall1.c 파일과 chall1 바이너리 파일이 있다. chall1.c의 코드를 보면 적절한 비밀번호를 입력을 하면 복호화가 되는 것을 알 수 있다. 위 코드를 보면 입력된 비밀번호와 KEY를 XOR한 값을 JOKER와 대조하여 일치하면 올바른 비밀번호로 인식되는 것을 알 수 있다. 따라서 JOKER와 KEY를 XOR 연산하여 원하는 비밀번호 값을 얻을 수 있다는 것을 알 수 있다. (∵ a = b^c 이면 a^b = c) jocker = "\x40\x53\x06\x03\x43\x52\x54\x3b" key = "023661dd4" tmp = "" for i in range(8): tmp += chr(ord(key[i])^ord(jocker[i])) print(tmp) 위와 같은..
풀이 제공된 파일에는 DyingMessage 파일이 들어있다. filepath = "D:/dreamhack/SingleByteXor/DyingMessage" with open(filepath, 'r') as f: Msg = f.read() def XOR(msg, i): l = len(msg) p = "" for j in range(0,l-2,2): tmp = int('0x'+msg[j:j+2],16)^i p = p+chr(tmp) return p for i in range(0,256): print("i = ", i, " ", XOR(Msg, i)) 단일 바이트와 XOR 했다는 힌트가 문제에 제공되어있다. 이를 바탕으로 다잉메시지를 바이트 단위로 떼어서 브루트포스 공격을 시행하는 코드를 작성하였다. 실행결..
풀이 문제에 제공된 Roman emperor's cipher는 시저암호를 의미한다. 제공된 파일에는 암호문이 들어있다. file_path = "D:/dreamhack/Basic_Crypto1/encode.txt" with open(file_path, 'r') as f: cipher_s = f.read() L = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def c_dec(C,K): p = "" for i in C: if i == ' ': p += '_' continue idx = L.find(i) idx = (idx-K)%26 p = p+(L[idx]) return p for i in range(0,26): tmp = c_dec(cipher_s,i) print("Key=",i," ",tmp) 시..
풀이 제공된 파일에는 암호화된 encfile과 암호화 코드인 rot128.py 파일이 포함되어있다. rot128 코드를 살펴보면 시저암호와 유사한 원리로 각 바이트를 16진수 값으로 표현하고, 해당 값을 128만큼 밀어서 새로운 값을 만들어내는 것을 알 수 있다. hex_list : 0부터 255까지의 각 숫자에 대한 16진수 표현을 담은 리스트 plain_list : plain_s에서 읽은 파일 내용을 각 바이트별로 16진수로 변환하여 저장 암호화 방식 : plain_list의16진수 값의 인덱스를 hex_list에서 찾아내고, 이를 +128만큼 이동 hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)] file_path = "D:/dreamh..