[Dreamhack] Textbook-DH

devguri·2022년 11월 3일
0
post-thumbnail

Dreamhack에서 암호학 문제 풀기 !

Textbook-DH 문제 링크

description
Alice와 Bob의 통신을 중간자 드림이가 엿보고 있습니다. 둘의 키교환 과정을 공격해 플래그를 획득해주세요 !

문제 풀기

문제파일 다운받기

challenge.py 파일 확인

  • init 함수
   def __init__(self, p):
        self.p = p
        self.g = 2
        self.x = random.randint(2, self.p - 1)

인자로 받은 p 초기화, g는 2로 설정, x는 2와 p-1 사이의 값

  • calc_key
def calc_key(self):
        self.k = pow(self.g, self.x, self.p)
        return self.k

k = g^x (mod p) = 2^x mod p로 초기화, k값 반환

  • set_shared_key
    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)
shared key = k^x (mod p), ciperdms ECB모드로 동작고 키값은 aes_key

* encrypt
```python
 def encrypt(self, pt):
        return self.cipher.encrypt(pad(pt, 16)).hex()

암호화, 평문 pt를 암호화한 값으로 반환

  • decrypt
 def decrypt(self, ct):
        return unpad(self.cipher.decrypt(bytes.fromhex(ct)), 16)

복호화, 암호문 ct를 복호환한 값으로 반환

공격 방안

  • 중간자가 앨리스, 밥 키교환시 개입하여 key를 조작하여 전달해줌

alice_k = int(input("Key From Alice:"),16)
-> 중간자의 입력값을 전달하여 Alice의 공유키로 저장

bob_k = int(input("Key From Bob:"),16)
-> 중간자의 입력값 전달하여 Bob의 공유키로 저장

이런식으로 Alice, Bob의 키를 사용자가 입력한 값으로 조작한다.

a_pt의 복호값과 b_pt의 복호화값 더해서 flag 구하기 !

profile
Always live diligently

0개의 댓글