Bsides CTF 2019 Crypto Writeup(+1) Crypto道場六[9/100]
どうも。duckです。
1問解けたのでWriteup書きます。
1.BabyRSA
二つのファイルが配られた。
暗号化処理が書いてあるpythonファイルとflagや公開鍵などが書いてあるファイル。
data.txt
Dropbox - data.txt - Simplify your life
encrypt.py
Dropbox - encrypt.py - Simplify your life
まずは数式に書き起こす。ただし長い変数名は嫌いなので短くおく。
とする。
また、data.txtから
。
であるから(ワンタイムパッド)を求めればよい。
(1)を求める。
より容易。
s=11295349226607404013471021010341147978232157635167255049065532106494114988908324617162496015788158425092740147662943160785286369117660955898007291303207104
(2)を求める。
やったことを書く。
(a)Wiener's Attackによりが求まる。
との大きさがほとんど一緒であるので、Wiener's Attackが使えそうと判断。
codeは
rsa-wiener-attack/Arithmetic.py at master · pablocelayes/rsa-wiener-attack · GitHubのものを使わせてもらった。
e=230194238437088036834072549225817051199
(b)を素因数分解する。
であるから
よって
通常であればここでから
から()が求まり終了する。
しかし
であり、互いに素ではない。
よって拡張ユークリッドの互除法により求められるのは
どまりである。
これをについて解くのは計算量的に困難。
(c)2乗なら解ける。
ではなくでならが解けるのでは?と思いつく。
それさえ解ければ中国剰余定理でが求まるはず。(後述)
案の定
,
であったので
,となるを用いて
と書ける。
幸運なことにであったため、とすぐにが求まった。
(これに関してはそのうちの解き方としてそのうちまとめたい。オイラーの規準、平方剰余などがでてくるやつだ)
(d)中国式剰余定理でを求める。
であったから、
を両方満たすは中国式剰余定理ですぐ求まる。
ただ、はそれぞれ二つずつ値の候補があったから4通りの候補が出た。
m=[130204528787507505773710923666654908063951342300341290679481831089048475661769804679434320541299854192944581837117095632601550663649704580455239831296388244795699081558529808425017950463304134904449847423117536416689316941082295460328322896891187718311773570823357440044019285149368069722662004114150614222139, 11295349226607404013471021010341147978232157635167255049065532106494114988908324616956647488198714894202591671750797554105930964810174872213148351201383613, 155328494801539469659088679666851276753591192017192346542864403340513541152283708502912394372206759224607578141814677435838429120228926266030995634784793810029010046854516342686756175376802934265799821368172545904638220345216445314249676172852240226067187570748506096577796912199512986620072139171057340043068, 25123966014031963885377756000196368689639849716851055863382572251465065490513903823478073830906905031662996304697581803236878456579221685575755803488405576528660191903390547732759235254646777593507609112310058553481009898249138762245970232608540706470308202516820407331331732981109727072282348205257927204542]
あとは4通りのについてを計算し、正しいを求めるだけだ。
flag:bsides_delhi{JuG1iNg_WiTh_RS4}
はやいとこWiener's Attackとを理解しないといけない。
解けなかったが、共通カギ暗号もまた出題されていたので、そちらも。