この大会は2018/12/7 21:00(JST)~2018/12/9 21:00(JST)に開催されました。
今回もチームで参戦。結果は 385点で818チーム中57位でした。
自分で解けた問題をWriteupとして書いておきます。
daring (CRY 100)
AES暗号(CTRモード)とRSA暗号の結果とRSA暗号の公開鍵が添付されている。
AES暗号の結果は43バイト。RSA暗号の結果は128バイト。
このことから、フラグは43バイトであることがわかる。また、スクリプトからRSA暗号の場合は平文を256**95かけてから暗号化していることがわかる。
(m * 256**95) ** e = c mod n ↓ m**e * 256**95**e = c mod n ↓ m**e = inv(256**95**e, n) * c mod n
またeが3であることからmを3乗してもnを超えるか超えないかという数値になることから簡単に復号できる。
from Crypto.PublicKey import RSA from Crypto.Util.number import * import gmpy with open('aes.enc', 'rb') as f: enc_aes = f.read() with open('rsa.enc', 'rb') as f: enc_rsa = f.read() with open('pubkey.txt', 'r') as f: pem = f.read() len_pad = len(enc_rsa) - len(enc_aes) pubkey = RSA.importKey(pem) n = pubkey.n e = pubkey.e c = bytes_to_long(enc_rsa) * inverse(2**(len_pad * 8 * e), n) % n c2 = c while True: m = gmpy.root(c2, e)[0] if m**e == c2: break c2 += n flag = long_to_bytes(m) print flag
hxp{DARINGPADS_1s_4n_4n4gr4m_0f_RSAPADDING}