Gröbner基底と
多変数多項式暗号
taiyaki(@taiyaki_ctf) 魔女のお茶会 2022/春
アジェンダ
1. 自己紹介
2. 割り算のルール
3. Gröbner 基底
4. Buchberger アルゴリズム
5. 多変数多項式暗号 (+ CTFでの出題例)
2/47
自己紹介
• taiyaki (@taiyaki_ctf)
• [あさっち]とも言いますが、ローマ字表記ダサいので最近はあんまり使ってないです
• どっちで呼んでもらってもOK!
• 所属:KUDoS
• CTF歴約4年の自称よわよわcrypto民です。最強になりたい
• 意気込み:
• 「数学はちょっと…」みたいな人が発狂して逃げないようなプレゼン頑張ります
3/47
はじめに
• “~のもとで”“ …に対する”みたいな厳密な言い回しは極力避けます
• というか故意にボカしてます。悪しからず
4/47
Gröbner基底とは
ポン酢のやつ。
5/47
Gröbner基底とは
Q:なんでポン酢?
A:「グレブナー基底 ポン酢」でググってみてください。slideshare がオススメ
Q:なんの役に立つの?(Gröbner基底)
A:連立方程式とか数独とかいろいろ使える
Q:なんの役に立つの?(ポン酢)
A:鍋とか餃子とかいろいろ使える
6/47
Gröbner基底とは
Q:数独とか解くならPythonのz3ってツールでよくない?
A:z3では内部でGröbner基底が使われてます
7/47
割り算のルール
1変数の場合
Q1:𝑥2 を 𝑥 + 2 で割った余りを求めよ
A1:𝑥2 = 𝑥 + 2 𝑥 − 2 + 4 だから余りは 4
𝑥 + 2 𝑥 − 2 + 4
𝑥 + 2 より 4 のほうが小さい(という暗黙のルール)からここで終了
8/47
割り算のルール
多変数の場合
Q2:𝑥2
𝑦3
− 𝑦 を 𝑥 + 𝑦2
で割った余りを求めよ
【疑問その1】
まずそもそも…
൝
𝑥2
𝑦3
− 𝑦 = 𝑥 + 𝑦2
⋅ 𝑥𝑦3
− 𝑥𝑦5
− 𝑦
𝑥2
𝑦3
− 𝑦 = 𝑥 + 𝑦2
⋅ 𝑥2
𝑦 − 𝑥3
𝑦 − 𝑦
どっちのアプローチが正しい?
9/47
割り算のルール
正解は、「定義によってはどっちも正しくなりうる」
今回は以下のシンプルなルールを用いる (“辞書式順序”という):
1. まず 𝒙 の指数が大きいほうを優先。(𝑥𝑦100 より 𝑥2𝑦)
2. 𝑥 の指数が同じなら 𝒚 の指数が大きいほうを優先。(𝑥3
𝑦 より 𝑥3
𝑦4
)
この優先順位が高いことを、ここでは便宜上「大きい」と表現することにする
(例:𝑥𝑦100 より 𝑥2𝑦 の方が大きい)
他にも
• 次数付き辞書式順序
• 次数付き逆辞書式順序
などがある
10/47
割り算のルール
൝
𝑥2𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑥𝑦5 − 𝑦
𝑥2
𝑦3
− 𝑦 = 𝑥 + 𝑦2
⋅ 𝑥2
𝑦 − 𝑥3
𝑦 − 𝑦
【疑問その2】
なにをもって余り (割り算終了) とするか?
𝑥2
𝑦3
− 𝑦 = 𝑥 + 𝑦2
⋅ 𝑥𝑦3
− 𝑥𝑦5
− 𝑦
今回はこっちを採用
これは余り?それともまだ 𝑥 + 𝑦2 で割れる?
11/47
割り算のルール
割り算が終了となるのは
「余りのすべての項が、割る多項式の最大項で割り切れないとき」
なので、今回は 𝑥 で割れる項が存在していたら割り算を続けることになる
(残念ながら 𝑦2
の出番はない)
𝑥2𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑥𝑦5 − 𝑦
−𝑥𝑦5
− 𝑦 = 𝑥 + 𝑦2
⋅ −𝑦5
+ 𝑦7
− 𝑦
𝑥 + 𝑦2
𝑥
𝑦7
, −𝑦 ともに 𝑥 で
割り切れないのでこれが余り
12/47
Gröbner基底
Q3 辞書式順序を用いて
(1):「𝑥2𝑦3 − 𝑦 を 𝑥 + 𝑦2 で割った余り」を 𝑦 − 1 で割った余りを求めよ
(2):「𝑥2𝑦3 − 𝑦 を 𝑦 − 1 で割った余り」を 𝑥 + 𝑦2 で割った余りを求めよ
A3:
(1) 𝑥2𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑦5 + 𝑦7 − 𝑦
𝑦7 − 𝑦 = 𝑦 − 1 ⋅ 𝑦6 + 𝑦5 + 𝑦4 + 𝑦3 + 𝑦2 + 𝑦 + 0
【大事なポイント その1】
余りがゼロ
13/47
Gröbner基底
(1)の二式をまとめて(余りゼロなので)
𝑥2
𝑦3
− 𝑦 = 𝑥 + 𝑦2
⋅ 𝑥𝑦3
− 𝑦5
+ 𝑦 − 1 ⋅ 𝑦6
+ 𝑦5
+ 𝑦4
+ 𝑦3
+ 𝑦2
+ 𝑦
と表せる
このように
𝑥 + 𝑦2
⋅ ∎∎∎ + 𝑦 − 1 ⋅△△△
という形で表せるもの全体の集合を イデアル 𝑥 + 𝑦2
, 𝑦 − 1 と表現する
(分からなくなったら「イデアル=多項式の集合」くらいの認識でOK)
• 𝑥2
𝑦3
− 𝑦 = 𝑥 + 𝑦2
⋅ 𝑥𝑦3
− 𝑦5
+ 𝑦7
− 𝑦
• 𝑦7
− 𝑦 = 𝑦 − 1 ⋅ 𝑦6
+ 𝑦5
+ 𝑦4
+ 𝑦3
+ 𝑦2
+ 𝑦 + 0
14/47
Gröbner基底
(2) 𝑥2
𝑦3
− 𝑦 = 𝑦 − 1 ⋅ 𝑥2
𝑦2
+ 𝑥2
𝑦 + 𝑥2
− 1 + 𝑥2
− 1
𝑥2
− 1 = 𝑥 + 𝑦2
⋅ 𝑥 − 𝑦2
+ 𝑦4
− 1
一般に、割り算の順序を変えると余りが変わってしまう
→ 逆に、任意の(イデアルに属する)多項式を
• 𝐴 で割った余りを、さらに 𝐵 で割った余り
• 𝐵 で割った余りを、さらに 𝐴 で割った余り
が同じになるようなレアケース 𝐴, 𝐵 の組のことをGröbner基底という
【大事なポイント その2】
余りが(1)と違う
(注意) 𝑥, 𝑦 の2変数だからといって
ここも2個とは限らない。
(分かりやすく 𝐴, 𝐵 と表記しただけ)
15/47
Gröbner基底
(当然、)基底 𝑥 + 𝑦2
, 𝑦 − 1 はイデアル 𝑥 + 𝑦2
, 𝑦 − 1 のGröbner基底 ではない
【理由】
Q3で見た通り、多項式 𝑥2𝑦3 − 𝑦 は 𝑥 + 𝑦2, 𝑦 − 1で
割る順序を変えれば最後の余りが変わるから。
では…
Q4:イデアル 𝑥 − 𝑦2, 2𝑥 − 𝑦 − 1 のGröbner基底を求めよ
→ ここでBuchbergerアルゴルリズムの登場
ここまでを理解していないと
この表現は混乱するかも…
• 𝐴, 𝐵 : 要素数2の基底
• 𝐴, 𝐵 : 要素数無限の多項式の集合
諸事情により意図的に
パラメータ変更
16/47
Buchbergerアルゴリズム
【準備】 𝑆-多項式とは?
→ 2つの多項式の最大項を打ち消すような操作により作られる多項式のこと
例:𝑥3𝑦 − 2𝑦2 と 3𝑥𝑦2 + 1 の𝑆-多項式
𝑥3𝑦 − 2𝑦2 3𝑥𝑦2 + 1
最大項 最大項
3𝑥3
𝑦2
に統一
して引き算
𝑥3𝑦 − 2𝑦2 ⋅ 3𝑦 − 3𝑥𝑦2 + 1 ⋅ 𝑥2
= −6𝑦3
− 𝑥2
17/47
Buchbergerアルゴリズム
1. 𝐺 = 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1
2. while True:
3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔)
4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算
5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同)
6. 余りが 0 でないなら、それを 𝐺 に追加
7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了
8. 𝐺 がGröbner基底となる
Q4:イデアル 𝑥 − 𝑦2, 2𝑥 − 𝑦 − 1 の
Gröbner基底を求めよ
18/47
Buchbergerアルゴリズム
1. 𝐺 = 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1
2. while True:
3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔)
4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算
5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同)
6. 余りが 0 でないなら、それを 𝐺 に追加
7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了
8. 𝐺 がGröbner基底となる
𝑓 = 𝑥 − 𝑦2
𝑔 = 2𝑥 − 𝑦 − 1
19/47
Buchbergerアルゴリズム
1. 𝐺 = 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1
2. while True:
3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔)
4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算
5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同)
6. 余りが 0 でないなら、それを 𝐺 に追加
7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了。
8. 𝐺 がGröbner基底となる
𝑓 = 𝑥 − 𝑦2, 𝑔 = 2𝑥 − 𝑦 − 1
の最大項を消す操作。今回は 2𝑥 で統一
↓
𝑥 − 𝑦2
⋅ 2 − 2𝑥 − 𝑦 − 1 ⋅ 1 = −2𝑦2
+ 𝑦 + 1
20/47
Buchbergerアルゴリズム
1. 𝐺 = 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1
2. while True:
3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔)
4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算
5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同)
6. 余りが 0 でないなら、それを 𝐺 に追加
7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了
8. 𝐺 がGröbner基底となる
−2𝑦2
+ 𝑦 + 1 を 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1 で割る
↓
(これ以上割り切れないので)
余りは −2𝑦2 + 𝑦 + 1
21/47
Buchbergerアルゴリズム
1. 𝐺 = 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1
2. while True:
3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔)
4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算
5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同)
6. 余りが 0 でないなら、それを 𝐺 に追加
7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了
8. 𝐺 がGröbner基底となる
𝐺 = 𝑥 − 𝑦2, 2𝑥 − 𝑦 − 1, −2𝑦2 + 𝑦 + 1 に更新
𝐺 の要素が増えたので 3. に戻る
(以下省略)
22/47
Buchbergerアルゴリズム
1. 𝐺 = 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1
2. while True:
3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔)
4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算
5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同)
6. 余りが 0 でないなら、それを 𝐺 に追加
7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了
8. 𝐺 がGröbner基底となる
最終的に
𝐺 = 2𝑥 − 𝑦 − 1, −2𝑦2
+ 𝑦 + 1
になる
(簡約化や正当性については今回は省略)
23/47
Buchbergerアルゴリズム
Q:Gröbner基底がなぜ連立方程式を解くのに役立つか?
以下の連立方程式を考える:
ቊ
𝑦2
= 𝑥
𝑦 + 1 = 2𝑥
一般には片方の変数を消去する解法 → ここでは 𝑥 を消去してみる
ቊ
2𝑦2
= 2𝑥
𝑦 + 1 = 2𝑥
→ 2𝑦2
= 𝑦 + 1
→ −2𝑦2
+ 𝑦 + 1 = 0
どこかで見たのでは…?
24/47
Buchbergerアルゴリズム
1. 𝐺 = 𝑥 − 𝑦2
, 2𝑥 − 𝑦 − 1
2. while True:
3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔)
4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算
5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同)
6. 余りが 0 でないなら、それを 𝐺 に追加
7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了。
8. 𝐺 がGröbner基底となる
𝑓 = 𝑥 − 𝑦2, 𝑔 = 2𝑥 − 𝑦 − 1
の最大項を消す操作。今回は 2𝑥 で統一
↓
𝑥 − 𝑦2
⋅ 2 − 2𝑥 − 𝑦 − 1 ⋅ 1 = −2𝑦2
+ 𝑦 + 1
𝑆-多項式の計算は変数消去に
近いことをやっている
25/47
Buchbergerアルゴリズム
【ここまでのまとめ】
൞
𝑥2 + 𝑦 = 3
𝑦2 + 2𝑧 = 10
𝑧2
+ 3𝑥 = 12
のような連立方程式を解きたい
→ イデアル 𝑥2
+ 𝑦 − 3, 𝑦2
+ 2𝑧 − 10, 𝑧2
+ 3𝑥 − 12 に対して
Buchbergerアルゴリズムを走らせれば変数消去的なことができる
→ 最終的に得られたGröbner基底には、(例えば 𝑧 だけの)一変数の式が存在する
→ それを解けばいい!(SageMathのコードはAppendix参照)
上手くいかない可能性もあり
26/47
多変数多項式暗号
Buchbergerアルゴリズムをはじめとする、Gröbner基底を求める
アルゴリズムは全く効率的ではない
→ それどころか、一般の 𝑛 変数の連立方程式を解くのはNP困難になる
これを逆手に取り、
• 解きやすい連立方程式を秘密鍵
• 解きにくい連立方程式を公開鍵
にした暗号化方式を多変数多項式暗号(Multivariate Quadratic Crypto)という
27/47
多変数多項式暗号
(例)Substitution Cipher Ⅲ, DownUnderCTF 2021 (Author: @josep68_h)
↑
松本-今井暗号に対するPatarinの攻撃から着想を得た問題
スペースの都合上、𝑥, 𝑦, 𝑧 の3変数(3bit)で説明するが、実際の問題では80変数
28/47
多変数多項式暗号
秘密鍵は3つの関数 𝑆, 𝑃, 𝑇 (と補助として 𝜑)
公開鍵は 𝑅 ≔ 𝑇 ∘ 𝜑−1 ∘ 𝑃 ∘ 𝜑 ∘ 𝑆
平文
(𝜑 作用) (𝜑−1
作用)
暗号文
アフィン変換 𝑆 アフィン変換 𝑇
解きやすい連立方程式 𝑃
int-char 間の変換のような
糊付け的な認識でOK
解きにくい連立方程式 𝑅
29/47
多変数多項式暗号
𝑆:
𝑥
𝑦
𝑧
↦
1 0 0
1 1 1
1 1 0
⋅
𝑥
𝑦
𝑧
+
1
0
0
平文
(𝜑 作用) (𝜑−1
作用)
暗号文
アフィン変換 𝑆 アフィン変換 𝑇
解きやすい連立方程式 𝑃
解きにくい連立方程式 𝑅
𝑥, 𝑦, 𝑧 を引数にとり
𝑥 + 1, 𝑥 + 𝑦 + 𝑧, 𝑥 + 𝑦
を出力
30/47
多変数多項式暗号
𝜑:
𝑥′
𝑦′
𝑧′
↦ 𝑥′ + 𝑦′𝑡 + 𝑧′𝑡2
平文
(𝝋 作用) (𝜑−1
作用)
暗号文
アフィン変換 𝑆 アフィン変換 𝑇
解きやすい連立方程式 𝑃
解きにくい連立方程式 𝑅
𝑥′, 𝑦′, 𝑧′ を係数に持つ
𝑡 の2次式 𝑓 𝑡 に変換
31/47
多変数多項式暗号
𝑃: 𝑓 𝑡 ↦ 𝑡2 + 1 ⋅ 𝑓 𝑡 3 % 𝑡3 + 𝑡 + 1
平文
(𝜑 作用) (𝜑−1
作用)
暗号文
アフィン変換 𝑆 アフィン変換 𝑇
解きやすい連立方程式 𝑃
解きにくい連立方程式 𝑅
𝑡2
+ 1 ⋅ 𝑓 𝑡 3
を 𝑡3
+ 𝑡 + 1 で割った
余り 𝑔 𝑡 を計算する
なお、𝑡3
+ 𝑡 + 1 は既知 (既約元という)
32/47
多変数多項式暗号
𝜑−1: 𝑥′′ + 𝑦′′𝑡 + 𝑧′′𝑡2 ↦
𝑥′′
𝑦′′
𝑧′′
平文
(𝜑 作用) (𝝋−𝟏
作用)
暗号文
アフィン変換 𝑆 アフィン変換 𝑇
解きやすい連立方程式 𝑃
解きにくい連立方程式 𝑅
𝑡 の2次式 𝑔 𝑡 の係数
𝑥′′, 𝑦′′, 𝑧′′ をベクトルとして抽出
33/47
多変数多項式暗号
𝑇:
𝑥′′
𝑦′′
𝑧′′
↦
1 0 1
1 1 0
1 1 1
⋅
𝑥′′
𝑦′′
𝑧′′
+
1
0
1
平文
(𝜑 作用) (𝜑−1
作用)
暗号文
アフィン変換 𝑆 アフィン変換 𝑇
解きやすい連立方程式 𝑃
解きにくい連立方程式 𝑅
𝑥′′, 𝑦′′, 𝑧′′ を引数にとり
𝑥′′ + 𝑧′′ + 1, 𝑥′′ + 𝑦′′, 𝑥′′ + 𝑦′′ + 𝑧′′ + 1
を出力
34/47
多変数多項式暗号
𝑅:
𝑥
𝑦
𝑧
↦
𝑥𝑧 + 𝑥 + 𝑦 + 1
𝑥𝑦 + 𝑥𝑧 + 𝑦𝑧 + 1
𝑥𝑦 + 𝑦 + 𝑧 + 1
平文
(𝜑 作用) (𝜑−1
作用)
暗号文
アフィン変換 𝑆 アフィン変換 𝑇
解きやすい連立方程式 𝑃
解きにくい連立方程式 𝑅
公開鍵として与えられるのは
この関数だけ
35/47
多変数多項式暗号
【補足】
• 𝑥, 𝑦, 𝑧 といった 𝑡 の係数は基本的に mod 2 (もう少し言うと𝔽2)
• 𝑡自体は、3次式以上になったら既約元 𝑡3 + 𝑡 + 1 で割って次数下げする
なお、実際の問題で与えられた公開鍵はこんな感じ↓
36/47
多変数多項式暗号
【前提】
𝑓 𝑡 = 𝑡2 に多項式 𝑐0 + 𝑐1𝑡 + 𝑐2𝑡2 を代入すると、
𝑓 𝑐0 + 𝑐1𝑡 + 𝑐2𝑡2
= 𝑐0
2
+ 𝑐1
2
𝑡2 + 𝑐2
2
𝑡4 + 2 ⋅ 𝑐0𝑐1𝑡 + ⋯
= 𝑐0 + 𝑐1𝑡2 + 𝑐2𝑡4
係数はmod 2で考えているので
後半は全て無視してOK
本当はこの後さらに
既約元で割る必要あり
mod 2なら2乗の前後で値(偶奇)は変化しないので
係数に2乗は登場しない!
37/47
多変数多項式暗号
これは 𝑓 𝑥 = 𝑥4
としても成立する。(同様に証明可能)
↓
係数が1次の 𝑡 の多項式は、2乗しても4乗しても
係数は1次のまま
38/47
多変数多項式暗号
ここで改めて多変数多項式暗号のフローチャートを見てみる
→ 𝜑 を作用させたあとを 𝐴, 𝜑−1 を作用させる前を 𝐵 とする
平文 𝑥, 𝑦, 𝑧
(𝜑 作用) (𝜑−1 作用)
暗号文 (𝑋, 𝑌, 𝑍)
𝑆: 𝑥, 𝑦, 𝑧
↦ 𝑥 + 1, 𝑥 + 𝑦 + 𝑧, 𝑥 + 𝑦
𝑃
𝑅
𝐴 𝐵
𝑇: 𝑥, 𝑦, 𝑧
↦ 𝑥 + 𝑧 + 1, 𝑥 + 𝑦, 𝑥 + 𝑦 + 𝑧 + 1
39/47
多変数多項式暗号
ここでのポイントは
𝐴 = 𝑥, 𝑦, 𝑧の1次式 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡2
となっていること
平文 𝑥, 𝑦, 𝑧
(𝜑 作用) (𝜑−1
作用)
暗号文 (𝑋, 𝑌, 𝑍)
𝑆: 𝑥, 𝑦, 𝑧
↦ 𝑥 + 1, 𝑥 + 𝑦 + 𝑧, 𝑥 + 𝑦
𝑃
𝑅
𝐴 𝐵
𝐴 = 𝑥 + 1 + 𝑥 + 𝑦 + 𝑧 𝑡 + 𝑥 + 𝑦 𝑡2
40/47
多変数多項式暗号
同様に、
𝐵 = 𝑋, 𝑌, 𝑍の1次式 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡2
→ では 𝐴 と 𝐵 を結ぶ関係性は何だったか?
平文 𝑥, 𝑦, 𝑧
(𝜑 作用) (𝜑−1
作用)
暗号文 (𝑋, 𝑌, 𝑍)
𝑃
𝑅
𝐴 𝐵
𝑇: 𝑥, 𝑦, 𝑧
↦ 𝑥 + 𝑧 + 1, 𝑥 + 𝑦, 𝑥 + 𝑦 + 𝑧 + 1
41/47
多変数多項式暗号
𝑃: 𝑓 𝑡 ↦ 𝑡2
+ 1 ⋅ 𝑓 𝑡 3
だったので(既約元での割り算は省略)、
𝐵 = 𝑡2 + 1 ⋅ 𝐴3
両辺に 𝐴𝐵 を掛けて
𝐴𝐵2
= 𝑡2
+ 1 ⋅ 𝐴4
𝐵
ということを踏まえつつ、
ここに先ほどの 𝐴 と 𝐵 を代入すると…
42/47
多変数多項式暗号
𝐴𝐵2
= 𝑡2
+ 1 ⋅ 𝐴4
𝐵
𝑥, 𝑦, 𝑧の1次式 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡2
𝑋, 𝑌, 𝑍の1次式 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡2
43/47
多変数多項式暗号
𝐴𝐵2
= 𝑡2
+ 1 ⋅ 𝐴4
𝐵
𝑥, 𝑦, 𝑧の1次式 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡2
𝑋, 𝑌, 𝑍の1次式 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡2
44/47
多変数多項式暗号
わかりにくいのでさらに次数下げした例:
𝐴 = 𝑐0𝑥 + 𝑐1𝑦 + 𝑐2
𝐵 = 𝑑0𝑋 + 𝑑1𝑌 + 𝑑2
とすると、1次式のままなので
𝐴4
= 𝑐0
′
𝑥 + 𝑐1
′
𝑦 + 𝑐2
′
𝐵2 = 𝑑0
′
𝑋 + 𝑑1
′
𝑌 + 𝑑2
′
これを再び 𝐴𝐵2
= 𝑒 ⋅ 𝐴4
𝐵 に代入してみる。
𝑥, 𝑦 : 入力となる平文
𝑋, 𝑌 : 出力となる暗号文
𝑐𝑖, 𝑑𝑖: 秘密鍵に関するパラメータ(未知)
𝐴𝐵2
= 𝑡2
+ 1 𝐴4
𝐵
この部分も秘密鍵なので変数 𝑒 に変換
45/47
多変数多項式暗号
𝑐0𝑥 + 𝑐1𝑦 + 𝑐2 𝑑0
′
𝑋 + 𝑑1
′
𝑌 + 𝑑2
′
= 𝑒 𝑐0
′
𝑥 + 𝑐1
′
𝑦 + 𝑐2
′
𝑑0𝑋 + 𝑑1𝑌 + 𝑑2
この未知パラメータは入力、出力には依存しない
→ 例えば
「平文 𝑥, 𝑦 = (0,1) を入力したら暗号文 𝑋, 𝑌 = (1,1) が返ってきた」
といった情報を大量に(オーダーとしてはbit長の2乗個)集めれば、
𝑐𝑖 などのパラメータを完全に復元可能 (crypto民なら見たことある形のはず)
46/47
最後に
なるほど、わからん。
47/47
[Appendix] SageMathでのGröbner基底の計算
൞
𝑥2
+ 𝑦 = 3
𝑦2 + 2𝑧 = 10
𝑧2
+ 3𝑥 = 12
のような連立方程式の場合
P.<x,y,z> = PolynomialRing(QQ, order=‘lex’)
I = ideal(x^2 + y – 3, y^2 + 2*z – 10, z^2 + 3*x - 12)
B = I.groebner_basis()
print(B)
辞書式順序なら‘lex’
次数付き辞書式順序なら‘deglex’
次数付き逆辞書式順序なら‘degrevlex’
単に連立方程式の解が欲しいだけなら
print(I.variety(QQbar))
48/47
参考文献
[MI88] Matsumoto, Tsutomu, and Hideki Imai. "Public quadratic polynomial-
tuples for efficient signature-verification and message-encryption."
Workshop on the Theory and Application of of Cryptographic Techniques.
Springer, Berlin, Heidelberg, 1988.
[Pat95] Patarin, Jacques. "Cryptanalysis of the Matsumoto and Imai public
key scheme of Eurocrypt’88." Annual international cryptology conference.
Springer, Berlin, Heidelberg, 1995.
DownUnderCTF 2021 Writeups | joseph's blog
(https://jsur.in/posts/2021-09-26-ductf-2021-writeups#substitution-
cipher-iii)
49/47

