WaniCTF 2024 Writeup
WaniCTF 2024 Writeup Easy calc 1import os 2import random 3from hashlib import md5 4 5from Crypto.Cipher import AES 6from Crypto.Util.number import long_to_bytes, getPrime 7 8FLAG = os.getenvb(b"FLAG", b"FAKE{THIS_IS_NOT_THE_FLAG!!!!!!}") 9 10 11def encrypt(m: bytes, key: int) -> bytes: 12 iv = os.urandom(16) 13 key = long_to_bytes(key) 14 key = md5(key).digest() 15 cipher = AES.new(key, AES.MODE_CBC, iv=iv) 16 return iv + cipher.encrypt(m) 17 18 19def f(s, p): 20 u = 0 21 for i in range(p): 22 u += p - i 23 u *= s 24 u %= p 25 26 return u 27 28 29p = getPrime(1024) 30s = random.randint(1, p - 1) 31 32A = f(s, p) 33ciphertext = encrypt(FLAG, s).hex() 34 35 36print(f"{p = }") 37print(f"{A = }") 38print(f"{ciphertext = }") Flag が$s$の値を鍵として暗号化されています。 与えられた$A := f(s, p), p$の値から$s$を復元できないか考えてみます。 まず、$A = f(s, p)$の中身を式に起こしてみます。 $$ \begin{aligned} A = f(s, p) &= s(\dots( s(s(s(p-0)+(p-1))+(p-2)) + \dots + 2) + 1 \mod p \\ &= \sum_{i=0}^{p-1} s^{p-i}(p-i) \\ &= \sum_{i=1}^{p} s^{i}i \end{aligned} $$ ...