Writeup: EBCTF 2013 - Challenge CRY200 “One to many”
タイトルは"1対多"でいかにもRSAの同一平文だし、実際に中国人の剰余定理からも計算できたそうですが、別の解法を。
を計算するとn_763, n_3821が互いに素ではないことがわかる。よって共通の素数pをgcd(n_763, n_3821)から求めることができてnの素因数分解ができた。
eの値がまだ不明だが、id:k_operafanさんにとりあえず65537を試してみよと言われて、試したら当たってしまった。怖い。あとは普通にRSAの鍵を作って計算するだけである。
import Crypto.PublicKey.RSA as RSA from Crypto.Util.number import * e = long(65537) def read_message(filename): with open(filename) as f: n = int(f.readline()[2:-1]) c = int(f.readline()[14:-1]) return n, c n, c = read_message("files/message%d.txt" % 763) n2, c2 = read_message("files/message%d.txt" % 3821) p = GCD(n, n2) q = n/p d = inverse(e, (p-1)*(q-1)) m = RSA.construct((n, e, d)).decrypt(c) print long_to_bytes(m)
This is a secret message, for your eyes only: ebCTF{b517aba29f132c52c9426a177952a2d8}
複数の解法を用意してるのだろうか。