魔女のお茶会.pdf

  • 1.
  • 2.
    アジェンダ 1. 自己紹介 2. 割り算のルール 3.Gröbner 基底 4. Buchberger アルゴリズム 5. 多変数多項式暗号 (+ CTFでの出題例) 2/47
  • 3.
    自己紹介 • taiyaki (@taiyaki_ctf) •[あさっち]とも言いますが、ローマ字表記ダサいので最近はあんまり使ってないです • どっちで呼んでもらってもOK! • 所属:KUDoS • CTF歴約4年の自称よわよわcrypto民です。最強になりたい • 意気込み: • 「数学はちょっと…」みたいな人が発狂して逃げないようなプレゼン頑張ります 3/47
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    割り算のルール 1変数の場合 Q1:𝑥2 を 𝑥+ 2 で割った余りを求めよ A1:𝑥2 = 𝑥 + 2 𝑥 − 2 + 4 だから余りは 4 𝑥 + 2 𝑥 − 2 + 4 𝑥 + 2 より 4 のほうが小さい(という暗黙のルール)からここで終了 8/47
  • 9.
    割り算のルール 多変数の場合 Q2:𝑥2 𝑦3 − 𝑦 を𝑥 + 𝑦2 で割った余りを求めよ 【疑問その1】 まずそもそも… ൝ 𝑥2 𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑥𝑦5 − 𝑦 𝑥2 𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥2 𝑦 − 𝑥3 𝑦 − 𝑦 どっちのアプローチが正しい? 9/47
  • 10.
    割り算のルール 正解は、「定義によってはどっちも正しくなりうる」 今回は以下のシンプルなルールを用いる (“辞書式順序”という): 1. まず𝒙 の指数が大きいほうを優先。(𝑥𝑦100 より 𝑥2𝑦) 2. 𝑥 の指数が同じなら 𝒚 の指数が大きいほうを優先。(𝑥3 𝑦 より 𝑥3 𝑦4 ) この優先順位が高いことを、ここでは便宜上「大きい」と表現することにする (例:𝑥𝑦100 より 𝑥2𝑦 の方が大きい) 他にも • 次数付き辞書式順序 • 次数付き逆辞書式順序 などがある 10/47
  • 11.
    割り算のルール ൝ 𝑥2𝑦3 − 𝑦= 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑥𝑦5 − 𝑦 𝑥2 𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥2 𝑦 − 𝑥3 𝑦 − 𝑦 【疑問その2】 なにをもって余り (割り算終了) とするか? 𝑥2 𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑥𝑦5 − 𝑦 今回はこっちを採用 これは余り?それともまだ 𝑥 + 𝑦2 で割れる? 11/47
  • 12.
    割り算のルール 割り算が終了となるのは 「余りのすべての項が、割る多項式の最大項で割り切れないとき」 なので、今回は 𝑥 で割れる項が存在していたら割り算を続けることになる (残念ながら𝑦2 の出番はない) 𝑥2𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑥𝑦5 − 𝑦 −𝑥𝑦5 − 𝑦 = 𝑥 + 𝑦2 ⋅ −𝑦5 + 𝑦7 − 𝑦 𝑥 + 𝑦2 𝑥 𝑦7 , −𝑦 ともに 𝑥 で 割り切れないのでこれが余り 12/47
  • 13.
    Gröbner基底 Q3 辞書式順序を用いて (1):「𝑥2𝑦3 −𝑦 を 𝑥 + 𝑦2 で割った余り」を 𝑦 − 1 で割った余りを求めよ (2):「𝑥2𝑦3 − 𝑦 を 𝑦 − 1 で割った余り」を 𝑥 + 𝑦2 で割った余りを求めよ A3: (1) 𝑥2𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑦5 + 𝑦7 − 𝑦 𝑦7 − 𝑦 = 𝑦 − 1 ⋅ 𝑦6 + 𝑦5 + 𝑦4 + 𝑦3 + 𝑦2 + 𝑦 + 0 【大事なポイント その1】 余りがゼロ 13/47
  • 14.
    Gröbner基底 (1)の二式をまとめて(余りゼロなので) 𝑥2 𝑦3 − 𝑦 =𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑦5 + 𝑦 − 1 ⋅ 𝑦6 + 𝑦5 + 𝑦4 + 𝑦3 + 𝑦2 + 𝑦 と表せる このように 𝑥 + 𝑦2 ⋅ ∎∎∎ + 𝑦 − 1 ⋅△△△ という形で表せるもの全体の集合を イデアル 𝑥 + 𝑦2 , 𝑦 − 1 と表現する (分からなくなったら「イデアル=多項式の集合」くらいの認識でOK) • 𝑥2 𝑦3 − 𝑦 = 𝑥 + 𝑦2 ⋅ 𝑥𝑦3 − 𝑦5 + 𝑦7 − 𝑦 • 𝑦7 − 𝑦 = 𝑦 − 1 ⋅ 𝑦6 + 𝑦5 + 𝑦4 + 𝑦3 + 𝑦2 + 𝑦 + 0 14/47
  • 15.
    Gröbner基底 (2) 𝑥2 𝑦3 − 𝑦= 𝑦 − 1 ⋅ 𝑥2 𝑦2 + 𝑥2 𝑦 + 𝑥2 − 1 + 𝑥2 − 1 𝑥2 − 1 = 𝑥 + 𝑦2 ⋅ 𝑥 − 𝑦2 + 𝑦4 − 1 一般に、割り算の順序を変えると余りが変わってしまう → 逆に、任意の(イデアルに属する)多項式を • 𝐴 で割った余りを、さらに 𝐵 で割った余り • 𝐵 で割った余りを、さらに 𝐴 で割った余り が同じになるようなレアケース 𝐴, 𝐵 の組のことをGröbner基底という 【大事なポイント その2】 余りが(1)と違う (注意) 𝑥, 𝑦 の2変数だからといって ここも2個とは限らない。 (分かりやすく 𝐴, 𝐵 と表記しただけ) 15/47
  • 16.
    Gröbner基底 (当然、)基底 𝑥 +𝑦2 , 𝑦 − 1 はイデアル 𝑥 + 𝑦2 , 𝑦 − 1 のGröbner基底 ではない 【理由】 Q3で見た通り、多項式 𝑥2𝑦3 − 𝑦 は 𝑥 + 𝑦2, 𝑦 − 1で 割る順序を変えれば最後の余りが変わるから。 では… Q4:イデアル 𝑥 − 𝑦2, 2𝑥 − 𝑦 − 1 のGröbner基底を求めよ → ここでBuchbergerアルゴルリズムの登場 ここまでを理解していないと この表現は混乱するかも… • 𝐴, 𝐵 : 要素数2の基底 • 𝐴, 𝐵 : 要素数無限の多項式の集合 諸事情により意図的に パラメータ変更 16/47
  • 17.
    Buchbergerアルゴリズム 【準備】 𝑆-多項式とは? → 2つの多項式の最大項を打ち消すような操作により作られる多項式のこと 例:𝑥3𝑦− 2𝑦2 と 3𝑥𝑦2 + 1 の𝑆-多項式 𝑥3𝑦 − 2𝑦2 3𝑥𝑦2 + 1 最大項 最大項 3𝑥3 𝑦2 に統一 して引き算 𝑥3𝑦 − 2𝑦2 ⋅ 3𝑦 − 3𝑥𝑦2 + 1 ⋅ 𝑥2 = −6𝑦3 − 𝑥2 17/47
  • 18.
    Buchbergerアルゴリズム 1. 𝐺 =𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 2. while True: 3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔) 4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算 5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同) 6. 余りが 0 でないなら、それを 𝐺 に追加 7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了 8. 𝐺 がGröbner基底となる Q4:イデアル 𝑥 − 𝑦2, 2𝑥 − 𝑦 − 1 の Gröbner基底を求めよ 18/47
  • 19.
    Buchbergerアルゴリズム 1. 𝐺 =𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 2. while True: 3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔) 4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算 5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同) 6. 余りが 0 でないなら、それを 𝐺 に追加 7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了 8. 𝐺 がGröbner基底となる 𝑓 = 𝑥 − 𝑦2 𝑔 = 2𝑥 − 𝑦 − 1 19/47
  • 20.
    Buchbergerアルゴリズム 1. 𝐺 =𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 2. while True: 3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔) 4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算 5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同) 6. 余りが 0 でないなら、それを 𝐺 に追加 7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了。 8. 𝐺 がGröbner基底となる 𝑓 = 𝑥 − 𝑦2, 𝑔 = 2𝑥 − 𝑦 − 1 の最大項を消す操作。今回は 2𝑥 で統一 ↓ 𝑥 − 𝑦2 ⋅ 2 − 2𝑥 − 𝑦 − 1 ⋅ 1 = −2𝑦2 + 𝑦 + 1 20/47
  • 21.
    Buchbergerアルゴリズム 1. 𝐺 =𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 2. while True: 3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔) 4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算 5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同) 6. 余りが 0 でないなら、それを 𝐺 に追加 7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了 8. 𝐺 がGröbner基底となる −2𝑦2 + 𝑦 + 1 を 𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 で割る ↓ (これ以上割り切れないので) 余りは −2𝑦2 + 𝑦 + 1 21/47
  • 22.
    Buchbergerアルゴリズム 1. 𝐺 =𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 2. while True: 3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔) 4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算 5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同) 6. 余りが 0 でないなら、それを 𝐺 に追加 7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了 8. 𝐺 がGröbner基底となる 𝐺 = 𝑥 − 𝑦2, 2𝑥 − 𝑦 − 1, −2𝑦2 + 𝑦 + 1 に更新 𝐺 の要素が増えたので 3. に戻る (以下省略) 22/47
  • 23.
    Buchbergerアルゴリズム 1. 𝐺 =𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 2. while True: 3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔) 4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算 5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同) 6. 余りが 0 でないなら、それを 𝐺 に追加 7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了 8. 𝐺 がGröbner基底となる 最終的に 𝐺 = 2𝑥 − 𝑦 − 1, −2𝑦2 + 𝑦 + 1 になる (簡約化や正当性については今回は省略) 23/47
  • 24.
    Buchbergerアルゴリズム Q:Gröbner基底がなぜ連立方程式を解くのに役立つか? 以下の連立方程式を考える: ቊ 𝑦2 = 𝑥 𝑦 +1 = 2𝑥 一般には片方の変数を消去する解法 → ここでは 𝑥 を消去してみる ቊ 2𝑦2 = 2𝑥 𝑦 + 1 = 2𝑥 → 2𝑦2 = 𝑦 + 1 → −2𝑦2 + 𝑦 + 1 = 0 どこかで見たのでは…? 24/47
  • 25.
    Buchbergerアルゴリズム 1. 𝐺 =𝑥 − 𝑦2 , 2𝑥 − 𝑦 − 1 2. while True: 3. 𝐺 内の要素から2個とってきて 𝑓, 𝑔 とする (𝑓 ≠ 𝑔) 4. 𝑓, 𝑔 の𝑆-多項式 𝑆 𝑓, 𝑔 を計算 5. 𝑆 𝑓, 𝑔 を 𝐺 内の全てで割って余りを計算 (順不同) 6. 余りが 0 でないなら、それを 𝐺 に追加 7. ステップ3のどの2要素をとっても 𝐺 が増えないなら終了。 8. 𝐺 がGröbner基底となる 𝑓 = 𝑥 − 𝑦2, 𝑔 = 2𝑥 − 𝑦 − 1 の最大項を消す操作。今回は 2𝑥 で統一 ↓ 𝑥 − 𝑦2 ⋅ 2 − 2𝑥 − 𝑦 − 1 ⋅ 1 = −2𝑦2 + 𝑦 + 1 𝑆-多項式の計算は変数消去に 近いことをやっている 25/47
  • 26.
    Buchbergerアルゴリズム 【ここまでのまとめ】 ൞ 𝑥2 + 𝑦= 3 𝑦2 + 2𝑧 = 10 𝑧2 + 3𝑥 = 12 のような連立方程式を解きたい → イデアル 𝑥2 + 𝑦 − 3, 𝑦2 + 2𝑧 − 10, 𝑧2 + 3𝑥 − 12 に対して Buchbergerアルゴリズムを走らせれば変数消去的なことができる → 最終的に得られたGröbner基底には、(例えば 𝑧 だけの)一変数の式が存在する → それを解けばいい!(SageMathのコードはAppendix参照) 上手くいかない可能性もあり 26/47
  • 27.
    多変数多項式暗号 Buchbergerアルゴリズムをはじめとする、Gröbner基底を求める アルゴリズムは全く効率的ではない → それどころか、一般の 𝑛変数の連立方程式を解くのはNP困難になる これを逆手に取り、 • 解きやすい連立方程式を秘密鍵 • 解きにくい連立方程式を公開鍵 にした暗号化方式を多変数多項式暗号(Multivariate Quadratic Crypto)という 27/47
  • 28.
    多変数多項式暗号 (例)Substitution Cipher Ⅲ,DownUnderCTF 2021 (Author: @josep68_h) ↑ 松本-今井暗号に対するPatarinの攻撃から着想を得た問題 スペースの都合上、𝑥, 𝑦, 𝑧 の3変数(3bit)で説明するが、実際の問題では80変数 28/47
  • 29.
    多変数多項式暗号 秘密鍵は3つの関数 𝑆, 𝑃,𝑇 (と補助として 𝜑) 公開鍵は 𝑅 ≔ 𝑇 ∘ 𝜑−1 ∘ 𝑃 ∘ 𝜑 ∘ 𝑆 平文 (𝜑 作用) (𝜑−1 作用) 暗号文 アフィン変換 𝑆 アフィン変換 𝑇 解きやすい連立方程式 𝑃 int-char 間の変換のような 糊付け的な認識でOK 解きにくい連立方程式 𝑅 29/47
  • 30.
    多変数多項式暗号 𝑆: 𝑥 𝑦 𝑧 ↦ 1 0 0 11 1 1 1 0 ⋅ 𝑥 𝑦 𝑧 + 1 0 0 平文 (𝜑 作用) (𝜑−1 作用) 暗号文 アフィン変換 𝑆 アフィン変換 𝑇 解きやすい連立方程式 𝑃 解きにくい連立方程式 𝑅 𝑥, 𝑦, 𝑧 を引数にとり 𝑥 + 1, 𝑥 + 𝑦 + 𝑧, 𝑥 + 𝑦 を出力 30/47
  • 31.
    多変数多項式暗号 𝜑: 𝑥′ 𝑦′ 𝑧′ ↦ 𝑥′ +𝑦′𝑡 + 𝑧′𝑡2 平文 (𝝋 作用) (𝜑−1 作用) 暗号文 アフィン変換 𝑆 アフィン変換 𝑇 解きやすい連立方程式 𝑃 解きにくい連立方程式 𝑅 𝑥′, 𝑦′, 𝑧′ を係数に持つ 𝑡 の2次式 𝑓 𝑡 に変換 31/47
  • 32.
    多変数多項式暗号 𝑃: 𝑓 𝑡↦ 𝑡2 + 1 ⋅ 𝑓 𝑡 3 % 𝑡3 + 𝑡 + 1 平文 (𝜑 作用) (𝜑−1 作用) 暗号文 アフィン変換 𝑆 アフィン変換 𝑇 解きやすい連立方程式 𝑃 解きにくい連立方程式 𝑅 𝑡2 + 1 ⋅ 𝑓 𝑡 3 を 𝑡3 + 𝑡 + 1 で割った 余り 𝑔 𝑡 を計算する なお、𝑡3 + 𝑡 + 1 は既知 (既約元という) 32/47
  • 33.
    多変数多項式暗号 𝜑−1: 𝑥′′ +𝑦′′𝑡 + 𝑧′′𝑡2 ↦ 𝑥′′ 𝑦′′ 𝑧′′ 平文 (𝜑 作用) (𝝋−𝟏 作用) 暗号文 アフィン変換 𝑆 アフィン変換 𝑇 解きやすい連立方程式 𝑃 解きにくい連立方程式 𝑅 𝑡 の2次式 𝑔 𝑡 の係数 𝑥′′, 𝑦′′, 𝑧′′ をベクトルとして抽出 33/47
  • 34.
    多変数多項式暗号 𝑇: 𝑥′′ 𝑦′′ 𝑧′′ ↦ 1 0 1 11 0 1 1 1 ⋅ 𝑥′′ 𝑦′′ 𝑧′′ + 1 0 1 平文 (𝜑 作用) (𝜑−1 作用) 暗号文 アフィン変換 𝑆 アフィン変換 𝑇 解きやすい連立方程式 𝑃 解きにくい連立方程式 𝑅 𝑥′′, 𝑦′′, 𝑧′′ を引数にとり 𝑥′′ + 𝑧′′ + 1, 𝑥′′ + 𝑦′′, 𝑥′′ + 𝑦′′ + 𝑧′′ + 1 を出力 34/47
  • 35.
    多変数多項式暗号 𝑅: 𝑥 𝑦 𝑧 ↦ 𝑥𝑧 + 𝑥+ 𝑦 + 1 𝑥𝑦 + 𝑥𝑧 + 𝑦𝑧 + 1 𝑥𝑦 + 𝑦 + 𝑧 + 1 平文 (𝜑 作用) (𝜑−1 作用) 暗号文 アフィン変換 𝑆 アフィン変換 𝑇 解きやすい連立方程式 𝑃 解きにくい連立方程式 𝑅 公開鍵として与えられるのは この関数だけ 35/47
  • 36.
    多変数多項式暗号 【補足】 • 𝑥, 𝑦,𝑧 といった 𝑡 の係数は基本的に mod 2 (もう少し言うと𝔽2) • 𝑡自体は、3次式以上になったら既約元 𝑡3 + 𝑡 + 1 で割って次数下げする なお、実際の問題で与えられた公開鍵はこんな感じ↓ 36/47
  • 37.
    多変数多項式暗号 【前提】 𝑓 𝑡 =𝑡2 に多項式 𝑐0 + 𝑐1𝑡 + 𝑐2𝑡2 を代入すると、 𝑓 𝑐0 + 𝑐1𝑡 + 𝑐2𝑡2 = 𝑐0 2 + 𝑐1 2 𝑡2 + 𝑐2 2 𝑡4 + 2 ⋅ 𝑐0𝑐1𝑡 + ⋯ = 𝑐0 + 𝑐1𝑡2 + 𝑐2𝑡4 係数はmod 2で考えているので 後半は全て無視してOK 本当はこの後さらに 既約元で割る必要あり mod 2なら2乗の前後で値(偶奇)は変化しないので 係数に2乗は登場しない! 37/47
  • 38.
    多変数多項式暗号 これは 𝑓 𝑥= 𝑥4 としても成立する。(同様に証明可能) ↓ 係数が1次の 𝑡 の多項式は、2乗しても4乗しても 係数は1次のまま 38/47
  • 39.
    多変数多項式暗号 ここで改めて多変数多項式暗号のフローチャートを見てみる → 𝜑 を作用させたあとを𝐴, 𝜑−1 を作用させる前を 𝐵 とする 平文 𝑥, 𝑦, 𝑧 (𝜑 作用) (𝜑−1 作用) 暗号文 (𝑋, 𝑌, 𝑍) 𝑆: 𝑥, 𝑦, 𝑧 ↦ 𝑥 + 1, 𝑥 + 𝑦 + 𝑧, 𝑥 + 𝑦 𝑃 𝑅 𝐴 𝐵 𝑇: 𝑥, 𝑦, 𝑧 ↦ 𝑥 + 𝑧 + 1, 𝑥 + 𝑦, 𝑥 + 𝑦 + 𝑧 + 1 39/47
  • 40.
    多変数多項式暗号 ここでのポイントは 𝐴 = 𝑥,𝑦, 𝑧の1次式 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡2 となっていること 平文 𝑥, 𝑦, 𝑧 (𝜑 作用) (𝜑−1 作用) 暗号文 (𝑋, 𝑌, 𝑍) 𝑆: 𝑥, 𝑦, 𝑧 ↦ 𝑥 + 1, 𝑥 + 𝑦 + 𝑧, 𝑥 + 𝑦 𝑃 𝑅 𝐴 𝐵 𝐴 = 𝑥 + 1 + 𝑥 + 𝑦 + 𝑧 𝑡 + 𝑥 + 𝑦 𝑡2 40/47
  • 41.
    多変数多項式暗号 同様に、 𝐵 = 𝑋,𝑌, 𝑍の1次式 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡2 → では 𝐴 と 𝐵 を結ぶ関係性は何だったか? 平文 𝑥, 𝑦, 𝑧 (𝜑 作用) (𝜑−1 作用) 暗号文 (𝑋, 𝑌, 𝑍) 𝑃 𝑅 𝐴 𝐵 𝑇: 𝑥, 𝑦, 𝑧 ↦ 𝑥 + 𝑧 + 1, 𝑥 + 𝑦, 𝑥 + 𝑦 + 𝑧 + 1 41/47
  • 42.
    多変数多項式暗号 𝑃: 𝑓 𝑡↦ 𝑡2 + 1 ⋅ 𝑓 𝑡 3 だったので(既約元での割り算は省略)、 𝐵 = 𝑡2 + 1 ⋅ 𝐴3 両辺に 𝐴𝐵 を掛けて 𝐴𝐵2 = 𝑡2 + 1 ⋅ 𝐴4 𝐵 ということを踏まえつつ、 ここに先ほどの 𝐴 と 𝐵 を代入すると… 42/47
  • 43.
    多変数多項式暗号 𝐴𝐵2 = 𝑡2 + 1⋅ 𝐴4 𝐵 𝑥, 𝑦, 𝑧の1次式 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡2 𝑋, 𝑌, 𝑍の1次式 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡2 43/47
  • 44.
    多変数多項式暗号 𝐴𝐵2 = 𝑡2 + 1⋅ 𝐴4 𝐵 𝑥, 𝑦, 𝑧の1次式 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡 + 𝑥, 𝑦, 𝑧の1次式 ⋅ 𝑡2 𝑋, 𝑌, 𝑍の1次式 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡 + 𝑋, 𝑌, 𝑍の1次式 ⋅ 𝑡2 44/47
  • 45.
    多変数多項式暗号 わかりにくいのでさらに次数下げした例: 𝐴 = 𝑐0𝑥+ 𝑐1𝑦 + 𝑐2 𝐵 = 𝑑0𝑋 + 𝑑1𝑌 + 𝑑2 とすると、1次式のままなので 𝐴4 = 𝑐0 ′ 𝑥 + 𝑐1 ′ 𝑦 + 𝑐2 ′ 𝐵2 = 𝑑0 ′ 𝑋 + 𝑑1 ′ 𝑌 + 𝑑2 ′ これを再び 𝐴𝐵2 = 𝑒 ⋅ 𝐴4 𝐵 に代入してみる。 𝑥, 𝑦 : 入力となる平文 𝑋, 𝑌 : 出力となる暗号文 𝑐𝑖, 𝑑𝑖: 秘密鍵に関するパラメータ(未知) 𝐴𝐵2 = 𝑡2 + 1 𝐴4 𝐵 この部分も秘密鍵なので変数 𝑒 に変換 45/47
  • 46.
    多変数多項式暗号 𝑐0𝑥 + 𝑐1𝑦+ 𝑐2 𝑑0 ′ 𝑋 + 𝑑1 ′ 𝑌 + 𝑑2 ′ = 𝑒 𝑐0 ′ 𝑥 + 𝑐1 ′ 𝑦 + 𝑐2 ′ 𝑑0𝑋 + 𝑑1𝑌 + 𝑑2 この未知パラメータは入力、出力には依存しない → 例えば 「平文 𝑥, 𝑦 = (0,1) を入力したら暗号文 𝑋, 𝑌 = (1,1) が返ってきた」 といった情報を大量に(オーダーとしてはbit長の2乗個)集めれば、 𝑐𝑖 などのパラメータを完全に復元可能 (crypto民なら見たことある形のはず) 46/47
  • 47.
  • 48.
    [Appendix] SageMathでのGröbner基底の計算 ൞ 𝑥2 + 𝑦= 3 𝑦2 + 2𝑧 = 10 𝑧2 + 3𝑥 = 12 のような連立方程式の場合 P.<x,y,z> = PolynomialRing(QQ, order=‘lex’) I = ideal(x^2 + y – 3, y^2 + 2*z – 10, z^2 + 3*x - 12) B = I.groebner_basis() print(B) 辞書式順序なら‘lex’ 次数付き辞書式順序なら‘deglex’ 次数付き逆辞書式順序なら‘degrevlex’ 単に連立方程式の解が欲しいだけなら print(I.variety(QQbar)) 48/47
  • 49.
    参考文献 [MI88] Matsumoto, Tsutomu,and Hideki Imai. "Public quadratic polynomial- tuples for efficient signature-verification and message-encryption." Workshop on the Theory and Application of of Cryptographic Techniques. Springer, Berlin, Heidelberg, 1988. [Pat95] Patarin, Jacques. "Cryptanalysis of the Matsumoto and Imai public key scheme of Eurocrypt’88." Annual international cryptology conference. Springer, Berlin, Heidelberg, 1995. DownUnderCTF 2021 Writeups | joseph's blog (https://jsur.in/posts/2021-09-26-ductf-2021-writeups#substitution- cipher-iii) 49/47