4주차과제

조승현·2022년 11월 2일
0

EVI$ION_전체세션

목록 보기
3/6

Dreamhack Textbook-DH

오늘은 드림핵 문제 풀이

https://dreamhack.io/wargame/challenges/120/

참고로 요문제입니다!!

문제 해석

제일 먼저 문제파일을 다운 받았더니 안에 challenge.py가 들어있어요

외계어다...

겁먹지 말고 하나씩 뜯어보자

#!/usr/bin/python3
from Crypto.Util.number import getPrime
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
import hashlib
import random

#클래스 객체 생성
class Person(object):
	# p를 전달받은 값으로 초기화, g는 2, x는 2와 p-1 사이의 랜덤값
    def __init__(self, p):
        self.p = p
        self.g = 2
        self.x = random.randint(2, self.p - 1)
    
    # k = g^x (mod p) = 2^x (mod p) : A의 개인키
    def calc_key(self):
        self.k = pow(self.g, self.x, self.p)
        return self.k

	# shared key = k^x (mod p)
    def set_shared_key(self, k):
        self.sk = pow(k, self.x, self.p)
        aes_key = hashlib.md5(str(self.sk).encode()).digest()
        self.cipher = AES.new(aes_key, AES.MODE_ECB)

	# 암호화 -> 16진수
    def encrypt(self, pt):
        return self.cipher.encrypt(pad(pt, 16)).hex()

	# 복호화 -> 16진수
    def decrypt(self, ct):
        return unpad(self.cipher.decrypt(bytes.fromhex(ct)), 16)

# 소수 선택 및 초기화 진행
flag = open("flag", "r").read().encode()
prime = getPrime(1024)
print(f"Prime: {hex(prime)}")
alice = Person(prime)
bob = Person(prime)

# Alice의 공유키 전달
alice_k = alice.calc_key()
print(f"Alice sends her key to Bob. Key: {hex(alice_k)}")
print("Let's inturrupt !")
alice_k = int(input(">> "))
if alice_k == alice.g:
    exit("Malicious key !!")
bob.set_shared_key(alice_k)

# Bob의 공유키 전달
bob_k = bob.calc_key()
print(f"Bob sends his key to Alice. Key: {hex(bob_k)}")
print("Let's inturrupt !")
bob_k = int(input(">> "))
if bob_k == bob.g:
    exit("Malicious key !!")
alice.set_shared_key(bob_k)

print("They are sharing the part of flag")
print(f"Alice: {alice.encrypt(flag[:len(flag) // 2])}")
print(f"Bob: {bob.encrypt(flag[len(flag) // 2:])}")

중간자는 Alice의 공개키를 전달하는 과정에서 Alice 키 조작 가능 + Bob의 공개키를 전달하는 과정에서 Bob의 키 조작 가능

풀이

from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
import hashlib
import random

# 소수 계산
prime = int(input("prime:"),16)
my_x=random.randint(2,prime-1)
my_key=pow(2, my_x, prime)
print("My Key:",my_key)

# Alice 키 조작
alice_k = int(input("Key From Alice:"),16)
a_sk= pow(alice_k, my_x, prime)
a_aes=hashlib.md5(str(a_sk).encode()).digest()
a_cipher=AES.new(a_aes, AES.MODE_ECB)

# Bob 키 조작
bob_k = int(input("Key From Bob:"),16)
b_sk= pow(bob_k, my_x, prime)
b_aes=hashlib.md5(str(b_sk).encode()).digest()
b_cipher=AES.new(b_aes, AES.MODE_ECB)

# Alice로부터 오는 메세지
a_ct=input("Message frome Alice:")
a_pt=unpad(a_cipher.decrypt(bytes.fromhex(a_ct)), 16)

# Bob으로부터 오는 메세지
b_ct=str(input("Message frome Bob:"))
b_pt=unpad(b_cipher.decrypt(bytes.fromhex(b_ct)), 16)

flag=a_pt.decode()+b_pt.decode()
print("flag:",flag)

둘이 주고 받는 메세지를 중간에서 탈취하여 flag 값 추출하면 됨!

0개의 댓글