この大会は2016/12/10 15:00(JST)~2016/12/11 15:00(JST)に開催されました。
今回もチームで参戦。結果は2000点で930チーム中37位でした。
自分で解けた問題をWriteupとして書いておきます。
Vigenere (Crypto 100)
Vigenere暗号の問題。平文の最初7文字が"SECCON{"で鍵が12文字あることが分かっている。まず鍵の最初7文字を求める。
al_l = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}' c = 'LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ' p = 'SECCON{' key = '' for i in range(len(p)): index = al_l.index(c[i]) - al_l.index(p[i]) if index < 0: index += len(al_l) key += al_l[index] print key
実行すると、鍵の最初7文字が"VIGENER"であることがわかる。次の文字は"E"であると想定して、4文字のブルートフォースで問題に記載してあるハッシュ値になるものを探す。
import hashlib import itertools al_l = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}' c = 'LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ' k = 'VIGENERE' k_size = 12 for s in itertools.product(al_l, repeat=4): key = k + ''.join(s) print key p = '' for i in range(len(c)): index = al_l.index(c[i]) - al_l.index(key[i%k_size]) if index < 0: index += 28 p += al_l[index] if p[-1:] == '}': if hashlib.md5(p).hexdigest() == 'f528a6ab914c1ecf856a1d93103948fe': print p break
SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}