序文 §
模範的なCryptoプレイヤーなので、突如Coppersmith's Attackを実装していない事に恐れを抱いてしまった。というわけで再実装をする。
本音を言えば、元の原理を知っていれば多変数や法の約数を法とした場合などへの応用がしやすくなるんじゃないかと思ったので取り組み始めた次第である。
更に本音を重ねると、その最中に見つけたわかりやすい資料の知名度が他のCryptoやCTF関連資料に比べて妙に低いと思ったのでそれを紹介することも兼ねている、というかこちらが最大の目的である。車輪の再発明をしただけのこんな記事を読んでないで一番下までスクロールして参考資料をクリックしてダウンロードしてタブを閉じましょう。
冗談はさておき、今回はZ / n Z \mathbb Z/n\mathbb Z Z / n Z 上の単変数モニック多項式の小さい根を求めるアルゴリズムをSageMathで実装する。
Prerequisites §
格子基底簡約
LLLで十分だが、Coppersmith's Attackで求められる解の限界を評価するためにはLLLで求められる最も小さい基底のノルムの上界を知っておく必要がある
Outline §
アルゴリズムと実装の解説に入る前にアルゴリズムの概観を説明する。
まず前提となるのは、ある多項式f f f がf ( x 0 ) ≡ 0 m o d n f(x_0) \equiv 0 \mod n f ( x 0 ) ≡ 0 mod n となる時、f f f の定数倍: a f ( x ) af(x) a f ( x ) や他の多項式を掛けたもの: f ( x ) h ( x ) f(x)h(x) f ( x ) h ( x ) 、同じ根x 0 x_0 x 0 を持つ多項式g ( x ) g(x) g ( x ) (すなわち、g ( x 0 ) ≡ 0 m o d n g(x_0) \equiv 0 \mod n g ( x 0 ) ≡ 0 mod n )との和: f ( x ) + g ( x ) f(x) + g(x) f ( x ) + g ( x ) もまたx 0 x_0 x 0 を根として持つという事実である。
これによって、f f f を起点として同じ根を持つ多項式を複数用意することが出来る。そして、それらの整数係数の線形結合もx 0 x_0 x 0 を根として持つことから、線形結合によって作られた多項式の中で係数の絶対値が小さくなるようなものを用意する。ここで基底簡約が使われる。
これで得られた多項式は係数が小さいことから、それに値を代入した結果も小さくなることが期待出来る。そして、もしその多項式にx 0 x_0 x 0 を代入した結果の絶対値がn n n より小さければ、その多項式をf 0 f_0 f 0 とおくとf 0 ( x 0 ) = 0 f_0(x_0) = 0 f 0 ( x 0 ) = 0 となるはずである (法を取らずとも0である)。
法が無い場合の方程式は様々な方法によって簡単に解けるので、それで解けばx 0 x_0 x 0 が得られる。
以上がCoppersmith's Attackの大まかな説明である。
Howgrave-Graham's Lemma §
前節では最終的に法がなくとも同じ根を持つような多項式を構成することを言ったが、具体的にそういう方程式はどのような条件で実現できるのかを考える。これに対する答えがHowgrave-Graham's Lemmaであり次である。
n n n を法としたe e e 次多項式f ( x ) f(x) f ( x ) に対して、ある数X X X が存在し、f f f の根x 0 x_0 x 0 について∣ x 0 ∣ < X |x_0| \lt X ∣ x 0 ∣ < X であると仮定する (つまり、X X X が∣ x 0 ∣ |x_0| ∣ x 0 ∣ の上界である)。
この時、次が成立するならf ( x 0 ) = 0 f(x_0) = 0 f ( x 0 ) = 0 である。
∣ f ( x X ) ∣ < n e + 1
|f(xX)| \lt \frac n{\sqrt {e+1}}
∣ f ( x X ) ∣ < e + 1 n
ここで、多項式f ( x ) = ∑ i = 0 e a i x i f(x) = \sum_{i=0}^e a_ix^i f ( x ) = ∑ i = 0 e a i x i に対するノルム∣ f ( x ) ∣ |f(x)| ∣ f ( x ) ∣ を次で定義する。
∣ f ( x ) ∣ = ∑ i = 0 e a i 2
|f(x)| = \sqrt{\sum_{i=0}^e a_i^2}
∣ f ( x ) ∣ = i = 0 ∑ e a i 2
証明は次のようになる。
まず次の不等式が成り立つ。
∣ f ( x 0 ) ∣ ≤ ∑ i = 0 e ∣ a i x 0 i ∣ ≤ ∑ i = 0 e ∣ a i ∣ X i
|f(x_0)| \leq \sum_{i=0}^e |a_ix_0^i| \leq \sum_{i=0}^e |a_i|X^i
∣ f ( x 0 ) ∣ ≤ i = 0 ∑ e ∣ a i x 0 i ∣ ≤ i = 0 ∑ e ∣ a i ∣ X i
ここで最左辺はベクトル( ∣ a 0 ∣ , ∣ a 1 ∣ X , … , ∣ a e ∣ X e ) (|a_0|, |a_1|X, \dots, |a_e|X^e) ( ∣ a 0 ∣ , ∣ a 1 ∣ X , … , ∣ a e ∣ X e ) と1がe + 1 e+1 e + 1 個並んだベクトル( 1 , 1 , … , 1 ) (1,1,\dots,1) ( 1 , 1 , … , 1 ) の内積で表される。
ベクトルの内積はノルムの積以下であるという事実を用いて次が成り立つ。
∑ i = 0 e ∣ a i ∣ X i = ⟨ ( ∣ a 0 ∣ , ∣ a 1 ∣ X , … , ∣ a e ∣ X e ) , ( 1 , 1 , … , 1 ) ⟩ ≤ ∣ ( ∣ a 0 ∣ , ∣ a 1 ∣ X , … , ∣ a e ∣ X e ) ∣ ∣ ( 1 , 1 , … , 1 ) ∣ = ∣ f ( x X ) ∣ e + 1
\begin{aligned}
\sum_{i=0}^e|a_i|X^i &= \langle (|a_0|, |a_1|X, \dots, |a_e|X^e), (1,1,\dots,1)\rangle\cr
&\leq |(|a_0|, |a_1|X, \dots, |a_e|X^e)||(1,1,\dots,1)|\cr
&=|f(xX)|\sqrt{e+1}
\end{aligned}
i = 0 ∑ e ∣ a i ∣ X i = ⟨( ∣ a 0 ∣ , ∣ a 1 ∣ X , … , ∣ a e ∣ X e ) , ( 1 , 1 , … , 1 )⟩ ≤ ∣ ( ∣ a 0 ∣ , ∣ a 1 ∣ X , … , ∣ a e ∣ X e ) ∣∣ ( 1 , 1 , … , 1 ) ∣ = ∣ f ( x X ) ∣ e + 1
ここで∣ f ( x X ) ∣ < n e + 1 |f(xX)| \lt \frac n{\sqrt {e+1}} ∣ f ( x X ) ∣ < e + 1 n を仮定しているので、最終的に次の不等式が得られる。
∣ f ( x 0 ) ∣ ≤ ∑ i = 0 e ∣ a i ∣ X i ≤ ∣ f ( x X ) ∣ e + 1 < n e + 1 e + 1 = n
\begin{aligned}
|f(x_0)| &\leq \sum_{i=0}^e|a_i|X^i \cr
&\leq |f(xX)|\sqrt{e+1}\cr
&\lt \frac{n}{\sqrt{e+1}}\sqrt{e+1} \cr
&= n
\end{aligned}
∣ f ( x 0 ) ∣ ≤ i = 0 ∑ e ∣ a i ∣ X i ≤ ∣ f ( x X ) ∣ e + 1 < e + 1 n e + 1 = n
この不等式より、− n < f ( x 0 ) < n -n \lt f(x_0) \lt n − n < f ( x 0 ) < n が得られるが、f ( x 0 ) ≡ 0 m o d n f(x_0) \equiv 0 \mod n f ( x 0 ) ≡ 0 mod n であったから、f ( x 0 ) = n k f(x_0) = nk f ( x 0 ) = nk となる何らかの整数k k k が存在する。このようなk k k は不等式よりk = 0 k=0 k = 0 しかあり得ず、したがってf ( x 0 ) = 0 f(x_0) = 0 f ( x 0 ) = 0 となる。□ \Box □
他の多項式を集める §
Howgrave-Graham's Lemma(以下、「補題」とする)より目的とする多項式の条件が判明した。続いての目標はこのような多項式の構成であり、そのために同じ根を持つ多項式の線形結合を用いる。
無闇矢鱈と多項式の線形結合(スカラー倍や多項式同士の和)を繰り返していても意味が無く、後述するようにこれはLLLのような格子の基底簡約アルゴリズムが上手くやってくれる。そこでここでは線形結合に使えそうな別の多項式を集めることを考える。
f ( x ) f(x) f ( x ) に対して、f ( x ) 2 f(x)^2 f ( x ) 2 もまたx 0 x_0 x 0 を根として持つが、ノルムが大きくなってしまうのであまり意味が無い。結局候補となるのは次のような式である。
f 0 ( x ) ≔ n f 1 ( x ) ≔ n x ⋮ f e − 1 ( x ) ≔ n x e − 1 f e ( x ) ≔ f ( x )
\begin{aligned}
f_0(x) &\coloneqq n\cr
f_1(x) &\coloneqq nx\cr
&\vdots\cr
f_{e-1}(x) &\coloneqq nx^{e-1}\cr
f_e(x) & \coloneqq f(x)
\end{aligned}
f 0 ( x ) f 1 ( x ) f e − 1 ( x ) f e ( x ) : = n : = n x ⋮ : = n x e − 1 : = f ( x )
これらは全てx 0 x_0 x 0 を根として持つことから、基底として使えそうである。
また、これより更に良い結果を得る方法が存在する。補題の右辺を見直して見るとn e + 1 \frac n{\sqrt{e+1}} e + 1 n が多項式のノルムの上界となっており、n n n に対してO ( n ) O(n) O ( n ) の大きさであるが、n 2 n^2 n 2 を法として根がx 0 x_0 x 0 である多項式を用意することで、これをO ( n 2 ) O(n^2) O ( n 2 ) にすることが出来る。
もちろん、そのような多項式は、先程棄却したf ( x ) 2 f(x)^2 f ( x ) 2 のようなものとなり、ノルムも大きくなる。補題の左辺のx x x の係数が単純計算でn n n と同じく2乗程度の増加を見せ、e 2 e^2 e 2 の次数においてはその係数が( X e ) 2 (X^e)^2 ( X e ) 2 となり、多項式のノルムもこのぐらいになるが、∣ x 0 ∣ |x_0| ∣ x 0 ∣ がn n n に対して有意に小さいことから、X X X も小さくとることが出来る。よって、右辺の2乗による増加は左辺の2乗による増加に比べてかなり大きくなることから、より有利な条件となる。
では、実際にn 2 n^2 n 2 を法としてx 0 x_0 x 0 を根に持つ多項式を用意してみる。次のような多項式f i , j ( 0 ≤ i ≤ 2 ) f_{i,j} \ (0\leq i \leq 2) f i , j ( 0 ≤ i ≤ 2 ) はn 2 n^2 n 2 を法として根x 0 x_0 x 0 を持つ。
f i , j ( x ) = n 2 − i x j f ( x ) i
f_{i,j}(x) = n^{2-i}x^jf(x)^i
f i , j ( x ) = n 2 − i x j f ( x ) i
f ( x 0 ) = n k f(x_0) = nk f ( x 0 ) = nk となる整数k k k が存在するから、f ( x ) i = n i k i f(x)^i =n^ik^i f ( x ) i = n i k i となり、n 2 − i f ( x 0 ) i = n 2 k i ≡ 0 m o d n 2 n^{2-i}f(x_0)^i =n^2k^i \equiv 0 \mod n^2 n 2 − i f ( x 0 ) i = n 2 k i ≡ 0 mod n 2 となるから、f i , j ( x 0 ) ≡ 0 m o d n 2 f_{i,j}(x_0) \equiv 0 \mod n^2 f i , j ( x 0 ) ≡ 0 mod n 2 である。
同様にしてn 3 , n 4 , … n^3, n^4,\dots n 3 , n 4 , … のように法を大きくしていくと、それを法としてx 0 x_0 x 0 が根となる複数の多項式が得られる。
格子基底簡約 §
前節で多項式が得られたので、これがHowgrave-Graham's Lemmaを適用出来るぐらい小さくする。これには(この節のタイトル通り)格子基底簡約を用いる。目標は次のようなベクトルを基底として持つような格子行列の導出である。
c = ( c 0 , c 1 X , … , c e X e )
\boldsymbol c = (c_0, c_1X, \dots, c_eX^e)
c = ( c 0 , c 1 X , … , c e X e )
当然だが、各c i c_i c i に対してg ( x ) ≔ ∑ i = 0 e c i x i g(x) \coloneqq \sum_{i=0}^e c_ix^i g ( x ) : = ∑ i = 0 e c i x i としてg ( x 0 ) ≡ 0 m o d n g(x_0) \equiv 0 \mod n g ( x 0 ) ≡ 0 mod n となるような簡約を行う。
この時、c \boldsymbol c c のノルムは、∣ g ( x X ) ∣ |g(xX)| ∣ g ( x X ) ∣ に等しいことが定義からわかる。基底を簡約していることから、c \boldsymbol c c のノルムは小さくなっていることが期待され、補題の条件を満たす程度になっていればx 0 x_0 x 0 を求めることが出来る。
では肝心の簡約する基底はどうするかというと次のようにする。
まずf ( x ) f(x) f ( x ) に対して、ある整数m ≥ 1 m \geq 1 m ≥ 1 を用意し、前節のように、f i , j ( x ) ≔ n m − i x j f ( x ) i f_{i,j}(x) \coloneqq n^{m-i}x^jf(x)^i f i , j ( x ) : = n m − i x j f ( x ) i を0 ≤ i ≤ m , 0 ≤ j ≤ e − 1 0 \leq i \leq m, 0 \leq j \leq e-1 0 ≤ i ≤ m , 0 ≤ j ≤ e − 1 の範囲で用意する。この時、deg f i , j = j + e i \deg {f_{i,j}} = j + ei deg f i , j = j + e i となることから、i , j i,j i , j が異なればf i , j f_{i,j} f i , j の次数も異なる。また、deg f i , j \deg f_{i,j} deg f i , j の最大値はe m + e − 1 em+e-1 e m + e − 1 となる。0 ≤ k ≤ e m + e − 1 0 \leq k \leq em+e-1 0 ≤ k ≤ e m + e − 1 となる整数k k k に対して、deg f i , j = k \deg f_{i,j} = k deg f i , j = k となるf i , j f_{i,j} f i , j が一意的に存在することから、多項式はe m + e − 1 + 1 = e ( m + 1 ) em+e-1+1 = e(m+1) e m + e − 1 + 1 = e ( m + 1 ) 本得られることになる。以後、d ≔ e ( m + 1 ) d\coloneqq e(m+1) d : = e ( m + 1 ) とおく。
ここで多項式f i , j ( x X ) f_{i,j}(xX) f i , j ( x X ) を計算し、その係数を成分にとる次のような行列M M M を作る。但し、f i , j ( k ) ( x ) f^{(k)}_{i,j}(x) f i , j ( k ) ( x ) で、多項式f i , j ( x ) f_{i,j}(x) f i , j ( x ) のk k k 次の係数を指すものとする。また、括弧内はx X xX x X であり、X X X は変数ではないことから、X X X のべきが係数に掛けられる事にも注意する。
M i , j = f k , l ( j ) ( x X ) ( deg f k , l ( x X ) = l + e k = i )
M_{i,j} = f_{k,l}^{(j)}(xX) \ \ \ (\deg f_{k,l}(xX) = l+ek = i)
M i , j = f k , l ( j ) ( x X ) ( deg f k , l ( x X ) = l + e k = i )
すなわち、i i i 行目の成分は次数がi i i であるf k , l ( x X ) f_{k,l}(xX) f k , l ( x X ) の係数が順に並ぶ。e = 3 , m = 3 e=3, m=3 e = 3 , m = 3 で例を構成してみる。この場合はd = e ( m + 1 ) = 12 d = e(m+1)=12 d = e ( m + 1 ) = 12 となるから12本の多項式が得られる。
f i , j ( x ) f_{i,j}(x) f i , j ( x ) は次のようになる。
i , j i,j i , j deg f i , j \deg{f_{i,j}} deg f i , j f i , j f_{i,j} f i , j
0,0 0 n 3 n^3 n 3
0,1 1 n 3 x n^3x n 3 x
0,2 2 n 3 x 2 n^3x^2 n 3 x 2
1,0 3 n 2 f ( x ) n^2f(x) n 2 f ( x )
1,1 4 n 2 x f ( x ) n^2xf(x) n 2 x f ( x )
1,2 5 n 2 x 2 f ( x ) n^2x^2f(x) n 2 x 2 f ( x )
2,0 6 n f ( x ) 2 nf(x)^2 n f ( x ) 2
2,1 7 n x f ( x ) 2 nxf(x)^2 n x f ( x ) 2
2,2 8 n x 2 f ( x ) 2 nx^2f(x)^2 n x 2 f ( x ) 2
3,0 9 f ( x ) 3 f(x)^3 f ( x ) 3
3,1 10 x f ( x ) 3 xf(x)^3 x f ( x ) 3
3,2 11 x 2 f ( x ) 3 x^2f(x)^3 x 2 f ( x ) 3
よって、行列M M M は対角成分にのみ注目すると、次のようになる。f ( x ) f(x) f ( x ) がモニック多項式であることから、f i , j ( x ) f_{i,j}(x) f i , j ( x ) もモニック多項式であり、f i , j ( x X ) f_{i,j}(xX) f i , j ( x X ) の最高次数にX X X のべきが現れることに注意する。
( n 3 n 3 X n 3 X 2 n 2 X 3 n 2 X 4 n 2 X 5 n X 6 n X 7 n X 8 X 9 X 10 X 11 )
\begin{pmatrix}
n^3 \cr
& n^3X \cr
& & n^3X^2 \cr
& & & n^2X^3 \cr
& & & & n^2X^4 \cr
& & & & & n^2X^5 \cr
& & & & & & nX^6 \cr
& & & & & & & nX^7 \cr
& & & & & & & & nX^8 \cr
& & & & & & & & & X^9 \cr
& & & & & & & & & & X^{10} \cr
& & & & & & & & & & & X^{11} \cr
\end{pmatrix}
⎝ ⎛ n 3 n 3 X n 3 X 2 n 2 X 3 n 2 X 4 n 2 X 5 n X 6 n X 7 n X 8 X 9 X 10 X 11 ⎠ ⎞
この行列の左下には各f i , j ( x X ) f_{i,j}(xX) f i , j ( x X ) の他の次数における係数が並んでいる。また、j j j 列目の成分はf k , l ( x X ) f_{k,l}(xX) f k , l ( x X ) のj j j 次係数であるから、X j X^j X j とf k , l ( x ) f_{k,l}(x) f k , l ( x ) のj j j 次係数の積となり、C X j CX^j C X j となんらかの整数C C C を用いて表される。
一方、右上は全て0である下三角行列である。よって、行列式は対角成分の積となる (この後の基底簡約の評価で用いる)。
この基底行列に左から係数ベクトル( a 0 , a 1 , … , a d − 1 ) ∈ Z d (a_0, a_1,\dots, a_{d-1}) \in \mathbb Z^d ( a 0 , a 1 , … , a d − 1 ) ∈ Z d を掛けると( b 0 , b 1 X , … , b d − 1 X d − 1 ) (b_0, b_1X, \dots, b_{d-1}X^{d-1}) ( b 0 , b 1 X , … , b d − 1 X d − 1 ) が現れる。これらの関係は次のようになっている。
b i X i = ∑ j = 0 d − 1 a j f k , l ( i ) ( x X ) ( deg f k , l = l + k e = j )
b_iX^i = \sum_{j=0}^{d-1} a_jf^{(i)}_{k,l}(xX) \ \ \ (\deg f_{k,l} = l+ke = j)
b i X i = j = 0 ∑ d − 1 a j f k , l ( i ) ( x X ) ( deg f k , l = l + k e = j )
したがって、b i X b_iX b i X はf k , l ( x X ) f_{k,l}(xX) f k , l ( x X ) の整数係数の線形結合で出来た多項式からi i i 次の係数を取り出したものになる。
以上より多項式h ( x X ) = ∑ i = 0 d − 1 b i X i x i h(xX) = \sum_{i=0}^{d-1}b_iX^ix^i h ( x X ) = ∑ i = 0 d − 1 b i X i x i とおくと、h ( x ) = ∑ i = 0 d − 1 b i x i h(x) = \sum_{i=0}^{d-1}b_ix^i h ( x ) = ∑ i = 0 d − 1 b i x i であり、更に∣ h ( x X ) ∣ = ∣ ( b 0 , b 1 X , … , b d − 1 X d − 1 ) ∣ |h(xX)| = |(b_0, b_1X, \dots, b_{d-1}X^{d-1})| ∣ h ( x X ) ∣ = ∣ ( b 0 , b 1 X , … , b d − 1 X d − 1 ) ∣ である。
また、次が成り立つ。
h ( x X ) = ∑ i = 0 d − 1 a i f k , l ( x X ) ( deg f k , l = l + k e = i )
h(xX) = \sum_{i=0}^{d-1}a_if_{k,l}(xX) \ \ \ (\deg f_{k,l} = l+ke = i)
h ( x X ) = i = 0 ∑ d − 1 a i f k , l ( x X ) ( deg f k , l = l + k e = i )
ここでx X = x 0 xX = x_0 x X = x 0 を代入すると、h ( x 0 ) ≡ 0 m o d n m h(x_0) \equiv 0 \mod n^m h ( x 0 ) ≡ 0 mod n m となる。よってM M M が張る格子に含まれるベクトルから、h h h のように多項式を構成すればx 0 x_0 x 0 が根となる多項式を得ることが出来る。
目的としていたのは、ノルムが小さい多項式であったから、h h h のi i i 次係数b i b_i b i を小さくすると考えるのが自然である。そこで格子基底簡約が登場する。
基底簡約のアルゴリズムには色々あるが、今回は昨今のCTFプレイヤーに人気なLLLを用いる (ついでに解の上界であるX X X の評価も楽になる)。M M M をLLL簡約して出てきたベクトルをb ≔ ( b 0 , b 1 X , … , b d − 1 X d ) \boldsymbol b \coloneqq (b_0, b_1X, \dots, b_{d-1}X^d) b : = ( b 0 , b 1 X , … , b d − 1 X d ) とおく。
既に示しているようにb \boldsymbol b b から多項式h h h を構成すると、∣ h ( x X ) ∣ = ∣ b ∣ |h(xX)| = |\boldsymbol b| ∣ h ( x X ) ∣ = ∣ b ∣ であるから、Howgrave-Graham's Lemmaの仮定を満たすには次が成り立つ必要がある。
∣ b ∣ ≤ n m d
|\boldsymbol b| \leq \frac{n^m}{\sqrt d}
∣ b ∣ ≤ d n m
右辺がこのようになるのは、法をn n n からn m n^m n m にしており、得ている多項式の最大次数がe m + e − 1 em + e - 1 e m + e − 1 であることに注意する。
よって、M M M を簡約して出てきたベクトルがこれを満たしているなら、根であるr 0 r_0 r 0 を求めることが出来る。次の節でこの不等式を満たすようなX X X 、つまり解の上界が何であるかを評価する。
X X X の条件 §
先に述べたように、M M M は下三角行列であるから行列式はその対角成分の積になる。この構成から∣ M ∣ |M| ∣ M ∣ を計算すると次のようになる。
∣ M ∣ = n ( ∑ i = 0 m i ⋅ e ) X ( ∑ i = 0 d − 1 i ) = n m ( m + 1 ) 2 e X d ( d − 1 ) 2 = n m d 2 X d ( d − 1 ) 2
|M| = n^{\left(\sum_{i=0}^m i\cdot e\right)}X^{\left(\sum_{i=0}^{d-1}i\right)} = n^{\frac{m(m+1)}2e} X^{\frac{d(d-1)}2} = n^{\frac {md}2} X^{\frac{d(d-1)}2}
∣ M ∣ = n ( ∑ i = 0 m i ⋅ e ) X ( ∑ i = 0 d − 1 i ) = n 2 m ( m + 1 ) e X 2 d ( d − 1 ) = n 2 m d X 2 d ( d − 1 )
計算を簡単にするため、LLLの簡約パラメータδ \delta δ をδ = 3 4 \delta = \frac 34 δ = 4 3 とするとM M M をLLL簡約した時の最も短いベクトルの大きさは2 d − 1 4 ∣ M ∣ 1 d 2^{\frac{d-1}4}|M|^\frac 1d 2 4 d − 1 ∣ M ∣ d 1 以下になるため、次が成り立つ。
∣ b ∣ ≤ 2 d − 1 4 ∣ M ∣ 1 d = 2 d − 1 4 n m 2 X d − 1 2
|\boldsymbol b| \leq 2^{\frac{d-1}4}|M|^{\frac 1d} = 2^{\frac{d-1}4} n^{\frac m2} X^{\frac {d-1}2}
∣ b ∣ ≤ 2 4 d − 1 ∣ M ∣ d 1 = 2 4 d − 1 n 2 m X 2 d − 1
この式から、∣ b ∣ |\boldsymbol b| ∣ b ∣ の上界はわかっているので、それがこの式の右辺より小さいような場合を考える。したがって次のような不等式を満たすようなX X X を考えることになる。
2 d − 1 4 n m 2 X d − 1 2 ≤ n m d
2^{\frac{d-1}4} n^{\frac m2} X^{\frac {d-1}2} \leq \frac{n^m}{\sqrt d}
2 4 d − 1 n 2 m X 2 d − 1 ≤ d n m
これを満たすようなX X X であればHowgrave-Graham's Lemmaからx 0 x_0 x 0 を求めることが出来る。
X X X だけの不等式にするために、両辺2 d − 1 \frac{2}{d-1} d − 1 2 乗して移項すると次のようになる。
X ≤ n m d − 1 d 1 d − 1 ⋅ 2 − 1 2 = 1 2 ⋅ n m d − 1 d 1 d − 1
X \leq \frac{n^{\frac{m}{d-1}}}{d^{\frac 1{d-1}}}\cdot 2^{-\frac 12} = \frac 1{\sqrt 2}\cdot \frac{n^{\frac{m}{d-1}}}{d^{\frac 1{d-1}}}
X ≤ d d − 1 1 n d − 1 m ⋅ 2 − 2 1 = 2 1 ⋅ d d − 1 1 n d − 1 m
ここで、m d − 1 \frac{m}{d-1} d − 1 m に関して次の不等式が成り立つ。
m d − 1 > m d = m e ( m + 1 ) = 1 e − 1 e ( m + 1 ) > 1 e − 1 m
\frac{m}{d-1} \gt \frac{m}d = \frac{m}{e(m+1)} = \frac{1}{e} - \frac{1}{e(m+1)} \gt \frac 1e - \frac 1m
d − 1 m > d m = e ( m + 1 ) m = e 1 − e ( m + 1 ) 1 > e 1 − m 1
よって、n n n の指数として次が成り立つ。
n 1 e − 1 m ≤ n m d − 1
n^{\frac 1e - \frac 1m} \leq n^{\frac{m}{d-1}}
n e 1 − m 1 ≤ n d − 1 m
また、d 1 d − 1 d^{\frac 1{d-1}} d d − 1 1 に関して次の不等式が成り立つ。
d 1 d − 1 ≤ d ⇔ 1 d ≤ 1 d 1 d − 1
d^{\frac 1{d-1}} \leq d \Leftrightarrow \frac 1d \leq \frac 1{d^{\frac 1{d-1}}}
d d − 1 1 ≤ d ⇔ d 1 ≤ d d − 1 1 1
よって次の不等式が成り立つ。
1 2 n 1 e − 1 m d ≤ 1 2 n m d − 1 d 1 d − 1
\frac 1{\sqrt 2}\frac{n^{\frac 1e - \frac 1m}}{d} \leq \frac 1{\sqrt 2}\frac{n^{\frac{m}{d-1}}}{d^{\frac 1{d-1}}}
2 1 d n e 1 − m 1 ≤ 2 1 d d − 1 1 n d − 1 m
したがって、もし左辺がX X X より大きかったら、右辺も大きくなる。式にすると次のようになる。
X ≤ 1 2 n 1 e − 1 m d ⇒ X ≤ 1 2 n m d − 1 d 1 d − 1
X \leq \frac 1{\sqrt 2}\frac{n^{\frac 1e - \frac 1m}}{d} \Rightarrow X \leq \frac 1{\sqrt 2} \frac{n^{\frac{m}{d-1}}}{d^{\frac 1{d-1}}}
X ≤ 2 1 d n e 1 − m 1 ⇒ X ≤ 2 1 d d − 1 1 n d − 1 m
右側の不等式を満たしているならHowgrave-Graham's Lemmaの仮定も満たしていることになるので、x 0 x_0 x 0 を求めることが出来るようなX X X の条件はX ≤ 1 2 n 1 e − 1 m d X \leq \frac 1{\sqrt 2}\frac{n^{\frac 1e - \frac 1m}}{d} X ≤ 2 1 d n e 1 − m 1 である。
実装 §
m m m とX X X は指定する必要がある。
def solve ( f , m , X ):
e = f. degree ()
d = e*(m+ 1 )
n = f. base_ring (). order ()
f = f. change_ring ( ZZ )
var = f. variables ()[ 0 ]
coeffs = f. coefficients ()
fs = []
for _d in range (d):
i,j = _d // e, _d % e
_f = n^(m-i) * var^j * f^i
fs. append ( _f (var*X))
M = []
for _f in fs:
_coeffs = _f. coefficients ( sparse = False )
_coeffs += [ 0 for _ in range (d - len (_coeffs))]
M. append (_coeffs)
M = matrix ( ZZ , M)
PRZ .<r> = PolynomialRing ( ZZ )
B = M. LLL ()
ret = set ()
for b in B:
b = [_b // X^i for i, _b in enumerate (b)]
h = PRZ (b)
rs = h. roots ()
if len (rs) > 0 :
for _r, _ in rs:
if _r < 0 :
_r += n
if f (_r) % n == 0 :
ret. add (_r)
return tuple (ret)
# test
n = 45649
PR .<x> = PolynomialRing ( Zmod (n))
# x = 4
ans = 4
f = x^ 2 + 113 *x + 45181
roots = solve (f, m = 3 , X = 200 )
# check
assert ans in roots
for r in roots:
assert f (r) == 0
余談1: small_roots()
との対応 §
SageMathに実装されているCoppersmith's Attackはsmall_roots()
という名前だが、これの引数はある程度今回使ったものに対応している。
よく使うのはepsilon
, X
, beta
であるが、beta
以外は次のような対応になっている。
epislon
: 1 m \frac 1m m 1 に対応する。よって、上記実装でm m m を指定するのはepislon=1/m
としているのと同じである
X
: (明らかだが)X X X に対応する
余談2: n n n の約数を法とする場合 §
Coppersmith's AttackのVariantとして、未知のn n n の約数を法とした場合の合同方程式も解くことが出来るというのがあるが、これは通常のCoppersmith's Attackで多項式にn n n を掛けるところをn n n の約数に変えているだけである。と言っても、n n n の約数は未知なので直接掛けるのではなくn n n を掛けて代用している。
そのせいで格子の体積が大きくなり、簡約しても出てくる基底のノルムが大きくなってしまう。よって、上記のX X X の評価はそのまま使う事は出来ない。一般のRSA同様n = p q n = pq n = pq でp ≈ q ≈ n 1 / 2 p\approx q \approx n^{1/2} p ≈ q ≈ n 1/2 として、p p p を法とした合同方程式を解くのなら、解の大きさはn 1 / 4 n^{1/4} n 1/4 未満である必要がある。
気が向いたら解の大きさについての評価を書きます。
Resources §