#!/usr/bin/env python3 from Crypto.Util.number import * from flag import flag nbit = 64 while True: p, q = getPrime(nbit), getPrime(nbit) P = int(str(p) + str(q)) Q = int(str(q) + str(p)) PP = int(str(P) + str(Q)) QQ = int(str(Q) + str(P)) if isPrime(PP) and isPrime(QQ): break n = PP * QQ m = bytes_to_long(flag.encode('utf-8')) if m < n: c = pow(m, 65537, n) print('n =', n) print('c =', c)
RSAで、を文字列として連結したが素因数になっている
MSBやLSBは、だいたいになっているはずなのでそれを考えてやればいい。のMSBをMBSから、LSBをLSBからとって(だいたい20桁 / 20桁ずつ?)つないで素因数分解してみていい感じになれば勝ちという世界観
なのでだいたい前後18文字くらいまでは安全で、3〜4文字を全探索する感じになる
digits = "0123456789" MSB = str(n)[:18] LSB = str(n)[-19:] for d in product(digits, repeat=3): print(MSB + "".join(d) + LSB)