雑に解いてしまった気がする。

ところで$p, q$が$\sqrt{n} \pm 1$になってたりするのを割るやつはFermat法と名前が付いているらしい。ただのguessingだと認識してたから意外さがあった。

problem

RSAを割る問題。$4$段階ある。

solution

最初の$3$つはeshihoプロのprimefac-forkに投げれば終わり。 最後の$1$つはそれではだめで、見ると$e$が大きいのでWiener’s attack。owienerが便利だった。

implementation

#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('n', type=int)
args = parser.parse_args()

from Crypto.PublicKey import RSA
import primefac
import owiener
import gmpy2
with open('almost_' * args.n + 'there.pub') as fh:
    key = RSA.importKey(fh.read())

if args.n != 1:
    p, q = primefac.primefac(key.n)
    d = int(gmpy2.invert(key.e, (p-1)*(q-1)))
else:
    d = owiener.attack(key.e, key.n)
key = RSA.construct((key.n, key.e, d))


with open('almost_' * args.n + 'there.encrypted') as fh:
    print(key.decrypt(fh.buffer.read()).decode())