CTFで使う数学 前編

どうも。duckです。
とあるCTF(後で書きます)の過去問解いてたんですが、あまりの数学のできなさに絶望したのでまとめます。
証明は適当につけたのであってるかわかりません。(オイ)
まあわかるっしょっていう条件は書いてなかったり厳密性を重視してなかったりするのでお気を付けくださいませ。
あと個人的にCTFで使う頻度(五段階評価)も書いておきます。まあまだ全然解いてないのであてにはならないですが。
じゃあこっから数学れっつごー。


1.合同式 頻度「5」
ないと死ぬ。Cryptoは整数論でできているのです。
いちいち説明する気にならないので
合同式の意味とよく使う6つの性質 | 高校数学の美しい物語ここらを見ていただければ。

そのうちまとめます。勉強会とか開いたら。(開くとは言っていない)


2.ユークリッドの互除法 頻度「3」

定理:a,b \in \mathbb Nの最大公約数は簡単に求められる
詳しいアルゴリズム書くのはめんどいからコード見て。これでa,bの最大公約数が求まります。

def gcd(a,b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

定理の核:\gcd (a,b) = \gcd (bk + r,b) = \gcd (r,b)
ただしa = bk + r(0 < r < a)

証明概略:abの最大公約数をcとするとc | a,c | bであり、c | rである。
ここでc' | bかつc' | rc' > cを考えると、cが最大公約数であることに反する。

コメント:最大公約数が簡単に計算できることくらいは知っておいたほうがよい。
アルゴリズムは調べれば出てくるし上のコードコピペしてもいいし、お好みで覚えて。


3.拡張ユークリッドの互除法 頻度「4」
RSA暗号に出てくるじゃん。つまり超重要。

定理1:ax + by = \gcd (a,b)の整数解(x,y)は計算できる
これはユークリッドの互除法から構成的に証明できるんだけど、めんどい。
汚いコードおいとくね。(拡張ユークリッドの互除法が入ってる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:aNが互いに素であるならば
ax \equiv 1 \bmod Nの整数解x \bmod Nは計算できる。

証明概略:上の定理1でb=Nとしたものを考える。
ax+Ny=\gcd (a,N)=1
最右辺と最左辺に対して\bmod Nをとれば定理2を得る。

コメント:RSAに出てくることもさることながら、この定理の便利なところは逆数が求まるところですね。
上記のx=a^{-1} \bmod Nを生かす問題がめちゃあります。


4.N=pqのときa^{-1} \bmod Na^{-1} \bmod pとして使っていい 頻度「2」
数式でそれっぽく書くとこう。

定理:p | Nならa \bmod N \equiv a \bmod p \pmod p

証明概略:kN+b=kqp + b

コメント:a^{-1} \bmod pを知りたいけどp秘密鍵でわからんって時に使えます。
a^{-1} \bmod NNが公開鍵なので求められること多し。
言われりゃ当然なんだけど結構盲点。


5.フェルマーの小定理 頻度「2」
今のところそんなに見てないけどもっと活躍してもいい気がする。

定理:a,pが互いに素ならa^{p-1} \equiv 1 \pmod p

証明ついでに整数論の常識として知っておくとよさそう(忘れてたがw)なものを証明しておく。
5.1 互いに素なら割ったら余りはバラバラ

定理: ap が互いに素ならa \bmod p,2a \bmod p,\cdots,(p−1)a \bmod p はすべて異なる

証明概略:na \equiv ma \pmod pとすると(n -m)a \equiv 0 \pmod p
a,pは互いに素だからn \equiv m \pmod pだがこれはn \not \equiv m \pmod pに矛盾。

これを用いたフェルマーの小定理の証明

証明概略:全てのあまりがでるからa*2a* \cdots (p-1)a \equiv (p-1)! \pmod p
両辺(p-1)!でわる。

もういっこ
5.2 素数pの二項係数は1じゃなかったらpの倍数

定理:(x + y)^p \equiv x ^p + y ^p \pmod p

証明概略:k \neq 0,pのときp | \binom{p}{k}を示す。
\binom{p}{k} = p \frac{(p -1)(p-2) \cdots (p - k + 1)}{k!}であるがp素数0 < k < pよりpの倍数。

後編は、オイラーの定理、平方剰余、coppersmith'sの定理、4n+3型の二次合同式の解(だっけ?)などを予定してます。
まあちょっと難易度は上がるけどcoppersmith'sの定理とかは頻出なので、よければ後編もお付き合いください。