[日本語] [English]

Defective RSA

テキストファイル chall.py が与えられた。
このファイルには、以下の処理をするプログラムと、その出力が書かれていた。

  1. 定数 e = 1440 を用意する。
  2. 1024ビットの素数 p, q を用意する。
  3. flagbytes_to_long で変換した値を e 乗して p * q で割った余りを求め、その値を c とする。
  4. e, p, q, c の値を出力する。

通常通りRSA暗号の復号をしようとすると、(p - 1) * (q - 1) を法とする e の逆数が存在せず、できなかった。
e の約数で (p - 1) * (q - 1) を法とする逆数が求まるものを探すと、9 の逆数が求まった。

平文の e = 1440 = 9 * 160 乗は、「平文の160乗」の9乗とみなすことができる。
従って、9の逆数を使うことで、「平文の160乗」を復号できるはずである。

そこで、SageMathを用い、復号後pおよびqそれぞれを法として復号結果の160乗根を求めてみた。

solve.sage

実行開始後、約5分後に実行結果が出た。
得られたqを法とする復号結果の160乗根をCyberChefで変換すると、flagが得られた。

To Base, From Hex - CyberChef

buckeye{r0ots_0f_uN1Ty_w0rk_f0r_th1s???}

writeup by MikeCAT

BuckeyeCTF 2021