CTFで使う数学 前編
どうも。duckです。
とあるCTF(後で書きます)の過去問解いてたんですが、あまりの数学のできなさに絶望したのでまとめます。
証明は適当につけたのであってるかわかりません。(オイ)
まあわかるっしょっていう条件は書いてなかったり厳密性を重視してなかったりするのでお気を付けくださいませ。
あと個人的にCTFで使う頻度(五段階評価)も書いておきます。まあまだ全然解いてないのであてにはならないですが。
じゃあこっから数学れっつごー。
1.合同式 頻度「5」
ないと死ぬ。Cryptoは整数論でできているのです。
いちいち説明する気にならないので
合同式の意味とよく使う6つの性質 | 高校数学の美しい物語ここらを見ていただければ。
そのうちまとめます。勉強会とか開いたら。(開くとは言っていない)
2.ユークリッドの互除法 頻度「3」
def gcd(a,b): while b != 0: r = a % b a = b b = r return a
ただし
ここでかつでを考えると、が最大公約数であることに反する。
コメント:最大公約数が簡単に計算できることくらいは知っておいたほうがよい。
アルゴリズムは調べれば出てくるし上のコードコピペしてもいいし、お好みで覚えて。
3.拡張ユークリッドの互除法 頻度「4」
RSA暗号に出てくるじゃん。つまり超重要。
汚いコードおいとくね。(拡張ユークリッドの互除法が入ってるpythonモジュールなくない?)
def extend_gcd(a,b): k_list=[] while b != gcd(a,b): r = a % b k_list.append((a - r) // b) a = b b = r k_list.reverse() y = 1 x = 0 for k in k_list: temp_y = y y = x - k * temp_y x = temp_y return [x,y]
ちなみに上のgcdのコードと一緒に使わないと動かないよ。
暗号的には次の応用が重要。(先にいえ)
の整数解は計算できる。
。
最右辺と最左辺に対してをとれば定理2を得る。
コメント:RSAに出てくることもさることながら、この定理の便利なところは逆数が求まるところですね。
上記のを生かす問題がめちゃあります。
4.のときをとして使っていい 頻度「2」
数式でそれっぽく書くとこう。
コメント:を知りたいけどが秘密鍵でわからんって時に使えます。
はが公開鍵なので求められること多し。
言われりゃ当然なんだけど結構盲点。
5.フェルマーの小定理 頻度「2」
今のところそんなに見てないけどもっと活躍してもいい気がする。
証明ついでに整数論の常識として知っておくとよさそう(忘れてたがw)なものを証明しておく。
5.1 互いに素なら割ったら余りはバラバラ
は互いに素だからだがこれはに矛盾。
これを用いたフェルマーの小定理の証明
両辺でわる。
もういっこ
5.2 素数pの二項係数は1じゃなかったらの倍数
であるがは素数でよりの倍数。
後編は、オイラーの定理、平方剰余、coppersmith'sの定理、型の二次合同式の解(だっけ?)などを予定してます。
まあちょっと難易度は上がるけどcoppersmith'sの定理とかは頻出なので、よければ後編もお付き合いください。