この 章の 目標
素因数分解と 離散対数の アルゴリズムの 速さを L L L 記法で 比べ、指数時間と 準指数時間の 違いを 説明できる
フェルマー法・ ポラードの ρ \rho ρ 法・p − 1 p - 1 p − 1 法が 成功する 条件を 証明し、RSA の 素数に 課される 条件の 理由を 説明できる
二次ふる い法の 仕組み(平方の 合同、滑らかな 数、 F 2 \mathbb{F}_2 F 2 上の 線形代数)を 小さい 数で 実行できる
ベビーステップ・ジャイアントステップ法と ポーリッヒ–ヘルマン法を 証明し、離散対数の 難しさが 群の 位数の 最大の 素因数で 決まる ことを 説明できる
推奨される 鍵長(NIST SP 800-57 など)が、どの アルゴリズムの 計算量から 来ているかを 説明できる
前提 :第1章 、第2章 、04-algebra 第1章 、04-algebra 第2章 。3.5 節では F 2 \mathbb{F}_2 F 2 上の ベクトルの 一次従属( 02-linear-algebra 第2章 )を 使う。
RSA 暗号(第2章 )の 公開鍵 ( n , e ) (n, e) ( n , e ) から 秘密鍵を 求める 最も 直接的な 方法は、 n n n を 素因数分解する ことである。ディフィー–ヘルマン鍵共有や DSA では、公開鍵 y = g x y = g^x y = g x から 秘密の x x x を 求める ことが 離散対数問題 その ものである。試し割り( 第1章 )より ずっと 速い 攻撃法が あり、その 速さが 鍵の 長さを 決める。
この 章の 目的は 二つある。一つは 推奨される 鍵長の 根拠を 理解する ことである。RSA の 法には 2048 ビット以上が 必要なのに 楕円曲線の 鍵は 256 ビットで 足りるのは、使える 攻撃法の 計算量が 違うからである。もう 一つは 特別な 構造を もつ鍵の 危険を 理解する ことである。 p p p と q q q が 近い、 p − 1 p - 1 p − 1 が 小さい 素数の 積である、群の 位数が 小さい 素数の 積である ――こうした 鍵では、難しい 問題が 易しい 問題に 変わる。
な お、これらの 問題が 難しい ことは 証明されていない。わかっているのは、知られている 最良の アルゴリズムの 計算量だけである。鍵長の 推奨は それに 基づく 見積もりで、改訂されうる。量子計算機が 実用に なれば、どちらの 問題も 多項式時間で 解ける( 第7章 )。
3.1 計算量の 物差し: L L L 記法
N N N の ビット長を ℓ ( N ) ≈ log 2 N \ell(N) \approx \log_2 N ℓ ( N ) ≈ log 2 N と する(第1章)。試し割りは 約 N = 2 ℓ ( N ) / 2 \sqrt{N} = 2^{\ell(N)/2} N = 2 ℓ ( N ) /2 回の 割り算を 要する 指数時間、反復二乗法は ℓ ( N ) \ell(N) ℓ ( N ) の 多項式時間であった。素因数分解の 現代的な アルゴリズムは その 中間に あり、次の 記法で 比べる。
定義 3.1 (L L L 記法, L L L -notation)0 ≤ α ≤ 1 0 \leq \alpha \leq 1 0 ≤ α ≤ 1 , c > 0 c > 0 c > 0 に 対し
L N [ α , c ] = exp ( ( c + o ( 1 ) ) ( log N ) α ( log log N ) 1 − α ) ( N → ∞ ) L_N[\alpha, c] = \exp\Bigl((c + o(1))(\log N)^{\alpha}(\log\log N)^{1 - \alpha}\Bigr) \qquad (N \to \infty) L N [ α , c ] = exp ( ( c + o ( 1 )) ( log N ) α ( log log N ) 1 − α ) ( N → ∞ )
と おく。ここで log \log log は 自然対数、 o ( 1 ) o(1) o ( 1 ) は N → ∞ N \to \infty N → ∞ の とき 0 0 0 に 近づく 量である。
α = 0 \alpha = 0 α = 0 なら L N [ 0 , c ] = ( log N ) c + o ( 1 ) L_N[0, c] = (\log N)^{c + o(1)} L N [ 0 , c ] = ( log N ) c + o ( 1 ) で ビット長の 多項式、 α = 1 \alpha = 1 α = 1 なら L N [ 1 , c ] = N c + o ( 1 ) L_N[1, c] = N^{c + o(1)} L N [ 1 , c ] = N c + o ( 1 ) で ビット長の 指数関数である。 0 < α < 1 0 < \alpha < 1 0 < α < 1 の 場合を 準指数時間 (subexponential time) と いう。 N N N が RSA の 法の ように 同じくらいの 大きさの 2 つの 素数の 積の とき、この 章の 方法は 次のように 並ぶ( ρ \rho ρ 法から 下は、証明されていない 仮定を 含むヒューリスティックな 見積もり)。
方法
計算量
節
試し割り
L N [ 1 , 1 / 2 ] L_N[1, 1/2] L N [ 1 , 1/2 ]
第1章
ポラードの ρ \rho ρ 法
L N [ 1 , 1 / 4 ] L_N[1, 1/4] L N [ 1 , 1/4 ]
3.3
二次ふる い 法
L N [ 1 / 2 , 1 ] L_N[1/2, 1] L N [ 1/2 , 1 ]
3.5
数体 ふる い 法
L N [ 1 / 3 , ( 64 / 9 ) 1 / 3 ] L_N[1/3, (64/9)^{1/3}] L N [ 1/3 , ( 64/9 ) 1/3 ] , ( 64 / 9 ) 1 / 3 ≈ 1.923 (64/9)^{1/3} \approx 1.923 ( 64/9 ) 1/3 ≈ 1.923
3.5
試し割りも、小さい 素因数を 取り除く 最初の 段階と しては 今も 使われる。
注意
o ( 1 ) o(1) o ( 1 ) は 定数ではないので、 L N [ α , c ] L_N[\alpha, c] L N [ α , c ] に 具体的な N N N を 代入しても 計算時間は 出ない。 L L L 記法から 読み取れるのは、 N N N が 大きくなる ときの 増え方の 比較である。
3.2 フェルマー法
奇数 N N N が N = x 2 − y 2 = ( x − y ) ( x + y ) N = x^2 - y^2 = (x - y)(x + y) N = x 2 − y 2 = ( x − y ) ( x + y ) と 書ければ、 N N N の 分解が 得られる。逆に N = a b N = ab N = ab (1 ≤ a ≤ b 1 \leq a \leq b 1 ≤ a ≤ b 、ともに 奇数)なら、 x = ( a + b ) / 2 x = (a + b)/2 x = ( a + b ) /2 , y = ( b − a ) / 2 y = (b - a)/2 y = ( b − a ) /2 と おけば N = x 2 − y 2 N = x^2 - y^2 N = x 2 − y 2 である。そこで x = ⌈ N ⌉ , ⌈ N ⌉ + 1 , … x = \lceil \sqrt{N} \rceil, \lceil \sqrt{N} \rceil + 1, \dots x = ⌈ N ⌉ , ⌈ N ⌉ + 1 , … の 順に x 2 − N x^2 - N x 2 − N が 平方数か どうかを 調べる。これを フェルマー法 (Fermat's factorization method) と いう。 a a a と b b b が 近いほど ( a + b ) / 2 (a + b)/2 ( a + b ) /2 は N \sqrt{N} N に 近く、早く 見つかる。
例 3.2 N = 58447 N = 58447 N = 58447 と する。 N = 241.7 ⋯ \sqrt{N} = 241.7\cdots N = 241.7 ⋯ なので x = 242 x = 242 x = 242 から 始める。
x x x
x 2 − N x^2 - N x 2 − N
平方数か
242 242 242
117 117 117
いいえ
243 243 243
602 602 602
いいえ
244 244 244
1089 = 33 2 1089 = 33^2 1089 = 3 3 2
は い
よって N = ( 244 − 33 ) ( 244 + 33 ) = 211 ⋅ 277 N = (244 - 33)(244 + 33) = 211 \cdot 277 N = ( 244 − 33 ) ( 244 + 33 ) = 211 ⋅ 277 である。
命題 3.3 (近い 素数の 積) N = p q N = pq N = pq (p < q p < q p < q は 奇素数)と する。フェルマー法が 調べる x x x の 個数は ( q − p ) 2 / ( 8 N ) + 1 (q - p)^2/(8\sqrt{N}) + 1 ( q − p ) 2 / ( 8 N ) + 1 未満である。特に q − p ≤ 2 2 N 1 / 4 q - p \leq 2\sqrt{2}N^{1/4} q − p ≤ 2 2 N 1/4 ならば、最初の x = ⌈ N ⌉ x = \lceil \sqrt{N} \rceil x = ⌈ N ⌉ で 成功する。
証明. x ≥ ⌈ N ⌉ x \geq \lceil \sqrt{N} \rceil x ≥ ⌈ N ⌉ で x 2 − N = y 2 x^2 - N = y^2 x 2 − N = y 2 ならば、N = ( x − y ) ( x + y ) N = (x - y)(x + y) N = ( x − y ) ( x + y ) は N N N の 分解なので ( x − y , x + y ) = ( 1 , N ) (x - y, x + y) = (1, N) ( x − y , x + y ) = ( 1 , N ) または ( p , q ) (p, q) ( p , q ) であり、x = ( N + 1 ) / 2 x = (N + 1)/2 x = ( N + 1 ) /2 または x 0 : = ( p + q ) / 2 x_0 := (p + q)/2 x 0 := ( p + q ) /2 である。x 0 < ( N + 1 ) / 2 x_0 < (N + 1)/2 x 0 < ( N + 1 ) /2 なので、フェルマー法は x 0 x_0 x 0 で 止まり、調べる 個数は x 0 − ⌈ N ⌉ + 1 ≤ x 0 − N + 1 x_0 - \lceil \sqrt{N} \rceil + 1 \leq x_0 - \sqrt{N} + 1 x 0 − ⌈ N ⌉ + 1 ≤ x 0 − N + 1 である。ここで
x 0 − N = ( q − p ) 2 2 = ( q − p ) 2 2 ( q + p ) 2 , ( q + p ) 2 = p + q + 2 N > 4 N x_0 - \sqrt{N} = \frac{(\sqrt{q} - \sqrt{p})^2}{2} = \frac{(q - p)^2}{2(\sqrt{q} + \sqrt{p})^2}, \qquad (\sqrt{q} + \sqrt{p})^2 = p + q + 2\sqrt{N} > 4\sqrt{N} x 0 − N = 2 ( q − p ) 2 = 2 ( q + p ) 2 ( q − p ) 2 , ( q + p ) 2 = p + q + 2 N > 4 N
(最後は 相加相乗平均の 不等式で、 p ≠ q p \neq q p = q より 等号は 成り立たない)なので、 x 0 − N < ( q − p ) 2 / ( 8 N ) x_0 - \sqrt{N} < (q - p)^2/(8\sqrt{N}) x 0 − N < ( q − p ) 2 / ( 8 N ) 。q − p ≤ 2 2 N 1 / 4 q - p \leq 2\sqrt{2}N^{1/4} q − p ≤ 2 2 N 1/4 なら これは 1 1 1 以下で、調べる 個数は 2 2 2 未満、すな わち 1 1 1 である。□ \square □
逆に、p , q < 2 k / 2 p, q < 2^{k/2} p , q < 2 k /2 (k k k は N N N の ビット長)なら ( q + p ) 2 < 2 k / 2 + 2 (\sqrt{q} + \sqrt{p})^2 < 2^{k/2 + 2} ( q + p ) 2 < 2 k /2 + 2 なので、調べる 個数は x 0 − N > ( q − p ) 2 / 2 k / 2 + 3 x_0 - \sqrt{N} > (q - p)^2/2^{k/2 + 3} x 0 − N > ( q − p ) 2 / 2 k /2 + 3 より 多い。RSA の 鍵生成の 規格 FIPS 186-5 は ∣ p − q ∣ > 2 k / 2 − 100 \lvert p - q \rvert > 2^{k/2 - 100} ∣ p − q ∣ > 2 k /2 − 100 を 要求しており、この とき個数は 2 k / 2 − 203 2^{k/2 - 203} 2 k /2 − 203 を 超える( k = 2048 k = 2048 k = 2048 なら 2 821 2^{821} 2 821 )。一方、「p p p の 次の 素数を q q q に する」ような 生成法は 命題 3.3 で 直ちに 破られる。
3.3 ポラードの ρ \rho ρ 法
N N N の 未知の 素因数を p p p と する。 f ( x ) = x 2 + c f(x) = x^2 + c f ( x ) = x 2 + c (c ≠ 0 , − 2 c \neq 0, -2 c = 0 , − 2 )と 初期値 x 0 x_0 x 0 を とり、 x i + 1 = f ( x i ) m o d N x_{i+1} = f(x_i) \bmod N x i + 1 = f ( x i ) mod N で 数列を 作る。 x i m o d p x_i \bmod p x i mod p は 同じ 漸化式 x i + 1 ≡ f ( x i ) ( m o d p ) x_{i+1} \equiv f(x_i) \pmod{p} x i + 1 ≡ f ( x i ) ( mod p ) に 従い、 Z / p Z \mathbb{Z}/p\mathbb{Z} Z / p Z は 有限集合なので、いずれ x i ≡ x j ( m o d p ) x_i \equiv x_j \pmod{p} x i ≡ x j ( mod p ) (i < j i < j i < j )と なる。その とき p ∣ gcd ( x j − x i , N ) p \mid \gcd(x_j - x_i, N) p ∣ g cd( x j − x i , N ) で、p p p が 未知でも gcd \gcd g cd は 計算できる。すべての 組 ( i , j ) (i, j) ( i , j ) を 試す必要は なく、次の 補題に より ( i , 2 i ) (i, 2i) ( i , 2 i ) の 組だけを 調べればよい。
補題 3.4 (フロイドの 循環検出, Floyd's cycle detection) S S S を 有限集合、 F : S → S F\colon S \to S F : S → S を 写像、 x 0 ∈ S x_0 \in S x 0 ∈ S , x i + 1 = F ( x i ) x_{i+1} = F(x_i) x i + 1 = F ( x i ) と する。 x T ∈ { x 0 , … , x T − 1 } x_T \in \lbrace x_0, \dots, x_{T-1} \rbrace x T ∈ { x 0 , … , x T − 1 } と なる 最小の T ≥ 1 T \geq 1 T ≥ 1 を とり、 x T = x μ x_T = x_\mu x T = x μ (0 ≤ μ < T 0 \leq \mu < T 0 ≤ μ < T )、λ = T − μ \lambda = T - \mu λ = T − μ と おく。
i < j i < j i < j に ついて、 x i = x j x_i = x_j x i = x j である ための 必要十分条件は i ≥ μ i \geq \mu i ≥ μ かつ λ ∣ j − i \lambda \mid j - i λ ∣ j − i である。
x i = x 2 i x_i = x_{2i} x i = x 2 i と なる i ≥ 1 i \geq 1 i ≥ 1 が 存在し、その 最小値は T = μ + λ T = \mu + \lambda T = μ + λ 以下である。
証明. T T T は 鳩の 巣原理に より ∣ S ∣ \lvert S \rvert ∣ S ∣ 以下で 存在し、 T T T の 最小性から x 0 , … , x T − 1 x_0, \dots, x_{T-1} x 0 , … , x T − 1 は 相異なる。 x μ + λ = x μ x_{\mu + \lambda} = x_\mu x μ + λ = x μ に F F F を 繰り返し施せば x k + λ = x k x_{k + \lambda} = x_k x k + λ = x k (k ≥ μ k \geq \mu k ≥ μ )なので、k ≥ μ k \geq \mu k ≥ μ なら x k = x k ′ x_k = x_{k'} x k = x k ′ (μ ≤ k ′ < T \mu \leq k' < T μ ≤ k ′ < T , k ′ ≡ k ( m o d λ ) k' \equiv k \pmod{\lambda} k ′ ≡ k ( mod λ ) )である。k < μ k < \mu k < μ なら k ′ = k k' = k k ′ = k と おく。(1) i ≥ μ i \geq \mu i ≥ μ , λ ∣ j − i \lambda \mid j - i λ ∣ j − i なら x j = x i x_j = x_i x j = x i である。逆に x i = x j x_i = x_j x i = x j なら x i ′ = x j ′ x_{i'} = x_{j'} x i ′ = x j ′ で、x 0 , … , x T − 1 x_0, \dots, x_{T-1} x 0 , … , x T − 1 は 相異なるから i ′ = j ′ i' = j' i ′ = j ′ 。i < μ i < \mu i < μ なら i ′ = i i' = i i ′ = i は j ′ j' j ′ (j ≥ μ j \geq \mu j ≥ μ なら j ′ ≥ μ j' \geq \mu j ′ ≥ μ 、j < μ j < \mu j < μ なら j ′ = j > i j' = j > i j ′ = j > i )と 異なり矛盾するので i ≥ μ i \geq \mu i ≥ μ であり、i ≡ i ′ = j ′ ≡ j ( m o d λ ) i \equiv i' = j' \equiv j \pmod{\lambda} i ≡ i ′ = j ′ ≡ j ( mod λ ) 。(2) max ( μ , 1 ) \max(\mu, 1) max ( μ , 1 ) 以上の 最小の λ \lambda λ の 倍数を i i i と すると、 i ≥ μ i \geq \mu i ≥ μ , λ ∣ 2 i − i \lambda \mid 2i - i λ ∣ 2 i − i なので (1) より x i = x 2 i x_i = x_{2i} x i = x 2 i 。μ ≥ 1 \mu \geq 1 μ ≥ 1 なら i ≤ μ + λ − 1 i \leq \mu + \lambda - 1 i ≤ μ + λ − 1 、μ = 0 \mu = 0 μ = 0 なら i = λ i = \lambda i = λ である。□ \square □
点列の 添字を 並べると、長さ μ \mu μ の「尾」の 先に 長さ λ \lambda λ の 輪が つながった、文字 ρ \rho ρ の 形に なる。これが 名前の 由来である。
ポラードの ρ \rho ρ 法 (Pollard's rho method) では、( x i , x 2 i ) m o d N (x_i, x_{2i}) \bmod N ( x i , x 2 i ) mod N を i = 1 , 2 , … i = 1, 2, \dots i = 1 , 2 , … と 同時に 更新し、 d = gcd ( x 2 i − x i , N ) d = \gcd(x_{2i} - x_i, N) d = g cd( x 2 i − x i , N ) を 計算する。 1 < d < N 1 < d < N 1 < d < N なら d d d が 非自明な 約数である。補題 3.4 を S = Z / p Z S = \mathbb{Z}/p\mathbb{Z} S = Z / p Z に 適用すると、 p p p に ついての T T T 以下の 段で 必ず p ∣ d p \mid d p ∣ d と なる。 d = N d = N d = N と なるのは 他の 素因数でも 同時に 一致が 起きた ときで、その ときは c c c を 変えてやり直す。
例 3.5 N = 18841 N = 18841 N = 18841 , f ( x ) = x 2 + 1 f(x) = x^2 + 1 f ( x ) = x 2 + 1 , x 0 = 2 x_0 = 2 x 0 = 2 と する。
i i i
x i m o d N x_i \bmod N x i mod N
x 2 i m o d N x_{2i} \bmod N x 2 i mod N
x i m o d 83 x_i \bmod 83 x i mod 83
x 2 i m o d 83 x_{2i} \bmod 83 x 2 i mod 83
gcd ( x 2 i − x i , N ) \gcd(x_{2i} - x_i, N) g cd( x 2 i − x i , N )
1 1 1
5 5 5
26 26 26
5 5 5
26 26 26
1 1 1
2 2 2
26 26 26
6146 6146 6146
26 26 26
4 4 4
1 1 1
3 3 3
677 677 677
12823 12823 12823
13 13 13
41 41 41
1 1 1
4 4 4
6146 6146 6146
15674 15674 15674
4 4 4
70 70 70
1 1 1
5 5 5
15953 15953 15953
5578 5578 5578
17 17 17
17 17 17
83 83 83
N = 83 ⋅ 227 N = 83 \cdot 227 N = 83 ⋅ 227 である。計算する 人には 見えない m o d 83 \bmod 83 mod 83 の 列は 2 , 5 , 26 , 13 2, 5, 26, 13 2 , 5 , 26 , 13 の 尾( μ = 4 \mu = 4 μ = 4 )の 先で 4 → 17 → 41 → 22 → 70 → 4 4 \to 17 \to 41 \to 22 \to 70 \to 4 4 → 17 → 41 → 22 → 70 → 4 と 回る( λ = 5 \lambda = 5 λ = 5 )ので、補題 3.4 の とおり i = 5 i = 5 i = 5 で 一致する。
手間の 見積もりには、次の 誕生日の 議論を 使う。
補題 3.6 (誕生日の 議論, birthday paradox) S S S を m m m 元集合とし、S S S から S S S への 写像 m m m^m m m 個の 中から F F F を 一様ランダムに 選ぶ。 x 0 ∈ S x_0 \in S x 0 ∈ S を 固定し、補題 3.4 の T T T を 考えると、 k ≥ 0 k \geq 0 k ≥ 0 に ついて
P ( T > k ) = ∏ i = 1 k ( 1 − i m ) ≤ e − k 2 / ( 2 m ) , E [ T ] ≤ 1 + π m 2 P(T > k) = \prod_{i=1}^{k}\Bigl(1 - \frac{i}{m}\Bigr) \leq e^{-k^2/(2m)}, \qquad E[T] \leq 1 + \sqrt{\frac{\pi m}{2}} P ( T > k ) = i = 1 ∏ k ( 1 − m i ) ≤ e − k 2 / ( 2 m ) , E [ T ] ≤ 1 + 2 π m
が 成り立つ。
証明. T > k T > k T > k は x 0 , … , x k x_0, \dots, x_k x 0 , … , x k が 相異なる ことと 同値である。 x 0 , … , x i − 1 x_0, \dots, x_{i-1} x 0 , … , x i − 1 が 相異なると いう 条件のもとで、 x i − 1 x_{i-1} x i − 1 は x 0 , … , x i − 2 x_0, \dots, x_{i-2} x 0 , … , x i − 2 の どれとも 異なるので、 F ( x i − 1 ) F(x_{i-1}) F ( x i − 1 ) の 値は まだ 使われておらず S S S 上一様に 分布する。よって x i = F ( x i − 1 ) x_i = F(x_{i-1}) x i = F ( x i − 1 ) が x 0 , … , x i − 1 x_0, \dots, x_{i-1} x 0 , … , x i − 1 と 異なる 条件付き確率は 1 − i / m 1 - i/m 1 − i / m で、これを 掛けて 等式を 得る。 k ≥ m k \geq m k ≥ m なら積は 0 0 0 である。k < m k < m k < m なら 各因子は 正なので、 1 − t ≤ e − t 1 - t \leq e^{-t} 1 − t ≤ e − t より 積は exp ( − k ( k + 1 ) / ( 2 m ) ) ≤ e − k 2 / ( 2 m ) \exp(-k(k + 1)/(2m)) \leq e^{-k^2/(2m)} exp ( − k ( k + 1 ) / ( 2 m )) ≤ e − k 2 / ( 2 m ) 以下である。T T T は 正の 整数値を とるので、 e − t 2 / ( 2 m ) e^{-t^2/(2m)} e − t 2 / ( 2 m ) が 減少関数である ことを 使って
E [ T ] = ∑ k = 0 ∞ P ( T > k ) ≤ 1 + ∑ k = 1 ∞ e − k 2 / ( 2 m ) ≤ 1 + ∫ 0 ∞ e − t 2 / ( 2 m ) d t = 1 + π m 2 E[T] = \sum_{k=0}^{\infty} P(T > k) \leq 1 + \sum_{k=1}^{\infty} e^{-k^2/(2m)} \leq 1 + \int_0^{\infty} e^{-t^2/(2m)}\,dt = 1 + \sqrt{\frac{\pi m}{2}} E [ T ] = k = 0 ∑ ∞ P ( T > k ) ≤ 1 + k = 1 ∑ ∞ e − k 2 / ( 2 m ) ≤ 1 + ∫ 0 ∞ e − t 2 / ( 2 m ) d t = 1 + 2 π m
である。□ \square □
x 2 + c x^2 + c x 2 + c は ランダムな 写像ではない( x x x と − x -x − x が 同じ値に 写る)が、経験的には ほぼ同じように ふるまう。これを 仮定すると、 ρ \rho ρ 法は およそ p \sqrt{p} p 段(各段は 法 N N N の 乗算 3 回と gcd \gcd g cd 1 回)で 素因数 p p p を 見つける。この 見積もりは ヒューリスティックで、証明されていない。次の コードで、 p p p の 大きさと 段数の 関係を 確かめる。
from math import gcd
def rho(N, c=1, x0=2):
"""ポラードのρ法(フロイドの方法)。見つけた約数と反復回数を返す"""
f = lambda t: (t * t + c) % N
x = y = x0
i = 0
while True:
i += 1
x, y = f(x), f(f(y)) # x = x_i, y = x_{2i}
d = gcd(x - y, N)
if d != 1:
return d, i
q = 2**61 - 1 # メルセンヌ素数
for p in [10007, 1000003, 100000007, 10000000019]:
d, i = rho(p * q)
print(f"p = {p:>11} 見つけた約数 = {d:>11} 反復 {i:>6} 回 sqrt(p) = {p**0.5:9.0f}")
p = 10007 見つけた約数 = 10007 反復 40 回 sqrt(p) = 100
p = 1000003 見つけた約数 = 1000003 反復 1276 回 sqrt(p) = 1000
p = 100000007 見つけた約数 = 100000007 反復 8587 回 sqrt(p) = 10000
p = 10000000019 見つけた約数 = 10000000019 反復 157220 回 sqrt(p) = 100000
段数は ばらつく(ここでは 0.4 p 0.4\sqrt{p} 0.4 p から 1.6 p 1.6\sqrt{p} 1.6 p 程度)が、どれも p \sqrt{p} p と 同じ桁に あり、 p p p が 10 6 10^6 1 0 6 倍に なっても 段数は 数千倍に しかならない。小さい 素因数を 見つけるには 向いているが、RSA の 法では p ≈ 2 1024 p \approx 2^{1024} p ≈ 2 1024 なので 約 2 512 2^{512} 2 512 段かかる。
3.4 ポラードの p − 1 p - 1 p − 1 法
定義 3.7 (滑らかな 数) B ≥ 2 B \geq 2 B ≥ 2 と する。正の 整数 m m m の 素因数が すべて B B B 以下の とき、 m m m は B B B -滑らか (B B B -smooth) であると いう。さらに、 q e ∣ m q^e \mid m q e ∣ m , q e + 1 ∤ m q^{e+1} \nmid m q e + 1 ∤ m と なる 素数べき q e q^e q e が すべて B B B 以下の とき、 m m m は B B B -べき 滑らか (B B B -powersmooth) であると いう。
M B = lcm ( 1 , 2 , … , B ) = ∏ q ≤ B q ⌊ log q B ⌋ M_B = \operatorname{lcm}(1, 2, \dots, B) = \prod_{q \leq B} q^{\lfloor \log_q B \rfloor} M B = lcm ( 1 , 2 , … , B ) = ∏ q ≤ B q ⌊ l o g q B ⌋ (積は B B B 以下の 素数 q q q に わたる)と おくと、 m ∣ M B m \mid M_B m ∣ M B と m m m が B B B -べき 滑らかである ことは 同値である。
定理 3.8 (p − 1 p - 1 p − 1 法, Pollard's p − 1 p - 1 p − 1 method)N ≥ 2 N \geq 2 N ≥ 2 を 整数、 p p p を N N N の 素因数、 a a a を p ∤ a p \nmid a p ∤ a と なる 整数、 M M M を p − 1 p - 1 p − 1 の 倍数と する。
p ∣ gcd ( a M − 1 , N ) p \mid \gcd(a^M - 1, N) p ∣ g cd( a M − 1 , N ) である。
さらに、N N N の 素因数 q q q で q ∤ a q \nmid a q ∤ a かつ ord q ( a ) ∤ M \operatorname{ord}_q(a) \nmid M ord q ( a ) ∤ M と なる ものが あれば、 gcd ( a M − 1 , N ) \gcd(a^M - 1, N) g cd( a M − 1 , N ) は N N N の 非自明な 約数である。
証明. (1) フェルマーの 小定理( 04-algebra 第1章 系 1.35)より a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} a p − 1 ≡ 1 ( mod p ) で、M = ( p − 1 ) t M = (p - 1)t M = ( p − 1 ) t と 書けば a M = ( a p − 1 ) t ≡ 1 ( m o d p ) a^M = (a^{p-1})^t \equiv 1 \pmod{p} a M = ( a p − 1 ) t ≡ 1 ( mod p ) 。(2) 位数の 性質(同 命題 1.40 (1))より a M ≢ 1 ( m o d q ) a^M \not\equiv 1 \pmod{q} a M ≡ 1 ( mod q ) なので、q ∤ gcd ( a M − 1 , N ) q \nmid \gcd(a^M - 1, N) q ∤ g cd( a M − 1 , N ) である。よって この gcd \gcd g cd は N N N ではなく、(1) より p p p 以上である。□ \square □
p − 1 p - 1 p − 1 法では、B B B を 決めて M = M B M = M_B M = M B とし、a = 2 a = 2 a = 2 に ついて a M m o d N a^{M} \bmod N a M mod N を 素数べき q ⌊ log q B ⌋ q^{\lfloor \log_q B \rfloor} q ⌊ l o g q B ⌋ ごとの 冪剰余で 計算し、 gcd ( a M − 1 , N ) \gcd(a^M - 1, N) g cd( a M − 1 , N ) を 求める。 M B ≤ B π ( B ) M_B \leq B^{\pi(B)} M B ≤ B π ( B ) (π ( B ) \pi(B) π ( B ) は B B B 以下の 素数の 個数)なので、乗算は O ( π ( B ) log B ) O(\pi(B)\log B) O ( π ( B ) log B ) 回である。定理 3.8 に より、 N N N の ある 素因数 p p p に ついて p − 1 p - 1 p − 1 が B B B -べき 滑らか であれば p p p が gcd \gcd g cd を 割り、さらに 他の ある 素因数 p ′ p' p ′ に ついて ord p ′ ( a ) ∤ M B \operatorname{ord}_{p'}(a) \nmid M_B ord p ′ ( a ) ∤ M B 、すな わち ord p ′ ( a ) \operatorname{ord}_{p'}(a) ord p ′ ( a ) が B B B -べき 滑らかでなければ、分解に 成功する( p ′ − 1 p' - 1 p ′ − 1 が B B B -べき 滑らかでないだけでは 足りない)。
例 3.9 N = 16833407 = 4201 ⋅ 4007 N = 16833407 = 4201 \cdot 4007 N = 16833407 = 4201 ⋅ 4007 と する。 4200 = 2 3 ⋅ 3 ⋅ 5 2 ⋅ 7 4200 = 2^3 \cdot 3 \cdot 5^2 \cdot 7 4200 = 2 3 ⋅ 3 ⋅ 5 2 ⋅ 7 は 25 25 25 -べき 滑らかだが、 4006 = 2 ⋅ 2003 4006 = 2 \cdot 2003 4006 = 2 ⋅ 2003 は 大きい 素因数を もつ。 a = 2 a = 2 a = 2 と すると、 M 20 = 232792560 M_{20} = 232792560 M 20 = 232792560 は 5 2 5^2 5 2 で 割り切れないので ord 4201 ( 2 ) = 525 = 3 ⋅ 5 2 ⋅ 7 \operatorname{ord}_{4201}(2) = 525 = 3 \cdot 5^2 \cdot 7 ord 4201 ( 2 ) = 525 = 3 ⋅ 5 2 ⋅ 7 で 割り切れず、 ord 4007 ( 2 ) = 2003 \operatorname{ord}_{4007}(2) = 2003 ord 4007 ( 2 ) = 2003 でも 割り 切れない。よって gcd ( 2 M 20 − 1 , N ) = 1 \gcd(2^{M_{20}} - 1, N) = 1 g cd( 2 M 20 − 1 , N ) = 1 で 失敗する。 M 25 = 26771144400 M_{25} = 26771144400 M 25 = 26771144400 では 2 M 25 ≡ 11279686 ( m o d N ) 2^{M_{25}} \equiv 11279686 \pmod{N} 2 M 25 ≡ 11279686 ( mod N ) , gcd ( 11279686 − 1 , N ) = 4201 \gcd(11279686 - 1, N) = 4201 g cd( 11279686 − 1 , N ) = 4201 で 分解できる( B < 2003 B < 2003 B < 2003 なら 2003 ∤ M B 2003 \nmid M_B 2003 ∤ M B なので、q = 4007 q = 4007 q = 4007 に ついて 定理 3.8 (2) の 条件が みたされる)。
ランダムに 選んだ 大きな 素数 p p p では、p − 1 p - 1 p − 1 が 計算できる 程度の B B B でべき 滑らかに なる ことは まずない(2020 年に 分解された RSA-250 の 2 つの 素因数 p , q p, q p , q でも、p − 1 p - 1 p − 1 は 77 桁、q − 1 q - 1 q − 1 は 83 桁の 素因数を もつ)。 p − 1 p - 1 p − 1 法は 群 ( Z / p Z ) × (\mathbb{Z}/p\mathbb{Z})^\times ( Z / p Z ) × の 位数 p − 1 p - 1 p − 1 が 滑らかな ときに 働く。この 群を、曲線ごとに 位数が 変わる 楕円曲線の 群 E ( F p ) E(\mathbb{F}_p) E ( F p ) に 取り替えたのが、レンストラの 楕円曲線法である( 21 第5章 5.7 節)。
3.5 二次ふる い法の 考え方
現在の 主な 素因数分解法は、次の 簡単な 事実に 基づいている。
命題 3.10 (平方の 合同) x 2 ≡ y 2 ( m o d N ) x^2 \equiv y^2 \pmod{N} x 2 ≡ y 2 ( mod N ) かつ x ≢ ± y ( m o d N ) x \not\equiv \pm y \pmod{N} x ≡ ± y ( mod N ) ならば、gcd ( x − y , N ) \gcd(x - y, N) g cd( x − y , N ) は N N N の 非自明な 約数である。
証明. N ∣ ( x − y ) ( x + y ) N \mid (x - y)(x + y) N ∣ ( x − y ) ( x + y ) である。gcd ( x − y , N ) = N \gcd(x - y, N) = N g cd( x − y , N ) = N なら x ≡ y x \equiv y x ≡ y と なって 仮定に 反する。 gcd ( x − y , N ) = 1 \gcd(x - y, N) = 1 g cd( x − y , N ) = 1 なら、04-algebra 第1章 命題 1.9 より N ∣ x + y N \mid x + y N ∣ x + y と なり、やはり 仮定に 反する。 □ \square □
奇数 N N N が 相異なる 素因数を k ≥ 2 k \geq 2 k ≥ 2 個もてば、中国剰余定理に より y 2 y^2 y 2 (gcd ( y , N ) = 1 \gcd(y, N) = 1 g cd( y , N ) = 1 )の 法 N N N の 平方根は 2 k 2^k 2 k 個あり、± y \pm y ± y は そのうち 2 個だけである。したがって x x x が 平方根の 中から「で たらめに」選ばれていれば、 1 / 2 1/2 1/2 以上の 確率で 成功する。問題は、そのような x , y x, y x , y の 作り方である。
m = ⌈ N ⌉ m = \lceil \sqrt{N} \rceil m = ⌈ N ⌉ とし、Q ( t ) = t 2 − N Q(t) = t^2 - N Q ( t ) = t 2 − N を t = m , m + 1 , … t = m, m + 1, \dots t = m , m + 1 , … に ついて 考える。 t 2 ≡ Q ( t ) ( m o d N ) t^2 \equiv Q(t) \pmod{N} t 2 ≡ Q ( t ) ( mod N ) であり、t t t が N \sqrt{N} N に 近ければ Q ( t ) ≈ 2 ( t − N ) N Q(t) \approx 2(t - \sqrt{N})\sqrt{N} Q ( t ) ≈ 2 ( t − N ) N は N N N より ずっと 小さい。素数 p ∤ N p \nmid N p ∤ N が Q ( t ) Q(t) Q ( t ) を 割れば N ≡ t 2 ( m o d p ) N \equiv t^2 \pmod{p} N ≡ t 2 ( mod p ) なので、p = 2 p = 2 p = 2 を 除いて ( N p ) = 1 \left(\frac{N}{p}\right) = 1 ( p N ) = 1 である。そこで B B B 以下の 素数の うち p = 2 p = 2 p = 2 と ( N p ) = 1 \left(\frac{N}{p}\right) = 1 ( p N ) = 1 を みたす ものを 集めて 因子基底 (factor base) F = { p 1 , … , p k } \mathcal{F} = \lbrace p_1, \dots, p_k \rbrace F = { p 1 , … , p k } とし、Q ( t ) Q(t) Q ( t ) が F \mathcal{F} F の 素数だけの 積に なる t t t (関係式 , relation)を 集める。
命題 3.11 (関係 式から 平方の 合同へ) t 1 , … , t r t_1, \dots, t_r t 1 , … , t r が Q ( t i ) = ∏ j = 1 k p j e i j Q(t_i) = \prod_{j=1}^{k} p_j^{e_{ij}} Q ( t i ) = ∏ j = 1 k p j e ij を みたすと する。 r > k r > k r > k ならば、空でない 部分集合 S ⊂ { 1 , … , r } S \subset \lbrace 1, \dots, r \rbrace S ⊂ { 1 , … , r } で、すべての j j j に ついて ∑ i ∈ S e i j \sum_{i \in S} e_{ij} ∑ i ∈ S e ij が 偶数に なる ものが 存在する。この とき
X = ∏ i ∈ S t i , Y = ∏ j = 1 k p j 1 2 ∑ i ∈ S e i j X = \prod_{i \in S} t_i, \qquad Y = \prod_{j=1}^{k} p_j^{\frac{1}{2}\sum_{i \in S} e_{ij}} X = i ∈ S ∏ t i , Y = j = 1 ∏ k p j 2 1 ∑ i ∈ S e ij
は X 2 ≡ Y 2 ( m o d N ) X^2 \equiv Y^2 \pmod{N} X 2 ≡ Y 2 ( mod N ) を みたす。
証明. v i = ( e i 1 m o d 2 , … , e i k m o d 2 ) ∈ F 2 k v_i = (e_{i1} \bmod 2, \dots, e_{ik} \bmod 2) \in \mathbb{F}_2^k v i = ( e i 1 mod 2 , … , e ik mod 2 ) ∈ F 2 k と おく。 r > k r > k r > k なので v 1 , … , v r v_1, \dots, v_r v 1 , … , v r は 一次従属であり( 02-linear-algebra 第2章 命題 2.22)、すべては 0 0 0 でない c i ∈ F 2 = { 0 , 1 } c_i \in \mathbb{F}_2 = \lbrace 0, 1 \rbrace c i ∈ F 2 = { 0 , 1 } で ∑ c i v i = 0 \sum c_iv_i = 0 ∑ c i v i = 0 と なる。 S = { i ∣ c i = 1 } S = \lbrace i \mid c_i = 1 \rbrace S = { i ∣ c i = 1 } と すればよい。この とき X 2 = ∏ i ∈ S t i 2 ≡ ∏ i ∈ S Q ( t i ) = Y 2 ( m o d N ) X^2 = \prod_{i \in S} t_i^2 \equiv \prod_{i \in S} Q(t_i) = Y^2 \pmod{N} X 2 = ∏ i ∈ S t i 2 ≡ ∏ i ∈ S Q ( t i ) = Y 2 ( mod N ) である。□ \square □
X ≡ ± Y X \equiv \pm Y X ≡ ± Y なら別の 一次従属関係を 試す。関係式は ふるいで 見つける。奇素数 p ∈ F p \in \mathcal{F} p ∈ F に ついて p ∣ Q ( t ) ⟺ t ≡ ± r p ( m o d p ) p \mid Q(t) \iff t \equiv \pm r_p \pmod{p} p ∣ Q ( t ) ⟺ t ≡ ± r p ( mod p ) (r p 2 ≡ N r_p^2 \equiv N r p 2 ≡ N )なので、p p p で 割り切れる t t t は 公差 p p p の 2 つの 等差数列を なす。エラトステネスの ふるいと 同じように、区間の 中の これらの t t t に log p \log p log p を 足していけば、割り算を せずに、合計が log Q ( t ) \log Q(t) log Q ( t ) に 近い t t t と して 滑らかな Q ( t ) Q(t) Q ( t ) の 候補が 見つかる。これが 二次ふる い 法 (quadratic sieve) である。
例 3.12 N = 22969 N = 22969 N = 22969 , B = 13 B = 13 B = 13 と する。 N m o d 13 = 11 N \bmod 13 = 11 N mod 13 = 11 は 法 13 13 13 の 平方非剰余なので、因子基底は F = { 2 , 3 , 5 , 7 , 11 } \mathcal{F} = \lbrace 2, 3, 5, 7, 11 \rbrace F = { 2 , 3 , 5 , 7 , 11 } である。たとえば N ≡ 4 ( m o d 5 ) N \equiv 4 \pmod{5} N ≡ 4 ( mod 5 ) だから 5 ∣ Q ( t ) ⟺ t ≡ 2 , 3 ( m o d 5 ) 5 \mid Q(t) \iff t \equiv 2, 3 \pmod{5} 5 ∣ Q ( t ) ⟺ t ≡ 2 , 3 ( mod 5 ) で、t = 152 , 153 , 157 , 158 , … t = 152, 153, 157, 158, \dots t = 152 , 153 , 157 , 158 , … が ふるいで 印を つけられる。 m = 152 m = 152 m = 152 から 始めると
t t t
Q ( t ) Q(t) Q ( t )
素因数分解
指数 m o d 2 \bmod 2 mod 2 (2 , 3 , 5 , 7 , 11 2, 3, 5, 7, 11 2 , 3 , 5 , 7 , 11 の 順)
152 152 152
135 135 135
3 3 ⋅ 5 3^3 \cdot 5 3 3 ⋅ 5
( 0 , 1 , 1 , 0 , 0 ) (0, 1, 1, 0, 0) ( 0 , 1 , 1 , 0 , 0 )
153 153 153
440 440 440
2 3 ⋅ 5 ⋅ 11 2^3 \cdot 5 \cdot 11 2 3 ⋅ 5 ⋅ 11
( 1 , 0 , 1 , 0 , 1 ) (1, 0, 1, 0, 1) ( 1 , 0 , 1 , 0 , 1 )
154 154 154
747 747 747
3 2 ⋅ 83 3^2 \cdot 83 3 2 ⋅ 83
(83 ∉ F 83 \notin \mathcal{F} 83 ∈ / F )
155 155 155
1056 1056 1056
2 5 ⋅ 3 ⋅ 11 2^5 \cdot 3 \cdot 11 2 5 ⋅ 3 ⋅ 11
( 1 , 1 , 0 , 0 , 1 ) (1, 1, 0, 0, 1) ( 1 , 1 , 0 , 0 , 1 )
3 つの ベクトルの 和は 0 0 0 なので S = { 152 , 153 , 155 } S = \lbrace 152, 153, 155 \rbrace S = { 152 , 153 , 155 } ととると、135 ⋅ 440 ⋅ 1056 = 2 8 ⋅ 3 4 ⋅ 5 2 ⋅ 11 2 135 \cdot 440 \cdot 1056 = 2^8 \cdot 3^4 \cdot 5^2 \cdot 11^2 135 ⋅ 440 ⋅ 1056 = 2 8 ⋅ 3 4 ⋅ 5 2 ⋅ 1 1 2 より Y = 2 4 ⋅ 3 2 ⋅ 5 ⋅ 11 = 7920 Y = 2^4 \cdot 3^2 \cdot 5 \cdot 11 = 7920 Y = 2 4 ⋅ 3 2 ⋅ 5 ⋅ 11 = 7920 、X = 152 ⋅ 153 ⋅ 155 ≡ 21516 ( m o d N ) X = 152 \cdot 153 \cdot 155 \equiv 21516 \pmod{N} X = 152 ⋅ 153 ⋅ 155 ≡ 21516 ( mod N ) である。X ≢ ± Y X \not\equiv \pm Y X ≡ ± Y で、gcd ( 21516 − 7920 , N ) = gcd ( 13596 , 22969 ) = 103 \gcd(21516 - 7920, N) = \gcd(13596, 22969) = 103 g cd( 21516 − 7920 , N ) = g cd( 13596 , 22969 ) = 103 。よって N = 103 ⋅ 223 N = 103 \cdot 223 N = 103 ⋅ 223 である。
計算量の 見積もり(概略) 鍵は 滑らかな 数の 割合である。次の 定理を 使う。
定理 3.13 (カンフィールド–エルデシュ–ポメランス, 1983 年)ε > 0 \varepsilon > 0 ε > 0 を 固定する。 u → ∞ u \to \infty u → ∞ の とき、 u ≤ log x / ( ( 1 + ε ) log log x ) u \leq \log x/((1 + \varepsilon)\log\log x) u ≤ log x / (( 1 + ε ) log log x ) の 範囲で 一様に、 x x x 以下の 正の 整数の うち x 1 / u x^{1/u} x 1/ u -滑らかな ものの 割合は u − u ( 1 + o ( 1 ) ) u^{-u(1 + o(1))} u − u ( 1 + o ( 1 )) である。
(主張のみ。解説は Crandall–Pomerance, Prime Numbers に ある。)値 Q ( t ) Q(t) Q ( t ) は N 1 / 2 + o ( 1 ) N^{1/2 + o(1)} N 1/2 + o ( 1 ) 程度なので、これらが ランダムな 整数と 同じ 割合で 滑らかに なると 仮定 する。B = L N [ 1 / 2 , b ] B = L_N[1/2, b] B = L N [ 1/2 , b ] と おくと u = log N 1 / 2 / log B ≈ 1 2 b log N / log log N u = \log N^{1/2}/\log B \approx \frac{1}{2b}\sqrt{\log N/\log\log N} u = log N 1/2 / log B ≈ 2 b 1 log N / log log N , log u ≈ 1 2 log log N \log u \approx \frac{1}{2}\log\log N log u ≈ 2 1 log log N なので、滑らかに なる 割合は u − u ≈ 1 / L N [ 1 / 2 , 1 / ( 4 b ) ] u^{-u} \approx 1/L_N[1/2, 1/(4b)] u − u ≈ 1/ L N [ 1/2 , 1/ ( 4 b )] である。関係式は 約 L N [ 1 / 2 , b ] L_N[1/2, b] L N [ 1/2 , b ] 個(因子基底の 大きさ程度)必要なので、調べる t t t は 約 L N [ 1 / 2 , b + 1 / ( 4 b ) ] L_N[1/2, b + 1/(4b)] L N [ 1/2 , b + 1/ ( 4 b )] 個で、ふるいなら 1 個あたりの 手間は L N [ 1 / 2 , o ( 1 ) ] L_N[1/2, o(1)] L N [ 1/2 , o ( 1 )] である。一次従属の 計算は、ほとんどの 成分が 0 0 0 の 約 B × B B \times B B × B 行列に ついて 約 B 2 = L N [ 1 / 2 , 2 b ] B^2 = L_N[1/2, 2b] B 2 = L N [ 1/2 , 2 b ] の 手間である。 max ( b + 1 / ( 4 b ) , 2 b ) \max(b + 1/(4b), 2b) max ( b + 1/ ( 4 b ) , 2 b ) は b = 1 / 2 b = 1/2 b = 1/2 で 最小値 1 1 1 を とるので、全体で L N [ 1 / 2 , 1 ] L_N[1/2, 1] L N [ 1/2 , 1 ] と なる。
数体 ふる い 法 (紹介)f ( m ) ≡ 0 ( m o d N ) f(m) \equiv 0 \pmod{N} f ( m ) ≡ 0 ( mod N ) と なる 整数 m m m と 多項式 f f f を 選び、 f f f の 根 α \alpha α で 生成される 環 Z [ α ] \mathbb{Z}[\alpha] Z [ α ] と Z \mathbb{Z} Z の 両方で 滑らかさを 考え、環準同型 Z [ α ] → Z / N Z \mathbb{Z}[\alpha] \to \mathbb{Z}/N\mathbb{Z} Z [ α ] → Z / N Z , α ↦ m \alpha \mapsto m α ↦ m で 両側の 平方を 法 N N N の 平方の 合同に 移す。滑らかであって ほしい 数が 二次ふる い 法より ずっと 小さくなり、計算量は(ヒューリスティックに) L N [ 1 / 3 , ( 64 / 9 ) 1 / 3 ] L_N[1/3, (64/9)^{1/3}] L N [ 1/3 , ( 64/9 ) 1/3 ] に 下がる(主張のみ)。2020 年 2 月には 829 ビットの RSA-250 が 数体ふる い法で 分解された(公開ソフトウェア CADO-NFS に よる。参照用の CPU で 約 2700 コア年と 報告されている)。
3.6 離散対数問題
定義 3.14 (離散対数問題, discrete logarithm problem)G G G を 位数 n n n の 巡回群、 g g g を その 生成元と する。 h ∈ G h \in G h ∈ G に 対し、 g x = h g^x = h g x = h と なる x ∈ Z / n Z x \in \mathbb{Z}/n\mathbb{Z} x ∈ Z / n Z を h h h の(g g g を 底と する) 離散対数 と いい、 log g h \log_g h log g h と 書く。 g , h g, h g , h から log g h \log_g h log g h を 求める 問題を 離散対数問題(DLP)と いう。
x ↦ g x x \mapsto g^x x ↦ g x は Z / n Z → G \mathbb{Z}/n\mathbb{Z} \to G Z / n Z → G の 同型なので( 04-algebra 第2章 定理 2.22)、log g h \log_g h log g h は ただ 一つ 定まる。 第2章 では 位数が 素数の 群で 離散対数問題と ディフィー–ヘルマン問題を 考えたが、ここでは 位数 n n n を 一般に する(3.8 節で n n n の 素因数分解が 効いてくる)。
離散対数問題の 難しさは、群の 同型類ではなく 群の 元の 表し方で 決まる。加法群 Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z の 生成元 g g g (gcd ( g , n ) = 1 \gcd(g, n) = 1 g cd( g , n ) = 1 )では「g x = h g^x = h g x = h 」は x g ≡ h ( m o d n ) xg \equiv h \pmod{n} xg ≡ h ( mod n ) の ことで、拡張ユークリッドの 互除法で 一瞬で 解ける。位数 n n n の 巡回群は すべて Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z と 同型だが、その 同型写像の 計算が 離散対数問題 その ものなのである。 F p × \mathbb{F}_p^\times F p × には 3.10 節の 準指数時間の 方法が あり、よく 選んだ 楕円曲線の 群には 3.7〜3.9 節の 汎用的な 方法しか 知られていない( 第4章 )。
群の 元を 不透明な ラベルと して 扱い、群演算と 等しいか どうかの 判定だけを 使う アルゴリズムを 汎用アルゴリズム (generic algorithm) と いう。3.7〜3.9 節の 方法は すべて 汎用アルゴリズムで、次の 下界に ほぼ到達している。
定理 3.15 (ショウプ, 1997 年)n n n の 最大の 素因数を q q q と する。 汎用群モデル (generic group model)、すな わち群の 元が 群の 構造と 無関係な ランダムな ラベルで 表され、アルゴリズムは ラベルどうしの 演算を(オラクルに 頼んで)行う ことしか できない モデルを 考える。この モデルで、 x ∈ Z / n Z x \in \mathbb{Z}/n\mathbb{Z} x ∈ Z / n Z を 一様ランダムに 選んで g g g と g x g^x g x の ラベルを 与えた とき、群演算を m m m 回行う 汎用アルゴリズムが x x x を 正しく 出力する 確率は O ( m 2 / q ) O(m^2/q) O ( m 2 / q ) 以下である。特に、一定の 確率で 成功するには Ω ( q ) \Omega(\sqrt{q}) Ω ( q ) 回の 群演算が 必要である。
(主張のみ。)これは 汎用アルゴリズムに ついての 下界であり、元の 表し方を 使う 方法(3.10 節の 指数計算法など)には 当ては まらない。
3.7 ベビーステップ・ジャイアントステップ法
定理 3.16 (ベビーステップ・ジャイアントステップ法, baby-step giant-step)G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ を 位数 n n n の 巡回群、 h ∈ G h \in G h ∈ G 、m = ⌈ n ⌉ m = \lceil \sqrt{n} \rceil m = ⌈ n ⌉ と する。 0 ≤ j < m 0 \leq j < m 0 ≤ j < m に ついて g j g^j g j を 表に 記録し(ベビーステップ)、 γ = g − m \gamma = g^{-m} γ = g − m と して i = 0 , 1 , … , m − 1 i = 0, 1, \dots, m - 1 i = 0 , 1 , … , m − 1 の 順に h γ i h\gamma^i h γ i が 表に あるかを 調べる(ジャイアントステップ)。この とき h γ i = g j h\gamma^i = g^j h γ i = g j と なる ( i , j ) (i, j) ( i , j ) が 必ず 見つかり、 x = i m + j x = im + j x = im + j は log g h \log_g h log g h である。群演算は 2 m + O ( log m ) 2m + O(\log m) 2 m + O ( log m ) 回以下、記憶する 元は m m m 個である。
証明. x 0 = log g h x_0 = \log_g h x 0 = log g h を 0 ≤ x 0 < n 0 \leq x_0 < n 0 ≤ x 0 < n の 整数で 表し、 m m m で 割って x 0 = i m + j x_0 = im + j x 0 = im + j (0 ≤ j < m 0 \leq j < m 0 ≤ j < m )と する。 n ≤ m 2 n \leq m^2 n ≤ m 2 より i ≤ ( n − 1 ) / m < m i \leq (n - 1)/m < m i ≤ ( n − 1 ) / m < m なので、この ( i , j ) (i, j) ( i , j ) は 調べる 範囲に 入っており、 h γ i = g x 0 − i m = g j h\gamma^i = g^{x_0 - im} = g^j h γ i = g x 0 − im = g j が 成り立つ。逆に h γ i = g j h\gamma^i = g^j h γ i = g j なら h = g i m + j h = g^{im + j} h = g im + j なので、見つかった ( i , j ) (i, j) ( i , j ) は(最初に 見つかった ものでなくても) log g h \log_g h log g h を 与える。群演算は、ベビーステップに m − 1 m - 1 m − 1 回、γ = g n − m \gamma = g^{n - m} γ = g n − m の 計算に 反復二乗法で O ( log n ) = O ( log m ) O(\log n) = O(\log m) O ( log n ) = O ( log m ) 回、ジャイアントステップに m − 1 m - 1 m − 1 回である。□ \square □
表を ハッシュ表に すれば、表を 引く 手間は 1 回あたり平均で 定数である。
例 3.17 p = 101 p = 101 p = 101 , g = 2 g = 2 g = 2 (法 101 101 101 の 原始根), h = 37 h = 37 h = 37 と する。 n = 100 n = 100 n = 100 , m = 10 m = 10 m = 10 で、ベビーステップの 表は
j j j
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
2 j m o d 101 2^j \bmod 101 2 j mod 101
1 1 1
2 2 2
4 4 4
8 8 8
16 16 16
32 32 32
64 64 64
27 27 27
54 54 54
7 7 7
である。2 10 ≡ 14 2^{10} \equiv 14 2 10 ≡ 14 , γ = 14 − 1 ≡ 65 ( m o d 101 ) \gamma = 14^{-1} \equiv 65 \pmod{101} γ = 1 4 − 1 ≡ 65 ( mod 101 ) で、ジャイアントステップは 37 , 82 , 78 , 20 , 88 , 64 37, 82, 78, 20, 88, 64 37 , 82 , 78 , 20 , 88 , 64 と 進み、 i = 5 i = 5 i = 5 で 64 = 2 6 64 = 2^6 64 = 2 6 が 表に 見つかる。よって log 2 37 = 5 ⋅ 10 + 6 = 56 \log_2 37 = 5 \cdot 10 + 6 = 56 log 2 37 = 5 ⋅ 10 + 6 = 56 である。
3.8 ポーリッヒ–ヘルマン法
定理 3.18 (ポーリッヒ–ヘルマン法, Pohlig–Hellman)G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ を 位数 n = ∏ i = 1 r q i e i n = \prod_{i=1}^{r} q_i^{e_i} n = ∏ i = 1 r q i e i (q i q_i q i は 相異なる 素数)の 巡回群と する。 G G G の 離散対数問題は、位数 q i q_i q i の 巡回群の 離散対数問題を 合計 ∑ i e i \sum_i e_i ∑ i e i 個解く ことと、 O ( ∑ i e i log n ) O\bigl(\sum_i e_i \log n\bigr) O ( ∑ i e i log n ) 回の 群演算と 中国剰余定理の 計算に 帰着される。各段を ベビーステップ・ジャイアントステップ法で 解けば、群演算は O ( ∑ i e i ( log n + q i ) ) O\bigl(\sum_i e_i(\log n + \sqrt{q_i})\bigr) O ( ∑ i e i ( log n + q i ) ) 回である。
証明. h = g x h = g^x h = g x と する。
段階 1(素数べき位数への 帰着) n i = n / q i e i n_i = n/q_i^{e_i} n i = n / q i e i , g i = g n i g_i = g^{n_i} g i = g n i , h i = h n i h_i = h^{n_i} h i = h n i と おく。 04-algebra 第2章 命題 2.19 (3) より g i g_i g i の 位数は n / gcd ( n , n i ) = q i e i n/\gcd(n, n_i) = q_i^{e_i} n / g cd( n , n i ) = q i e i で、h i = g i x h_i = g_i^x h i = g i x なので、同 (2) より x m o d q i e i x \bmod q_i^{e_i} x mod q i e i は log g i h i \log_{g_i} h_i log g i h i に 等しい。これらが わかれば、中国剰余定理( 04-algebra 第1章 定理 1.28)で x m o d n x \bmod n x mod n が 求まる。 g i , h i g_i, h_i g i , h i の 計算は 反復二乗法で O ( log n ) O(\log n) O ( log n ) 回の 群演算である。
段階 2(素数位数への 帰着) γ \gamma γ を 位数 q e q^e q e の 元、 η = γ y \eta = \gamma^y η = γ y (0 ≤ y < q e 0 \leq y < q^e 0 ≤ y < q e )とし、y = y 0 + y 1 q + ⋯ + y e − 1 q e − 1 y = y_0 + y_1q + \cdots + y_{e-1}q^{e-1} y = y 0 + y 1 q + ⋯ + y e − 1 q e − 1 (0 ≤ y k < q 0 \leq y_k < q 0 ≤ y k < q )と q q q 進展開する。δ = γ q e − 1 \delta = \gamma^{q^{e-1}} δ = γ q e − 1 は 位数 q q q の 元である。 y 0 , … , y k − 1 y_0, \dots, y_{k-1} y 0 , … , y k − 1 が わかったとして s k = y 0 + ⋯ + y k − 1 q k − 1 s_k = y_0 + \cdots + y_{k-1}q^{k-1} s k = y 0 + ⋯ + y k − 1 q k − 1 (s 0 = 0 s_0 = 0 s 0 = 0 ), η k = ( η γ − s k ) q e − 1 − k \eta_k = (\eta\gamma^{-s_k})^{q^{e-1-k}} η k = ( η γ − s k ) q e − 1 − k と おくと、 η γ − s k = γ y k q k + y k + 1 q k + 1 + ⋯ \eta\gamma^{-s_k} = \gamma^{y_kq^k + y_{k+1}q^{k+1} + \cdots} η γ − s k = γ y k q k + y k + 1 q k + 1 + ⋯ より
η k = γ y k q e − 1 + ( q e の倍数 ) = δ y k \eta_k = \gamma^{y_kq^{e-1} + (q^e \text{ の倍数})} = \delta^{y_k} η k = γ y k q e − 1 + ( q e の倍数 ) = δ y k
である。よって y k = log δ η k y_k = \log_\delta \eta_k y k = log δ η k は 位数 q q q の 群の 離散対数と して 求まる。各段の 冪の 計算は O ( log n ) O(\log n) O ( log n ) 回の 群演算である。 □ \square □
例 3.19 p = 73 p = 73 p = 73 , g = 5 g = 5 g = 5 (原始根), h = 17 h = 17 h = 17 と する。 n = 72 = 2 3 ⋅ 3 2 n = 72 = 2^3 \cdot 3^2 n = 72 = 2 3 ⋅ 3 2 である。
位数 8 8 8 の 部分: g 1 = 5 9 ≡ 10 g_1 = 5^9 \equiv 10 g 1 = 5 9 ≡ 10 , h 1 = 17 9 ≡ 63 h_1 = 17^9 \equiv 63 h 1 = 1 7 9 ≡ 63 , δ = 5 36 ≡ − 1 \delta = 5^{36} \equiv -1 δ = 5 36 ≡ − 1 。η 0 = 63 4 ≡ − 1 \eta_0 = 63^4 \equiv -1 η 0 = 6 3 4 ≡ − 1 より y 0 = 1 y_0 = 1 y 0 = 1 。63 ⋅ 10 − 1 ≡ 63 ⋅ 22 ≡ − 1 63 \cdot 10^{-1} \equiv 63 \cdot 22 \equiv -1 63 ⋅ 1 0 − 1 ≡ 63 ⋅ 22 ≡ − 1 で、η 1 = ( − 1 ) 2 = 1 \eta_1 = (-1)^2 = 1 η 1 = ( − 1 ) 2 = 1 より y 1 = 0 y_1 = 0 y 1 = 0 、η 2 = − 1 \eta_2 = -1 η 2 = − 1 より y 2 = 1 y_2 = 1 y 2 = 1 。よって x ≡ 1 + 0 ⋅ 2 + 1 ⋅ 4 = 5 ( m o d 8 ) x \equiv 1 + 0 \cdot 2 + 1 \cdot 4 = 5 \pmod{8} x ≡ 1 + 0 ⋅ 2 + 1 ⋅ 4 = 5 ( mod 8 ) 。
位数 9 9 9 の 部分: g 2 = 5 8 ≡ 2 g_2 = 5^8 \equiv 2 g 2 = 5 8 ≡ 2 , h 2 = 17 8 ≡ 8 h_2 = 17^8 \equiv 8 h 2 = 1 7 8 ≡ 8 , δ = 5 24 ≡ 8 \delta = 5^{24} \equiv 8 δ = 5 24 ≡ 8 (位数 3 3 3 )。η 0 = 8 3 ≡ 1 \eta_0 = 8^3 \equiv 1 η 0 = 8 3 ≡ 1 より y 0 = 0 y_0 = 0 y 0 = 0 、η 1 = 8 = δ \eta_1 = 8 = \delta η 1 = 8 = δ より y 1 = 1 y_1 = 1 y 1 = 1 。よって x ≡ 3 ( m o d 9 ) x \equiv 3 \pmod{9} x ≡ 3 ( mod 9 ) 。
中国剰余定理で x = 21 x = 21 x = 21 を 得る。実際 5 21 ≡ 17 ( m o d 73 ) 5^{21} \equiv 17 \pmod{73} 5 21 ≡ 17 ( mod 73 ) である。
定理 3.18 の 帰結と して、 離散対数の 難しさは 群の 位数 n n n の 最大の 素因数 q q q で 決まる (汎用アルゴリズムでは 定理 3.15 に より q \sqrt{q} q 程度が 必要で、ポーリッヒ–ヘルマン法と ベビーステップ・ジャイアントステップ法で ほぼ それが 達成される)。その ため暗号では、位数が 大きな 素数 q q q の 部分群を 使う。 F p × \mathbb{F}_p^\times F p × なら q ∣ p − 1 q \mid p - 1 q ∣ p − 1 と なる 位数 q q q の 部分群(DSA の 方式)や、 安全素数 (safe prime) p = 2 q + 1 p = 2q + 1 p = 2 q + 1 (q q q も 素数)の 平方剰余の 部分群を、楕円曲線なら 位数が 大きな 素数の 点を 使う。
3.9 ポラードの ρ \rho ρ 法(離散対数)
ベビーステップ・ジャイアントステップ法は n \sqrt{n} n 個の 元を 記憶する。 ρ \rho ρ 法は 同程度の 手間を、ほとんど 記憶なしに 実現する。 G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ の 位数 n n n を 素数とし、 G G G を 3 つの 部分集合 S 0 , S 1 , S 2 S_0, S_1, S_2 S 0 , S 1 , S 2 に 分けて
F ( z ) = { g z ( z ∈ S 0 ) z 2 ( z ∈ S 1 ) h z ( z ∈ S 2 ) F(z) = \begin{cases} gz & (z \in S_0) \\ z^2 & (z \in S_1) \\ hz & (z \in S_2) \end{cases} F ( z ) = ⎩ ⎨ ⎧ g z z 2 h z ( z ∈ S 0 ) ( z ∈ S 1 ) ( z ∈ S 2 )
と おく。 z 0 = g a 0 h b 0 z_0 = g^{a_0}h^{b_0} z 0 = g a 0 h b 0 から z i + 1 = F ( z i ) z_{i+1} = F(z_i) z i + 1 = F ( z i ) で 列を 作ると、 z i = g a i h b i z_i = g^{a_i}h^{b_i} z i = g a i h b i と なる 指数 ( a i , b i ) ∈ ( Z / n Z ) 2 (a_i, b_i) \in (\mathbb{Z}/n\mathbb{Z})^2 ( a i , b i ) ∈ ( Z / n Z ) 2 も 同時に 更新できる( S 0 S_0 S 0 なら a a a に 1 1 1 を 足し、 S 1 S_1 S 1 なら 両方を 2 倍し、 S 2 S_2 S 2 なら b b b に 1 1 1 を 足す)。補題 3.4 に より z i = z 2 i z_i = z_{2i} z i = z 2 i と なる i i i が 見つかり、その とき
g a i h b i = g a 2 i h b 2 i より ( b i − b 2 i ) log g h ≡ a 2 i − a i ( m o d n ) g^{a_i}h^{b_i} = g^{a_{2i}}h^{b_{2i}} \quad\text{より}\quad (b_i - b_{2i})\log_g h \equiv a_{2i} - a_i \pmod{n} g a i h b i = g a 2 i h b 2 i より ( b i − b 2 i ) log g h ≡ a 2 i − a i ( mod n )
である。b i ≢ b 2 i b_i \not\equiv b_{2i} b i ≡ b 2 i なら log g h \log_g h log g h が 求まり、そうでなければ別の z 0 z_0 z 0 で やり直す。 F F F が ランダムな 写像のように ふる まうと 仮定すれば、補題 3.6 に より 段数は 平均 O ( n ) O(\sqrt{n}) O ( n ) である(ヒューリスティック)。記憶するのは ( z i , a i , b i ) (z_i, a_i, b_i) ( z i , a i , b i ) と ( z 2 i , a 2 i , b 2 i ) (z_{2i}, a_{2i}, b_{2i}) ( z 2 i , a 2 i , b 2 i ) だけである。多数の 計算機で 並列に 実行する 工夫も あり、楕円曲線の 離散対数の 記録的な 計算は この 方法で 行われている。
3.10 指数計算法
汎用アルゴリズムは 群の 元の 表し方を 使わない。 F p × \mathbb{F}_p^\times F p × の 元は 1 1 1 以上 p − 1 p - 1 p − 1 以下の 整数で 表せるので、二次ふる い法と 同じく「小さい 素数に 分解できる」と いう 性質が 使える。これが 指数計算法 (index calculus) である。
因子基底 F = { ℓ 1 , … , ℓ k } \mathcal{F} = \lbrace \ell_1, \dots, \ell_k \rbrace F = { ℓ 1 , … , ℓ k } (B B B 以下の 素数)を 決める。
ランダムな s s s に ついて g s m o d p g^s \bmod p g s mod p を 整数と みて 素因数分解し、 B B B -滑らかなら 関係式 g s ≡ ∏ j ℓ j e j g^s \equiv \prod_j \ell_j^{e_j} g s ≡ ∏ j ℓ j e j 、すな わち s ≡ ∑ j e j log g ℓ j ( m o d p − 1 ) s \equiv \sum_j e_j\log_g \ell_j \pmod{p - 1} s ≡ ∑ j e j log g ℓ j ( mod p − 1 ) を 記録する。
関係式が 十分集まったら、 log g ℓ j \log_g \ell_j log g ℓ j に ついての 連立一次合同式を m o d ( p − 1 ) \bmod (p - 1) mod ( p − 1 ) で 解く( p − 1 p - 1 p − 1 の 素因数ごとに 解いて 中国剰余定理で まとめる)。
目標の h h h に ついて h g s ≡ ∏ j ℓ j f j hg^s \equiv \prod_j \ell_j^{f_j} h g s ≡ ∏ j ℓ j f j (B B B -滑らか)と なる s s s を 探せば、 log g h ≡ ∑ j f j log g ℓ j − s \log_g h \equiv \sum_j f_j\log_g \ell_j - s log g h ≡ ∑ j f j log g ℓ j − s である。
例 3.20 p = 709 p = 709 p = 709 , g = 17 g = 17 g = 17 (原始根), F = { 2 , 3 , 5 , 7 } \mathcal{F} = \lbrace 2, 3, 5, 7 \rbrace F = { 2 , 3 , 5 , 7 } と する。指数を 試すと、たとえば
17 73 ≡ 2 , 17 31 ≡ 24 = 2 3 ⋅ 3 , 17 27 ≡ 30 = 2 ⋅ 3 ⋅ 5 , 17 22 ≡ 315 = 3 2 ⋅ 5 ⋅ 7 ( m o d 709 ) 17^{73} \equiv 2, \quad 17^{31} \equiv 24 = 2^3 \cdot 3, \quad 17^{27} \equiv 30 = 2 \cdot 3 \cdot 5, \quad 17^{22} \equiv 315 = 3^2 \cdot 5 \cdot 7 \pmod{709} 1 7 73 ≡ 2 , 1 7 31 ≡ 24 = 2 3 ⋅ 3 , 1 7 27 ≡ 30 = 2 ⋅ 3 ⋅ 5 , 1 7 22 ≡ 315 = 3 2 ⋅ 5 ⋅ 7 ( mod 709 )
が 見つかる( 1 ≤ s ≤ 708 1 \leq s \leq 708 1 ≤ s ≤ 708 の うち 121 121 121 個の s s s で 17 s m o d 709 17^s \bmod 709 1 7 s mod 709 は 7 7 7 -滑らかである)。L ℓ = log 17 ℓ L_\ell = \log_{17}\ell L ℓ = log 17 ℓ と 書くと、 m o d 708 \bmod 708 mod 708 で L 2 = 73 L_2 = 73 L 2 = 73 、3 L 2 + L 3 = 31 3L_2 + L_3 = 31 3 L 2 + L 3 = 31 より L 3 = 520 L_3 = 520 L 3 = 520 、L 2 + L 3 + L 5 = 27 L_2 + L_3 + L_5 = 27 L 2 + L 3 + L 5 = 27 より L 5 = 142 L_5 = 142 L 5 = 142 、2 L 3 + L 5 + L 7 = 22 2L_3 + L_5 + L_7 = 22 2 L 3 + L 5 + L 7 = 22 より L 7 = 256 L_7 = 256 L 7 = 256 である。h = 314 h = 314 h = 314 に ついては 314 ⋅ 17 ≡ 375 = 3 ⋅ 5 3 314 \cdot 17 \equiv 375 = 3 \cdot 5^3 314 ⋅ 17 ≡ 375 = 3 ⋅ 5 3 なので、log 17 314 ≡ L 3 + 3 L 5 − 1 = 945 ≡ 237 ( m o d 708 ) \log_{17} 314 \equiv L_3 + 3L_5 - 1 = 945 \equiv 237 \pmod{708} log 17 314 ≡ L 3 + 3 L 5 − 1 = 945 ≡ 237 ( mod 708 ) 。実際 17 237 ≡ 314 ( m o d 709 ) 17^{237} \equiv 314 \pmod{709} 1 7 237 ≡ 314 ( mod 709 ) である。
g s m o d p g^s \bmod p g s mod p は p p p 程度の 大きさの 整数なので、3.5 節と 同じ 見積もりで(値の 大きさが N 1 / 2 N^{1/2} N 1/2 ではなく p p p に なる)、基本的な 指数計算法の 計算量は ヒューリスティックに L p [ 1 / 2 , 2 ] L_p[1/2, \sqrt{2}] L p [ 1/2 , 2 ] に なる。数体 ふる い法を 離散対数に 応用すると、素因数分解と 同じ L p [ 1 / 3 , ( 64 / 9 ) 1 / 3 ] L_p[1/3, (64/9)^{1/3}] L p [ 1/3 , ( 64/9 ) 1/3 ] に なる(主張のみ)。この ため F p × \mathbb{F}_p^\times F p × の 離散対数に 基づく 方式は、同じ ビット数の RSA と 同程度の 大きさの p p p を 必要と する。
一方、素体上の 一般の 楕円曲線の 点には「小さい 素数への 分解」に あたる 性質が 見つかっておらず、指数計算法のような 準指数時間の 方法は 知られていない。これが 楕円曲線暗号の 鍵が 短くて すむ 理由である( 第4章 )。
3.11 安全な 鍵長の 目安と その 根拠
暗号の 強さは 安全性ビット数で 表す。「 s s s ビットの 安全性」とは、最良の 攻撃に 約 2 s 2^s 2 s 回の 基本演算が 必要と いう 意味で、 s s s ビットの 鍵の 共通鍵暗号を 総当たりで 破る 手間に 相当する。米国 NIST の SP 800-57 Part 1 Rev. 5(2020 年)は、同程度の 安全性を 与える 鍵の 大きさを 次のように 示している。
安全性ビット数
共通鍵暗号
有限体(DSA, DH)
素因数分解(RSA)の 法
楕円曲線(ECDSA, EdDSA, ECDH)の 位数 n n n
112 112 112
3TDEA(2024 年以降は 暗号化に 使えない)
p p p : 2048 ビット, q q q : 224 ビット
2048 ビット
224〜255 ビット
128 128 128
AES-128
p p p : 3072, q q q : 256
3072
256〜383
192 192 192
AES-192
p p p : 7680, q q q : 384
7680
384〜511
256 256 256
AES-256
p p p : 15360, q q q : 512
15360
512 以上
楕円曲線の 列は 3.9 節から 説明できる。位数 n ≈ 2 256 n \approx 2^{256} n ≈ 2 256 の 群では、 ρ \rho ρ 法の 段数は 約 π n / 4 ≈ 2 127.8 \sqrt{\pi n/4} \approx 2^{127.8} π n /4 ≈ 2 127.8 (π n / 2 \sqrt{\pi n/2} π n /2 から、楕円曲線では P P P と − P -P − P を 同一視して 2 \sqrt{2} 2 倍速く できる)で、安全性ビット数は n n n の ビット数の 半分に なる。有限体と RSA の 列は 数体ふる い法の 計算量に 基づく。たとえば NIST SP 800-56B Rev. 2(2019 年)は、RSA の 法の ビット長 k k k に 対する 安全性ビット数の 目安と して、 L N [ 1 / 3 , 1.923 ] L_N[1/3, 1.923] L N [ 1/3 , 1.923 ] の o ( 1 ) o(1) o ( 1 ) を 0 0 0 と おいた 指数から 定数を 引いた
E ( k ) = 1.923 k log 2 3 ( log ( k log 2 ) ) 2 / 3 − 4.69 log 2 E(k) = \frac{1.923\sqrt[3]{k\log 2}\,\bigl(\log(k\log 2)\bigr)^{2/3} - 4.69}{\log 2} E ( k ) = log 2 1.923 3 k log 2 ( log ( k log 2 ) ) 2/3 − 4.69
を 8 の 倍数に 丸めた 値を 与えている。
法の ビット数 k k k
1024
2048
3072
4096
8192
E ( k ) E(k) E ( k )
80.0
110.1
132.0
149.7
201.7
8 の 倍数に 丸めた 値
80
112
128
152
200
WARNING で 注意したように、 o ( 1 ) o(1) o ( 1 ) を 無視した 式は 計算時間 その ものではなく、目安を 与える ための 式である。安全性ビット数を 128 から 256 に 2 倍に する とき、楕円曲線の 鍵は 2 倍ですむのに、RSA の 法は 5 倍にしなければならない。
また SP 800-57 Part 1 Rev. 5 は(その 表 4 で)、112 ビットの 安全性に よる 新たな 暗号化・署名は 2030 年まで 認め、2031 年以降は 128 ビット以上を 求めると している。これらの 推奨は 改訂されうる もので、使う ときは 最新の 版を 確認する 必要が ある。また、表の 見積もりは すべて 古典的な 計算機に ついての ものであり、大規模な 量子計算機が 実現すれば、この 表の 公開鍵暗号は すべて 破られる( 第7章 )。
ヒント
実務では
新しく 鍵を 作るなら、128 ビット以上の 安全性(RSA なら 3072 ビット以上、楕円曲線なら P-256 や X25519 以上)を 選ぶのが 目安である。RSA 2048 ビットは 112 ビットの 安全性で、上の 文書では 2030 年までの 扱いに なっている。長期間 秘密に したい データは、今の 通信を 記録しておいて 将来の 量子計算機で 解読する 攻撃に 備え、耐量子暗号への 移行を 計画する。素数や群の パラメータは 自作せず、ライブラリの 鍵生成と 標準化された 群(TLS の 有限体 DH なら RFC 7919 の 安全素数の 群など)を 使う。
まとめ
L N [ α , c ] = exp ( ( c + o ( 1 ) ) ( log N ) α ( log log N ) 1 − α ) L_N[\alpha, c] = \exp((c + o(1))(\log N)^{\alpha}(\log\log N)^{1-\alpha}) L N [ α , c ] = exp (( c + o ( 1 )) ( log N ) α ( log log N ) 1 − α ) で 計算量を 比べる。試し割りと ρ \rho ρ 法は 指数時間( α = 1 \alpha = 1 α = 1 )、二次ふる い法は L N [ 1 / 2 , 1 ] L_N[1/2, 1] L N [ 1/2 , 1 ] 、数体 ふる い法は L N [ 1 / 3 , 1.923 ] L_N[1/3, 1.923] L N [ 1/3 , 1.923 ] (ともに ヒューリスティック)。
フェルマー法は p , q p, q p , q が 近いと 速い。 q − p ≤ 2 2 N 1 / 4 q - p \leq 2\sqrt{2}N^{1/4} q − p ≤ 2 2 N 1/4 なら 最初の 1 回で 分解できる。
ρ \rho ρ 法は x i + 1 = x i 2 + c x_{i+1} = x_i^2 + c x i + 1 = x i 2 + c の 法 p p p での 周期を、フロイドの 方法と gcd \gcd g cd で 見つける。誕生日の 議論から 段数は 約 p \sqrt{p} p (ヒューリスティック)。
p − 1 p - 1 p − 1 法は、ある 素因数 p p p に ついて p − 1 p - 1 p − 1 が B B B -べき 滑らかなら gcd ( a M B − 1 , N ) \gcd(a^{M_B} - 1, N) g cd( a M B − 1 , N ) で p p p を 見つける。
二次ふる い法は、滑らかな t 2 − N t^2 - N t 2 − N を 集め、 F 2 \mathbb{F}_2 F 2 上の 一次 従属から X 2 ≡ Y 2 X^2 \equiv Y^2 X 2 ≡ Y 2 を 作り、 gcd ( X − Y , N ) \gcd(X - Y, N) g cd( X − Y , N ) で 分解する。
離散対数の 難しさは 群の 表し方で 決まる。汎用アルゴリズムには Ω ( q ) \Omega(\sqrt{q}) Ω ( q ) (q q q は 位数の 最大の 素因数)の 下界が ある。
ベビーステップ・ジャイアントステップ法は O ( n ) O(\sqrt{n}) O ( n ) の 時間と 記憶、 ρ \rho ρ 法は O ( n ) O(\sqrt{n}) O ( n ) の 時間(ヒューリスティック)と わずかな 記憶で 離散対数を 求める。ポーリッヒ–ヘルマン法に より、難しさは 位数の 最大の 素因数で 決まるので、素数位数の 部分群を 使う。
F p × \mathbb{F}_p^\times F p × には 指数計算法(準指数時間)が あるが、楕円曲線には 知られていない。その ため同じ 安全性に 必要な 鍵の 長さが 大きく 違う(128 ビットの 安全性なら RSA 3072 ビットに 対し楕円曲線 256 ビット)。
演習問題
問題 3.1 ★ N = 1022117 N = 1022117 N = 1022117 を フェルマー法で 素因数分解せよ。また、命題 3.3 の 条件 q − p ≤ 2 2 N 1 / 4 q - p \leq 2\sqrt{2}N^{1/4} q − p ≤ 2 2 N 1/4 が みたされている ことを 確かめよ。
解答
N = 1010.998 ⋯ \sqrt{N} = 1010.998\cdots N = 1010.998 ⋯ なので x = 1011 x = 1011 x = 1011 から 始める。 1011 2 − N = 1022121 − 1022117 = 4 = 2 2 1011^2 - N = 1022121 - 1022117 = 4 = 2^2 101 1 2 − N = 1022121 − 1022117 = 4 = 2 2 なので、N = ( 1011 − 2 ) ( 1011 + 2 ) = 1009 ⋅ 1013 N = (1011 - 2)(1011 + 2) = 1009 \cdot 1013 N = ( 1011 − 2 ) ( 1011 + 2 ) = 1009 ⋅ 1013 。1009 1009 1009 と 1013 1013 1013 は ともに 素数である( 1013 < 32 \sqrt{1013} < 32 1013 < 32 なので、31 31 31 以下の 素数で 割り切れない ことを 確かめればよい)。 q − p = 4 q - p = 4 q − p = 4 で、2 2 N 1 / 4 ≈ 89.9 2\sqrt{2}N^{1/4} \approx 89.9 2 2 N 1/4 ≈ 89.9 なので 条件は みたされている。
問題 3.2 ★ p = 101 p = 101 p = 101 , g = 2 g = 2 g = 2 と する。ベビーステップ・ジャイアントステップ法で log 2 43 \log_2 43 log 2 43 を 求めよ(ベビーステップの 表は 例 3.17 の ものを 使って よい)。
解答
γ = 2 − 10 ≡ 65 \gamma = 2^{-10} \equiv 65 γ = 2 − 10 ≡ 65 で、ジャイアントステップは 43 → 43 ⋅ 65 ≡ 68 → 68 ⋅ 65 ≡ 77 → 77 ⋅ 65 ≡ 56 → 56 ⋅ 65 ≡ 4 ( m o d 101 ) 43 \to 43 \cdot 65 \equiv 68 \to 68 \cdot 65 \equiv 77 \to 77 \cdot 65 \equiv 56 \to 56 \cdot 65 \equiv 4 \pmod{101} 43 → 43 ⋅ 65 ≡ 68 → 68 ⋅ 65 ≡ 77 → 77 ⋅ 65 ≡ 56 → 56 ⋅ 65 ≡ 4 ( mod 101 ) と 進む。 i = 4 i = 4 i = 4 で 4 = 2 2 4 = 2^2 4 = 2 2 が 表に あるので log 2 43 = 4 ⋅ 10 + 2 = 42 \log_2 43 = 4 \cdot 10 + 2 = 42 log 2 43 = 4 ⋅ 10 + 2 = 42 。検算:反復二乗法で 2 42 ≡ 43 ( m o d 101 ) 2^{42} \equiv 43 \pmod{101} 2 42 ≡ 43 ( mod 101 ) 。
問題 3.3 ★ ★ N = 10590721 = 2521 ⋅ 4201 N = 10590721 = 2521 \cdot 4201 N = 10590721 = 2521 ⋅ 4201 に a = 2 a = 2 a = 2 , B = 25 B = 25 B = 25 で p − 1 p - 1 p − 1 法を 適用すると gcd ( 2 M 25 − 1 , N ) = N \gcd(2^{M_{25}} - 1, N) = N g cd( 2 M 25 − 1 , N ) = N と なり失敗する。その 理由を 説明し、 B B B を 小さく すると 分解できる ことを 示せ。
解答
2520 = 2 3 ⋅ 3 2 ⋅ 5 ⋅ 7 2520 = 2^3 \cdot 3^2 \cdot 5 \cdot 7 2520 = 2 3 ⋅ 3 2 ⋅ 5 ⋅ 7 と 4200 = 2 3 ⋅ 3 ⋅ 5 2 ⋅ 7 4200 = 2^3 \cdot 3 \cdot 5^2 \cdot 7 4200 = 2 3 ⋅ 3 ⋅ 5 2 ⋅ 7 は ともに 25 25 25 -べき 滑らかなので M 25 M_{25} M 25 を 割り、定理 3.8 (1) に より 2521 2521 2521 と 4201 4201 4201 の 両方が gcd \gcd g cd を 割る。よって gcd = N \gcd = N g cd= N である。
B = 20 B = 20 B = 20 (または B = 10 B = 10 B = 10 )と すると、 2520 ∣ M 20 2520 \mid M_{20} 2520 ∣ M 20 なので 2521 ∣ gcd 2521 \mid \gcd 2521 ∣ g cd である。一方 ord 4201 ( 2 ) = 525 = 3 ⋅ 5 2 ⋅ 7 \operatorname{ord}_{4201}(2) = 525 = 3 \cdot 5^2 \cdot 7 ord 4201 ( 2 ) = 525 = 3 ⋅ 5 2 ⋅ 7 は、M 20 = 2 4 ⋅ 3 2 ⋅ 5 ⋅ 7 ⋅ 11 ⋅ 13 ⋅ 17 ⋅ 19 M_{20} = 2^4 \cdot 3^2 \cdot 5 \cdot 7 \cdot 11 \cdot 13 \cdot 17 \cdot 19 M 20 = 2 4 ⋅ 3 2 ⋅ 5 ⋅ 7 ⋅ 11 ⋅ 13 ⋅ 17 ⋅ 19 が 5 2 5^2 5 2 で 割り切れないので M 20 M_{20} M 20 を 割らない。定理 3.8 (2) より gcd ( 2 M 20 − 1 , N ) \gcd(2^{M_{20}} - 1, N) g cd( 2 M 20 − 1 , N ) は 非自明な 約数で、計算すると 2521 2521 2521 に なる。実装では、 M M M を 素数べきごとに 大きくしながら 途中で gcd \gcd g cd を とって、2 つの 素因数が 同時に 見つかる 危険を 減らす。
問題 3.4 ★ ★ p = 109 p = 109 p = 109 , g = 6 g = 6 g = 6 (原始根)と する。ポーリッヒ–ヘルマン法で log 6 88 \log_6 88 log 6 88 を 求めよ。
解答
n = 108 = 2 2 ⋅ 3 3 n = 108 = 2^2 \cdot 3^3 n = 108 = 2 2 ⋅ 3 3 。
位数 4 4 4 の 部分: g 1 = 6 27 ≡ 33 g_1 = 6^{27} \equiv 33 g 1 = 6 27 ≡ 33 , h 1 = 88 27 ≡ − 1 h_1 = 88^{27} \equiv -1 h 1 = 8 8 27 ≡ − 1 , δ = 6 54 ≡ − 1 \delta = 6^{54} \equiv -1 δ = 6 54 ≡ − 1 。η 0 = h 1 2 = 1 \eta_0 = h_1^2 = 1 η 0 = h 1 2 = 1 より y 0 = 0 y_0 = 0 y 0 = 0 、η 1 = h 1 = − 1 = δ \eta_1 = h_1 = -1 = \delta η 1 = h 1 = − 1 = δ より y 1 = 1 y_1 = 1 y 1 = 1 。よって x ≡ 2 ( m o d 4 ) x \equiv 2 \pmod{4} x ≡ 2 ( mod 4 ) 。
位数 27 27 27 の 部分: g 2 = 6 4 ≡ 97 g_2 = 6^4 \equiv 97 g 2 = 6 4 ≡ 97 , h 2 = 88 4 ≡ 25 h_2 = 88^4 \equiv 25 h 2 = 8 8 4 ≡ 25 , δ = 6 36 ≡ 63 \delta = 6^{36} \equiv 63 δ = 6 36 ≡ 63 (位数 3 3 3 、δ 2 ≡ 45 \delta^2 \equiv 45 δ 2 ≡ 45 )。η 0 = 25 9 ≡ 45 = δ 2 \eta_0 = 25^9 \equiv 45 = \delta^2 η 0 = 2 5 9 ≡ 45 = δ 2 より y 0 = 2 y_0 = 2 y 0 = 2 。η 1 = ( 25 ⋅ 97 − 2 ) 3 ≡ 1 \eta_1 = (25 \cdot 97^{-2})^3 \equiv 1 η 1 = ( 25 ⋅ 9 7 − 2 ) 3 ≡ 1 より y 1 = 0 y_1 = 0 y 1 = 0 。η 2 = 25 ⋅ 97 − 2 ≡ 63 = δ \eta_2 = 25 \cdot 97^{-2} \equiv 63 = \delta η 2 = 25 ⋅ 9 7 − 2 ≡ 63 = δ より y 2 = 1 y_2 = 1 y 2 = 1 。よって x ≡ 2 + 0 ⋅ 3 + 1 ⋅ 9 = 11 ( m o d 27 ) x \equiv 2 + 0 \cdot 3 + 1 \cdot 9 = 11 \pmod{27} x ≡ 2 + 0 ⋅ 3 + 1 ⋅ 9 = 11 ( mod 27 ) 。
中国剰余定理で x ≡ 2 ( m o d 4 ) x \equiv 2 \pmod 4 x ≡ 2 ( mod 4 ) , x ≡ 11 ( m o d 27 ) x \equiv 11 \pmod{27} x ≡ 11 ( mod 27 ) を 解くと x = 38 x = 38 x = 38 。検算:6 38 ≡ 88 ( m o d 109 ) 6^{38} \equiv 88 \pmod{109} 6 38 ≡ 88 ( mod 109 ) 。
問題 3.5 ★ ★ G = ⟨ g ⟩ G = \langle g \rangle G = ⟨ g ⟩ を 位数 n n n の 巡回群とし、 h = g x h = g^x h = g x の x x x が 0 ≤ x < K 0 \leq x < K 0 ≤ x < K (K ≤ n K \leq n K ≤ n )の 範囲に あることが わかっていると する。 O ( K + log n ) O(\sqrt{K} + \log n) O ( K + log n ) 回の 群演算で x x x を 求める 方法を 与えよ。また、 x x x が 40 ビットの 乱数なら、群が どれほど 大きくても 約 2 21 2^{21} 2 21 回の 群演算で 求まる ことを 確かめよ。
解答
定理 3.16 の m m m を m = ⌈ K ⌉ m = \lceil \sqrt{K} \rceil m = ⌈ K ⌉ に 取り替える。 0 ≤ j < m 0 \leq j < m 0 ≤ j < m の g j g^j g j を 表にし、 γ = g − m \gamma = g^{-m} γ = g − m と して i = 0 , 1 , … , m − 1 i = 0, 1, \dots, m - 1 i = 0 , 1 , … , m − 1 に ついて h γ i h\gamma^i h γ i を 表と 照合する。 x = i m + j x = im + j x = im + j (0 ≤ j < m 0 \leq j < m 0 ≤ j < m )と 割ると K ≤ m 2 K \leq m^2 K ≤ m 2 より i ≤ ( K − 1 ) / m < m i \leq (K - 1)/m < m i ≤ ( K − 1 ) / m < m なので、この ( i , j ) (i, j) ( i , j ) は 調べる 範囲に 入っていて、必ず 一致が 見つかる。見つかった ( i , j ) (i, j) ( i , j ) は h = g i m + j h = g^{im + j} h = g im + j を みたすので、 i m + j ≡ x ( m o d n ) im + j \equiv x \pmod{n} im + j ≡ x ( mod n ) である。群演算は ベビーステップと ジャイアントステップに 合わせて 2 m 2m 2 m 回以下、γ = g n − m \gamma = g^{n - m} γ = g n − m の 計算に O ( log n ) O(\log n) O ( log n ) 回である。K = 2 40 K = 2^{40} K = 2 40 なら m = 2 20 m = 2^{20} m = 2 20 で、全体は 約 2 ⋅ 2 20 = 2 21 2 \cdot 2^{20} = 2^{21} 2 ⋅ 2 20 = 2 21 回(記憶する 元は 2 20 2^{20} 2 20 個)である。秘密の 指数を「大きな 群の 元だから 安全」と 考えて 短い 乱数から 作ると、群の 大きさではなく、乱数が とりうる 値の 個数の 平方根の 手間(ビット数で いえば 乱数の 半分)で 破られる( 第4章 の 署名の ナンスで 重要に なる)。
問題 3.6 ★ ★ (この 実装の どこが 危ないか)ある サーバーは p = 211 p = 211 p = 211 と 原始根 g = 2 g = 2 g = 2 を 使い、固定の 秘密 x x x (1 ≤ x < 210 1 \leq x < 210 1 ≤ x < 210 )で、受け取った A A A に 対して K = A x m o d p K = A^x \bmod p K = A x mod p を 計算し、 K K K から 作った 鍵で 応答を 暗号化して返す。受け取った A A A は 検査しない。攻撃者は A A A と して 210 , 196 , 107 , 171 210, 196, 107, 171 210 , 196 , 107 , 171 を 送り、応答の 暗号を 候補の 鍵で 試す ことで、それぞれ K = 210 , 1 , 188 , 148 K = 210, 1, 188, 148 K = 210 , 1 , 188 , 148 である ことを 知った。 x x x を 求めよ。また、どう 防げば よいか。
解答
p − 1 = 210 = 2 ⋅ 3 ⋅ 5 ⋅ 7 p - 1 = 210 = 2 \cdot 3 \cdot 5 \cdot 7 p − 1 = 210 = 2 ⋅ 3 ⋅ 5 ⋅ 7 である。送られた A A A は それぞれ 2 105 , 2 70 , 2 42 , 2 30 2^{105}, 2^{70}, 2^{42}, 2^{30} 2 105 , 2 70 , 2 42 , 2 30 で、位数は 2 , 3 , 5 , 7 2, 3, 5, 7 2 , 3 , 5 , 7 である。各 A A A の 冪を 並べると
A = 210 = − 1 A = 210 = -1 A = 210 = − 1 :冪は 1 , 210 1, 210 1 , 210 。K = 210 K = 210 K = 210 より x ≡ 1 ( m o d 2 ) x \equiv 1 \pmod 2 x ≡ 1 ( mod 2 ) 。
A = 196 A = 196 A = 196 :冪は 1 , 196 , 14 1, 196, 14 1 , 196 , 14 。K = 1 K = 1 K = 1 より x ≡ 0 ( m o d 3 ) x \equiv 0 \pmod 3 x ≡ 0 ( mod 3 ) 。
A = 107 A = 107 A = 107 :冪は 1 , 107 , 55 , 188 , 71 1, 107, 55, 188, 71 1 , 107 , 55 , 188 , 71 。K = 188 K = 188 K = 188 より x ≡ 3 ( m o d 5 ) x \equiv 3 \pmod 5 x ≡ 3 ( mod 5 ) 。
A = 171 A = 171 A = 171 :冪は 1 , 171 , 123 , 144 , 148 , 199 , 58 1, 171, 123, 144, 148, 199, 58 1 , 171 , 123 , 144 , 148 , 199 , 58 。K = 148 K = 148 K = 148 より x ≡ 4 ( m o d 7 ) x \equiv 4 \pmod 7 x ≡ 4 ( mod 7 ) 。
中国剰余定理で x ≡ 123 ( m o d 210 ) x \equiv 123 \pmod{210} x ≡ 123 ( mod 210 ) 、すな わち x = 123 x = 123 x = 123 である。位数 r r r の 元を 送る たびに、攻撃者は r r r 通りの 候補を 試すだけで x m o d r x \bmod r x mod r を 知る( 小部分群攻撃 , small subgroup attack)。
防ぎ方:位数が 大きな 素数 q q q の 部分群を 使い(安全素数 p = 2 q + 1 p = 2q + 1 p = 2 q + 1 など)、受け取った A A A に ついて 1 < A < p − 1 1 < A < p - 1 1 < A < p − 1 かつ A q ≡ 1 ( m o d p ) A^q \equiv 1 \pmod{p} A q ≡ 1 ( mod p ) を 確かめてから 使う。標準化された 群(RFC 7919 など)と ライブラリの 検査を 使うのが よい。楕円曲線での 同じ 種類の 攻撃は 第4章で 扱う。
問題 3.7 ★ ★ ★ N = p q N = pq N = pq (p ≠ q p \neq q p = q は 奇素数)と する。法 N N N の 平方剰余 c c c (gcd ( c , N ) = 1 \gcd(c, N) = 1 g cd( c , N ) = 1 )を 入力すると その 平方根 y y y (y 2 ≡ c y^2 \equiv c y 2 ≡ c )を 一つ 出力する アルゴリズム A \mathcal{A} A が あると する。 A \mathcal{A} A を 平均 2 回程度 呼び出して N N N を 素因数分解する 方法を 与えよ(法 N N N の 平方根を 求める ことは 素因数分解と 同じ くらい 難しい)。
解答
x ∈ { 1 , … , N − 1 } x \in \lbrace 1, \dots, N - 1 \rbrace x ∈ { 1 , … , N − 1 } を 一様ランダムに 選ぶ。 gcd ( x , N ) > 1 \gcd(x, N) > 1 g cd( x , N ) > 1 なら それで 分解できる。そうでなければ c = x 2 m o d N c = x^2 \bmod N c = x 2 mod N を A \mathcal{A} A に 与えて y y y を 得る。
中国剰余定理に より、 c c c の 法 N N N の 平方根は、法 p p p の 平方根 ± x \pm x ± x と 法 q q q の 平方根 ± x \pm x ± x の 組み合わせで ちょうど 4 個ある : x , − x , x ′ , − x ′ x, -x, x', -x' x , − x , x ′ , − x ′ (x ′ ≡ x ( m o d p ) x' \equiv x \pmod p x ′ ≡ x ( mod p ) , x ′ ≡ − x ( m o d q ) x' \equiv -x \pmod q x ′ ≡ − x ( mod q ) )。( Z / N Z ) × (\mathbb{Z}/N\mathbb{Z})^\times ( Z / N Z ) × 上で x ↦ x 2 x \mapsto x^2 x ↦ x 2 は 4 対 1 の 写像なので、 c c c を 固定した ときの 条件付き分布で x x x は この 4 個の 上に 一様に 分布する。一方 A \mathcal{A} A の 出力 y y y は c c c だけから(x x x とは 独立な 内部の 乱数を 使っても)決まる。したがって y ≢ ± x y \not\equiv \pm x y ≡ ± x と なる 確率は ちょうど 1 / 2 1/2 1/2 であり、その とき命題 3.10 より gcd ( x − y , N ) \gcd(x - y, N) g cd( x − y , N ) は p p p または q q q である。失敗したら x x x を 選び直す。各回の 成功確率は 1 / 2 1/2 1/2 以上なので、試行回数の 平均は 2 回以下である。