Files
ctf/2026/cscg/crypto/punkhash/generate.py
2026-03-09 21:44:25 +01:00

35 lines
801 B
Python
Executable File

#!/usr/bin/env python3
import json
import random
from Crypto.Cipher import AES
from Crypto.Util.number import getPrime
from Crypto.Util.Padding import pad
FLAG = "dach2026{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}"
pbits = 137
p = getPrime(pbits)
key_bits = 16
# Generate hash of the key
factors = [random.SystemRandom().randint(0, p-1) for _ in range(key_bits)]
preimage = [random.SystemRandom().randint(0, 0xff) for _ in range(key_bits)]
hash = sum([factors[i] * preimage[i] % p for i in range(key_bits)]) % p
# Encrypt flag
key = bytes(preimage)
cipher = AES.new(key, AES.MODE_ECB)
enc = cipher.encrypt(pad(FLAG.encode(), 16)).hex()
data = {
"p": p,
"factors": factors,
"hash": hash,
"enc_flag": enc
}
with open("data.json", "w") as f:
json.dump(data, f, indent=4)