CTFで使う数学 後編
どうも。duckです。
後編始めるよ。
ちょっと全体的に難易度が上がるから、前編にもまして証明が雑になるよ。
よくわからんって人はとりあえずcoppersmithの定理だけみておけばいいです。
頻出なんで。
じゃあやっていこうかー。
6.coppersmithの定理 頻度「4」
これ難しいからスルーしてたんだけどCTFで出会った回数が4回目になったときに学ぶ決心をした。
定理を使う条件さえ覚えていれば後はSagemath(数学ライブラリ)が計算してくれるのであんまり気負わず。
定理の使い方例
①からを求める。
②から(c=1とでもしておくとよい)簡単に求まるの範囲を求める。
③この範囲に求めたい値が含まれれば上の定理を使う。
sagemathコード例
sage: N = 1279012345679004320987654321 sage: K = Zmod(N) sage: PR.<x> = PolynomialRing(K) sage: f = x^2 + 78523430 sage: f.small_roots()
small_roots()関数がcoppersmithの定理の計算を勝手にやってくれて、答えの集合の配列を返す。
数字は適当なので気にしないで。ちなみにsmall_roots()は引数も持たせられる。
f.small_roots(X=2^kbits, beta=1/3)
は解のこと。
この定理にまつわる自身の論文を快く提供してくださった同期Kに感謝します。
証明は1ミリもブログに書いてないけどな。すまんな。
7.平方剰余 頻度「1」
今のところで出会ったことがほとんどない。
端的に言うとの世界でが存在するかはすぐわかるということ。
証明は平方剰余の相互法則によるが、書かない。
sagemathでの使い方を述べるにとどめる。
#kronecker(a,N) #1なら平方剰余 sage: kronecker(2,7) 1 #-1なら平方非剰余 sage: kronecker(3,7) -1 #あるNでの平方剰余が全部知りたいとき sage: quadratic_residues(7) [0, 1, 2, 4]
8.中国剰余定理 頻度「3」
まあまあでる。直接ではなくても間接的によくお世話になる。
答えとなるを構成することで証明とする。(唯一性の証明は省略)
とかいたらそれはのにおける逆数という意味で使う。
となるをとってくる。
とおき、となるようにを決める。
つまりよりとする。
このときかつ
とおき、・・・以下繰り返し。
コード:
def inverse(a,N): return extend_gcd(a,N)[0] % N def chinese(a_list,m_list): n=len(a_list) x=a_list[0] m=m_list[0] i = 1 while i < n: x=x+(a_list[i] - x) * inverse(m,m_list[i]) * m m*=m_list[i] i+=1 return x % m
gcd,extend_gcdは自分で定義した関数。詳しくは前編参照。
CTFで使う数学 前編 - CTFと共に生きる
重要な例としてRSA暗号の復号計算を高速化するのに使われているが、それは”暗号まとめ”記事にまとめようと思う。
9.オイラーの定理 頻度「1」
フェルマーの定理の拡張。
まずオイラーのトーシェント関数の定義(ファイ関数ともいう)。
なぜならばはと互いに素であるから(の集合の要素のどれかと一致)であり。(*)
よって。
コメント:
素数に対しよりこれはフェルマーの定理の拡張である。
またRSAへの応用としてとなることにも注意。(復号で使う)
トーシェント関数にはほかにも面白い性質があるがここに書くには余白が(ry)
二次合同式についても触れるつもりでしたが、またの機会に。多分そのうちしれっと追記します。
次は”数学を使わないで解けるCrypto問題”、”暗号方式を学ぶ”みたいなタイトルの記事を書きたいです。