半素数の素因数分解が容易に解ける条件
📂整数論 半素数の素因数分解が容易に解ける条件 要旨 準素数の素因数分解 問題 N = p q N = pq N = pq は、次の条件下では比較的簡単に解ける。
(i): p p p がスムーズな素数 である。 (ii): p ≈ q p \approx q p ≈ q 説明 条件 (ii) の意味は、p p p と q q q の差が少ないときに簡単に解けるということだが、これには説明が必要だろう:
一見すると、p , q ∈ N p,q \in \mathbb{N} p , q ∈ N が ( p + q ) (p + q) ( p + q ) に制限されているなら、N = p q N = pq N = pq を最大にする方法は、可能な限り p p p と q q q の差を小さくすることだ。例えば、p + q ≤ 12 p+q \le 12 p + q ≤ 12 であれば、p q pq pq は 7 = p ≈ q = 5 7 = p \approx q = 5 7 = p ≈ q = 5 のとき最大値 35 35 35 を持つ。 「力技で解く」ことを防ぐためには、p p p 、q q q は可能な限り大きい方がいい。例えば
N 1 = 3 ⋅ 47 = 141 N 2 = 11 ⋅ 13 = 143
N_{1}=3 \cdot 47=141
\\ N_{2}=11 \cdot 13=143
N 1 = 3 ⋅ 47 = 141 N 2 = 11 ⋅ 13 = 143
があったとすると、公開された時には 2 2 2 しか差がないが、N 1 N_{1} N 1 は「手間をかけて」すぐに解けるようになる。
しかし、このような一次元的な理由で大きさが似ている p p p 、q q q を使う場合、二次元的に考える攻撃者には破られるしかない。単純に考えて、本当に p ≈ q p \approx q p ≈ q なら攻撃者は N ≈ p 2 N \approx p^2 N ≈ p 2 と仮定し、N \sqrt{N} N の近くにソリューションの候補を大幅に減らすことができる。このアイデアから数学的な技巧を駆使すれば、N = p q N=pq N = pq は非常に簡単な問題になる。 証明 (i) p p p がスムーズな素数 ならば、ポラード p − 1 p-1 p − 1 素因数分解アルゴリズムを使うことができるので、準素数の素因数分解問題が比較的簡単に解けるようになる。
■
(ii) p : = a + b p := a + b p := a + b 、q : = a − b q := a - b q := a − b とすると、p p p 、q q q は a a a を中心に ± b \pm b ± b 離れた素数になる。これを N N N で表すと
N = ( a + b ) ( a − b ) = a 2 − b 2
\begin{align*}
N =& ( a + b)(a - b)
\\ =& a^2 - b^2
\end{align*}
N = = ( a + b ) ( a − b ) a 2 − b 2
つまり N + b 2 = a 2 N + b^2 = a^2 N + b 2 = a 2 となる。したがって、N N N に b b b を 1 1 1 ずつ増やしながら ( N + b 2 ) \left( N + b^2 \right) ( N + b 2 ) が平方数になるのを探すと p = a + b p = a + b p = a + b 、q = a − b q = a - b q = a − b が何であるかわかるので、準素数の素因数分解問題が比較的簡単に解ける。
■
例 例として、N = 25217 N = 25217 N = 25217 を考えよう。N N N を直接素因数分解するのは容易ではないが、25217 + 8 2 = 15 9 2 25217 + 8^2 = 159^2 25217 + 8 2 = 15 9 2 とわかると
p = 159 + 8 = 167 q = 159 − 8 = 151
\begin{align*}
p =& 159 + 8 = 167
\\ q =& 159-8 = 151
\end{align*}
p = q = 159 + 8 = 167 159 − 8 = 151
をすぐに求めることができる。文の文脈に沿って言えば、167 ≈ 151 167 \approx 151 167 ≈ 151 のために簡単に解けてしまったのだ。
一方で、この b b b を見つけるのをもっと賢くしよう。何か k k k について
k N = a 2 − b 2
k N = a^2 - b^2
k N = a 2 − b 2
とすると、( a + b ) (a+b) ( a + b ) と ( a − b ) (a-b) ( a − b ) は k k k の倍数なので、両辺を k k k で割るだけで N N N に関する式をそのまま得ることができる。このような面倒なことをする理由は、この式が次のように表せるからだ。
a 2 ≡ b 2 ( m o d N )
a^2 \equiv b^2 \pmod{N}
a 2 ≡ b 2 ( mod N )
その後は、次の方法で d = q d = q d = q を探す。
ステップ 1. c i c_{i} c i
計算約数が少ない数 c i c_{i} c i について、c i ≡ a i 2 ( m o d p ) c_{i} \equiv a_{i}^{2} \pmod{p} c i ≡ a i 2 ( mod p ) を満たす a 1 , ⋯ , a r a_{1} , \cdots , a_{r} a 1 , ⋯ , a r を探しておく。
ステップ 2. b 2 b^2 b 2 の計算
a i 1 ⋯ a i s = a c i 1 ⋯ c i s = b 2
a_{i_{1}} \cdots a_{i_{s}} = a
\\ c_{i_{1}} \cdots c_{i_{s}} = b^2
a i 1 ⋯ a i s = a c i 1 ⋯ c i s = b 2
を満たす c i 1 , ⋯ , c i s c_{i_{1}} , \cdots , c_{i_{s}} c i 1 , ⋯ , c i s を探す。
ステップ 3. d = gcd ( N , a − b ) d = \gcd \left( N , a-b \right) d = g cd( N , a − b )
計算された a a a と b b b を用いて、
a 2 ≡ ( a i 1 ⋯ a i s ) 2 ≡ a i 1 2 ⋯ a i s 2 ≡ c i 1 ⋯ c i s ≡ b 2
\begin{align*}
a^2 & \equiv \left( a_{i_{1}} \cdots a_{i_{s}} \right)^{2}
\\ & \equiv a_{i_{1}}^{2} \cdots a_{i_{s}}^{2}
\\ & \equiv c_{i_{1}} \cdots c_{i_{s}}
\\ & \equiv b^2
\end{align*}
a 2 ≡ ( a i 1 ⋯ a i s ) 2 ≡ a i 1 2 ⋯ a i s 2 ≡ c i 1 ⋯ c i s ≡ b 2
こうして d d d はN N N の約数 、つまり q q q になる。
参照 素因数分解問題の難しさを利用したセキュリティアルゴリズム 素因数分解問題に対する攻撃アルゴリズム