Lemma

第3章素因数分解と離散対数

目安 9〜12 時間定理など 10演習 7 問
ここまでの道

この章の目標

  • 素因数分解と離散対数のアルゴリズムの速さを LL 記法で比べ、指数時間と準指数時間の違いを説明できる
  • フェルマー法・ポラードの ρ\rho 法・p−1p - 1 法が成功する条件を証明し、RSA の素数に課される条件の理由を説明できる
  • 二次ふるい法の仕組み(平方の合同、滑らかな数、F2\mathbb{F}_2 上の線形代数)を小さい数で実行できる
  • ベビーステップ・ジャイアントステップ法とポーリッヒ–ヘルマン法を証明し、離散対数の難しさが群の位数の最大の素因数で決まることを説明できる
  • 推奨される鍵長(NIST SP 800-57 など)が、どのアルゴリズムの計算量から来ているかを説明できる

前提:第1章、第2章、04-algebra 第1章、04-algebra 第2章。3.5 節では F2\mathbb{F}_2 上のベクトルの一次従属(02-linear-algebra 第2章)を使う。

RSA 暗号(第2章)の公開鍵 (n,e)(n, e) から秘密鍵を求める最も直接的な方法は、nn を素因数分解することである。ディフィー–ヘルマン鍵共有や DSA では、公開鍵 y=gxy = g^x から秘密の xx を求めることが離散対数問題そのものである。試し割り(第1章)よりずっと速い攻撃法があり、その速さが鍵の長さを決める。

この章の目的は二つある。一つは推奨される鍵長の根拠を理解することである。RSA の法には 2048 ビット以上が必要なのに楕円曲線の鍵は 256 ビットで足りるのは、使える攻撃法の計算量が違うからである。もう一つは特別な構造をもつ鍵の危険を理解することである。pp と qq が近い、p−1p - 1 が小さい素数の積である、群の位数が小さい素数の積である――こうした鍵では、難しい問題が易しい問題に変わる。

なお、これらの問題が難しいことは証明されていない。わかっているのは、知られている最良のアルゴリズムの計算量だけである。鍵長の推奨はそれに基づく見積もりで、改訂されうる。量子計算機が実用になれば、どちらの問題も多項式時間で解ける(第7章)。

3.1 計算量の物差し:LL 記法

NN のビット長を ℓ(N)≈log⁡2N\ell(N) \approx \log_2 N とする(第1章)。試し割りは約 N=2ℓ(N)/2\sqrt{N} = 2^{\ell(N)/2} 回の割り算を要する指数時間、反復二乗法は ℓ(N)\ell(N) の多項式時間であった。素因数分解の現代的なアルゴリズムはその中間にあり、次の記法で比べる。

定義 3.1(LL 記法, LL-notation)0≤α≤10 \leq \alpha \leq 1, c>0c > 0 に対し

LN[α,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)

とおく。ここで log⁡\log は自然対数、o(1)o(1) は N→∞N \to \infty のとき 00 に近づく量である。

α=0\alpha = 0 なら LN[0,c]=(log⁡N)c+o(1)L_N[0, c] = (\log N)^{c + o(1)} でビット長の多項式、α=1\alpha = 1 なら LN[1,c]=Nc+o(1)L_N[1, c] = N^{c + o(1)} でビット長の指数関数である。0<α<10 < \alpha < 1 の場合を準指数時間 (subexponential time) という。NN が RSA の法のように同じくらいの大きさの 2 つの素数の積のとき、この章の方法は次のように並ぶ(ρ\rho 法から下は、証明されていない仮定を含むヒューリスティックな見積もり)。

方法 計算量 節
試し割り LN[1,1/2]L_N[1, 1/2] 第1章
ポラードの ρ\rho 法 LN[1,1/4]L_N[1, 1/4] 3.3
二次ふるい法 LN[1/2,1]L_N[1/2, 1] 3.5
数体ふるい法 LN[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 3.5

試し割りも、小さい素因数を取り除く最初の段階としては今も使われる。

注意

o(1)o(1) は定数ではないので、LN[α,c]L_N[\alpha, c] に具体的な NN を代入しても計算時間は出ない。LL 記法から読み取れるのは、NN が大きくなるときの増え方の比較である。

3.2 フェルマー法

奇数 NN が N=x2−y2=(x−y)(x+y)N = x^2 - y^2 = (x - y)(x + y) と書ければ、NN の分解が得られる。逆に N=abN = ab(1≤a≤b1 \leq a \leq b、ともに奇数)なら、x=(a+b)/2x = (a + b)/2, y=(b−a)/2y = (b - a)/2 とおけば N=x2−y2N = x^2 - y^2 である。そこで x=⌈N⌉,⌈N⌉+1,…x = \lceil \sqrt{N} \rceil, \lceil \sqrt{N} \rceil + 1, \dots の順に x2−Nx^2 - N が平方数かどうかを調べる。これをフェルマー法 (Fermat's factorization method) という。aa と bb が近いほど (a+b)/2(a + b)/2 は N\sqrt{N} に近く、早く見つかる。

例 3.2 N=58447N = 58447 とする。N=241.7⋯\sqrt{N} = 241.7\cdots なので x=242x = 242 から始める。

xx x2−Nx^2 - N 平方数か
242242 117117 いいえ
243243 602602 いいえ
244244 1089=3321089 = 33^2 はい

よって N=(244−33)(244+33)=211⋅277N = (244 - 33)(244 + 33) = 211 \cdot 277 である。

命題 3.3(近い素数の積)N=pqN = pq(p<qp < q は奇素数)とする。フェルマー法が調べる xx の個数は (q−p)2/(8N)+1(q - p)^2/(8\sqrt{N}) + 1 未満である。特に q−p≤22N1/4q - p \leq 2\sqrt{2}N^{1/4} ならば、最初の x=⌈N⌉x = \lceil \sqrt{N} \rceil で成功する。

証明. x≥⌈N⌉x \geq \lceil \sqrt{N} \rceil で x2−N=y2x^2 - N = y^2 ならば、N=(x−y)(x+y)N = (x - y)(x + y) は NN の分解なので (x−y,x+y)=(1,N)(x - y, x + y) = (1, N) または (p,q)(p, q) であり、x=(N+1)/2x = (N + 1)/2 または x0:=(p+q)/2x_0 := (p + q)/2 である。x0<(N+1)/2x_0 < (N + 1)/2 なので、フェルマー法は x0x_0 で止まり、調べる個数は x0−⌈N⌉+1≤x0−N+1x_0 - \lceil \sqrt{N} \rceil + 1 \leq x_0 - \sqrt{N} + 1 である。ここで

x0−N=(q−p)22=(q−p)22(q+p)2,(q+p)2=p+q+2N>4Nx_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}

(最後は相加相乗平均の不等式で、p≠qp \neq q より等号は成り立たない)なので、x0−N<(q−p)2/(8N)x_0 - \sqrt{N} < (q - p)^2/(8\sqrt{N})。q−p≤22N1/4q - p \leq 2\sqrt{2}N^{1/4} ならこれは 11 以下で、調べる個数は 22 未満、すなわち 11 である。□\square

逆に、p,q<2k/2p, q < 2^{k/2}(kk は NN のビット長)なら (q+p)2<2k/2+2(\sqrt{q} + \sqrt{p})^2 < 2^{k/2 + 2} なので、調べる個数は x0−N>(q−p)2/2k/2+3x_0 - \sqrt{N} > (q - p)^2/2^{k/2 + 3} より多い。RSA の鍵生成の規格 FIPS 186-5 は ∣p−q∣>2k/2−100\lvert p - q \rvert > 2^{k/2 - 100} を要求しており、このとき個数は 2k/2−2032^{k/2 - 203} を超える(k=2048k = 2048 なら 28212^{821})。一方、「pp の次の素数を qq にする」ような生成法は命題 3.3 で直ちに破られる。

3.3 ポラードの ρ\rho 法

NN の未知の素因数を pp とする。f(x)=x2+cf(x) = x^2 + c(c≠0,−2c \neq 0, -2)と初期値 x0x_0 をとり、xi+1=f(xi) mod Nx_{i+1} = f(x_i) \bmod N で数列を作る。xi mod px_i \bmod p は同じ漸化式 xi+1≡f(xi)(modp)x_{i+1} \equiv f(x_i) \pmod{p} に従い、Z/pZ\mathbb{Z}/p\mathbb{Z} は有限集合なので、いずれ xi≡xj(modp)x_i \equiv x_j \pmod{p}(i<ji < j)となる。そのとき p∣gcd⁡(xj−xi,N)p \mid \gcd(x_j - x_i, N) で、pp が未知でも gcd⁡\gcd は計算できる。すべての組 (i,j)(i, j) を試す必要はなく、次の補題により (i,2i)(i, 2i) の組だけを調べればよい。

補題 3.4(フロイドの循環検出, Floyd's cycle detection)SS を有限集合、F ⁣:S→SF\colon S \to S を写像、x0∈Sx_0 \in S, xi+1=F(xi)x_{i+1} = F(x_i) とする。xT∈{x0,…,xT−1}x_T \in \lbrace x_0, \dots, x_{T-1} \rbrace となる最小の T≥1T \geq 1 をとり、xT=xμx_T = x_\mu(0≤μ<T0 \leq \mu < T)、λ=T−μ\lambda = T - \mu とおく。

  1. i<ji < j について、xi=xjx_i = x_j であるための必要十分条件は i≥μi \geq \mu かつ λ∣j−i\lambda \mid j - i である。
  2. xi=x2ix_i = x_{2i} となる i≥1i \geq 1 が存在し、その最小値は T=μ+λT = \mu + \lambda 以下である。

証明. TT は鳩の巣原理により ∣S∣\lvert S \rvert 以下で存在し、TT の最小性から x0,…,xT−1x_0, \dots, x_{T-1} は相異なる。xμ+λ=xμx_{\mu + \lambda} = x_\mu に FF を繰り返し施せば xk+λ=xkx_{k + \lambda} = x_k(k≥μk \geq \mu)なので、k≥μk \geq \mu なら xk=xk′x_k = x_{k'}(μ≤k′<T\mu \leq k' < T, k′≡k(modλ)k' \equiv k \pmod{\lambda})である。k<μk < \mu なら k′=kk' = k とおく。(1) i≥μi \geq \mu, λ∣j−i\lambda \mid j - i なら xj=xix_j = x_i である。逆に xi=xjx_i = x_j なら xi′=xj′x_{i'} = x_{j'} で、x0,…,xT−1x_0, \dots, x_{T-1} は相異なるから i′=j′i' = j'。i<μi < \mu なら i′=ii' = i は j′j'(j≥μj \geq \mu なら j′≥μj' \geq \mu、j<μj < \mu なら j′=j>ij' = j > i)と異なり矛盾するので i≥μi \geq \mu であり、i≡i′=j′≡j(modλ)i \equiv i' = j' \equiv j \pmod{\lambda}。(2) max⁡(μ,1)\max(\mu, 1) 以上の最小の λ\lambda の倍数を ii とすると、i≥μi \geq \mu, λ∣2i−i\lambda \mid 2i - i なので (1) より xi=x2ix_i = x_{2i}。μ≥1\mu \geq 1 なら i≤μ+λ−1i \leq \mu + \lambda - 1、μ=0\mu = 0 なら i=λi = \lambda である。□\square

点列の添字を並べると、長さ μ\mu の「尾」の先に長さ λ\lambda の輪がつながった、文字 ρ\rho の形になる。これが名前の由来である。

ポラードの ρ\rho 法 (Pollard's rho method) では、(xi,x2i) mod N(x_i, x_{2i}) \bmod N を i=1,2,…i = 1, 2, \dots と同時に更新し、d=gcd⁡(x2i−xi,N)d = \gcd(x_{2i} - x_i, N) を計算する。1<d<N1 < d < N なら dd が非自明な約数である。補題 3.4 を S=Z/pZS = \mathbb{Z}/p\mathbb{Z} に適用すると、pp についての TT 以下の段で必ず p∣dp \mid d となる。d=Nd = N となるのは他の素因数でも同時に一致が起きたときで、そのときは cc を変えてやり直す。

例 3.5 N=18841N = 18841, f(x)=x2+1f(x) = x^2 + 1, x0=2x_0 = 2 とする。

ii xi mod Nx_i \bmod N x2i mod Nx_{2i} \bmod N xi mod 83x_i \bmod 83 x2i mod 83x_{2i} \bmod 83 gcd⁡(x2i−xi,N)\gcd(x_{2i} - x_i, N)
11 55 2626 55 2626 11
22 2626 61466146 2626 44 11
33 677677 1282312823 1313 4141 11
44 61466146 1567415674 44 7070 11
55 1595315953 55785578 1717 1717 8383

N=83⋅227N = 83 \cdot 227 である。計算する人には見えない  mod 83\bmod 83 の列は 2,5,26,132, 5, 26, 13 の尾(μ=4\mu = 4)の先で 4→17→41→22→70→44 \to 17 \to 41 \to 22 \to 70 \to 4 と回る(λ=5\lambda = 5)ので、補題 3.4 のとおり i=5i = 5 で一致する。

手間の見積もりには、次の誕生日の議論を使う。

補題 3.6(誕生日の議論, birthday paradox)SS を mm 元集合とし、SS から SS への写像 mmm^m 個の中から FF を一様ランダムに選ぶ。x0∈Sx_0 \in S を固定し、補題 3.4 の TT を考えると、k≥0k \geq 0 について

P(T>k)=∏i=1k(1−im)≤e−k2/(2m),E[T]≤1+πm2P(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}}

が成り立つ。

証明. T>kT > k は x0,…,xkx_0, \dots, x_k が相異なることと同値である。x0,…,xi−1x_0, \dots, x_{i-1} が相異なるという条件のもとで、xi−1x_{i-1} は x0,…,xi−2x_0, \dots, x_{i-2} のどれとも異なるので、F(xi−1)F(x_{i-1}) の値はまだ使われておらず SS 上一様に分布する。よって xi=F(xi−1)x_i = F(x_{i-1}) が x0,…,xi−1x_0, \dots, x_{i-1} と異なる条件付き確率は 1−i/m1 - i/m で、これを掛けて等式を得る。k≥mk \geq m なら積は 00 である。k<mk < m なら各因子は正なので、1−t≤e−t1 - t \leq e^{-t} より積は exp⁡(−k(k+1)/(2m))≤e−k2/(2m)\exp(-k(k + 1)/(2m)) \leq e^{-k^2/(2m)} 以下である。TT は正の整数値をとるので、e−t2/(2m)e^{-t^2/(2m)} が減少関数であることを使って

E[T]=∑k=0∞P(T>k)≤1+∑k=1∞e−k2/(2m)≤1+∫0∞e−t2/(2m) dt=1+πm2E[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}}

である。□\square

x2+cx^2 + c はランダムな写像ではない(xx と −x-x が同じ値に写る)が、経験的にはほぼ同じようにふるまう。これを仮定すると、ρ\rho 法はおよそ p\sqrt{p} 段(各段は法 NN の乗算 3 回と gcd⁡\gcd 1 回)で素因数 pp を見つける。この見積もりはヒューリスティックで、証明されていない。次のコードで、pp の大きさと段数の関係を確かめる。

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.4p0.4\sqrt{p} から 1.6p1.6\sqrt{p} 程度)が、どれも p\sqrt{p} と同じ桁にあり、pp が 10610^6 倍になっても段数は数千倍にしかならない。小さい素因数を見つけるには向いているが、RSA の法では p≈21024p \approx 2^{1024} なので約 25122^{512} 段かかる。

3.4 ポラードの p−1p - 1 法

定義 3.7(滑らかな数)B≥2B \geq 2 とする。正の整数 mm の素因数がすべて BB 以下のとき、mm は BB-滑らか (BB-smooth) であるという。さらに、qe∣mq^e \mid m, qe+1∤mq^{e+1} \nmid m となる素数べき qeq^e がすべて BB 以下のとき、mm は BB-べき滑らか (BB-powersmooth) であるという。

MB=lcm⁡(1,2,…,B)=∏q≤Bq⌊log⁡qB⌋M_B = \operatorname{lcm}(1, 2, \dots, B) = \prod_{q \leq B} q^{\lfloor \log_q B \rfloor}(積は BB 以下の素数 qq にわたる)とおくと、m∣MBm \mid M_B と mm が BB-べき滑らかであることは同値である。

定理 3.8(p−1p - 1 法, Pollard's p−1p - 1 method)N≥2N \geq 2 を整数、pp を NN の素因数、aa を p∤ap \nmid a となる整数、MM を p−1p - 1 の倍数とする。

  1. p∣gcd⁡(aM−1,N)p \mid \gcd(a^M - 1, N) である。
  2. さらに、NN の素因数 qq で q∤aq \nmid a かつ ord⁡q(a)∤M\operatorname{ord}_q(a) \nmid M となるものがあれば、gcd⁡(aM−1,N)\gcd(a^M - 1, N) は NN の非自明な約数である。

証明. (1) フェルマーの小定理(04-algebra 第1章 系 1.35)より ap−1≡1(modp)a^{p-1} \equiv 1 \pmod{p} で、M=(p−1)tM = (p - 1)t と書けば aM=(ap−1)t≡1(modp)a^M = (a^{p-1})^t \equiv 1 \pmod{p}。(2) 位数の性質(同 命題 1.40 (1))より aM≢1(modq)a^M \not\equiv 1 \pmod{q} なので、q∤gcd⁡(aM−1,N)q \nmid \gcd(a^M - 1, N) である。よってこの gcd⁡\gcd は NN ではなく、(1) より pp 以上である。□\square

p−1p - 1 法では、BB を決めて M=MBM = M_B とし、a=2a = 2 について aM mod Na^{M} \bmod N を素数べき q⌊log⁡qB⌋q^{\lfloor \log_q B \rfloor} ごとの冪剰余で計算し、gcd⁡(aM−1,N)\gcd(a^M - 1, N) を求める。MB≤Bπ(B)M_B \leq B^{\pi(B)}(π(B)\pi(B) は BB 以下の素数の個数)なので、乗算は O(π(B)log⁡B)O(\pi(B)\log B) 回である。定理 3.8 により、 NN のある素因数 pp について p−1p - 1 が BB-べき滑らかであれば pp が gcd⁡\gcd を割り、さらに他のある素因数 p′p' について ord⁡p′(a)∤MB\operatorname{ord}_{p'}(a) \nmid M_B、すなわち ord⁡p′(a)\operatorname{ord}_{p'}(a) が BB-べき滑らかでなければ、分解に成功する(p′−1p' - 1 が BB-べき滑らかでないだけでは足りない)。

例 3.9 N=16833407=4201⋅4007N = 16833407 = 4201 \cdot 4007 とする。4200=23⋅3⋅52⋅74200 = 2^3 \cdot 3 \cdot 5^2 \cdot 7 は 2525-べき滑らかだが、4006=2⋅20034006 = 2 \cdot 2003 は大きい素因数をもつ。a=2a = 2 とすると、M20=232792560M_{20} = 232792560 は 525^2 で割り切れないので ord⁡4201(2)=525=3⋅52⋅7\operatorname{ord}_{4201}(2) = 525 = 3 \cdot 5^2 \cdot 7 で割り切れず、ord⁡4007(2)=2003\operatorname{ord}_{4007}(2) = 2003 でも割り切れない。よって gcd⁡(2M20−1,N)=1\gcd(2^{M_{20}} - 1, N) = 1 で失敗する。M25=26771144400M_{25} = 26771144400 では 2M25≡11279686(modN)2^{M_{25}} \equiv 11279686 \pmod{N}, gcd⁡(11279686−1,N)=4201\gcd(11279686 - 1, N) = 4201 で分解できる(B<2003B < 2003 なら 2003∤MB2003 \nmid M_B なので、q=4007q = 4007 について定理 3.8 (2) の条件がみたされる)。

ランダムに選んだ大きな素数 pp では、p−1p - 1 が計算できる程度の BB でべき滑らかになることはまずない(2020 年に分解された RSA-250 の 2 つの素因数 p,qp, q でも、p−1p - 1 は 77 桁、q−1q - 1 は 83 桁の素因数をもつ)。p−1p - 1 法は群 (Z/pZ)×(\mathbb{Z}/p\mathbb{Z})^\times の位数 p−1p - 1 が滑らかなときに働く。この群を、曲線ごとに位数が変わる楕円曲線の群 E(Fp)E(\mathbb{F}_p) に取り替えたのが、レンストラの楕円曲線法である(21 第5章 5.7 節)。

3.5 二次ふるい法の考え方

現在の主な素因数分解法は、次の簡単な事実に基づいている。

命題 3.10(平方の合同)x2≡y2(modN)x^2 \equiv y^2 \pmod{N} かつ x≢±y(modN)x \not\equiv \pm y \pmod{N} ならば、gcd⁡(x−y,N)\gcd(x - y, N) は NN の非自明な約数である。

証明. N∣(x−y)(x+y)N \mid (x - y)(x + y) である。gcd⁡(x−y,N)=N\gcd(x - y, N) = N なら x≡yx \equiv y となって仮定に反する。gcd⁡(x−y,N)=1\gcd(x - y, N) = 1 なら、04-algebra 第1章 命題 1.9 より N∣x+yN \mid x + y となり、やはり仮定に反する。□\square

奇数 NN が相異なる素因数を k≥2k \geq 2 個もてば、中国剰余定理により y2y^2(gcd⁡(y,N)=1\gcd(y, N) = 1)の法 NN の平方根は 2k2^k 個あり、±y\pm y はそのうち 2 個だけである。したがって xx が平方根の中から「でたらめに」選ばれていれば、1/21/2 以上の確率で成功する。問題は、そのような x,yx, y の作り方である。

m=⌈N⌉m = \lceil \sqrt{N} \rceil とし、Q(t)=t2−NQ(t) = t^2 - N を t=m,m+1,…t = m, m + 1, \dots について考える。t2≡Q(t)(modN)t^2 \equiv Q(t) \pmod{N} であり、tt が N\sqrt{N} に近ければ Q(t)≈2(t−N)NQ(t) \approx 2(t - \sqrt{N})\sqrt{N} は NN よりずっと小さい。素数 p∤Np \nmid N が Q(t)Q(t) を割れば N≡t2(modp)N \equiv t^2 \pmod{p} なので、p=2p = 2 を除いて (Np)=1\left(\frac{N}{p}\right) = 1 である。そこで BB 以下の素数のうち p=2p = 2 と (Np)=1\left(\frac{N}{p}\right) = 1 をみたすものを集めて因子基底 (factor base) F={p1,…,pk}\mathcal{F} = \lbrace p_1, \dots, p_k \rbrace とし、Q(t)Q(t) が F\mathcal{F} の素数だけの積になる tt(関係式, relation)を集める。

命題 3.11(関係式から平方の合同へ)t1,…,trt_1, \dots, t_r が Q(ti)=∏j=1kpjeijQ(t_i) = \prod_{j=1}^{k} p_j^{e_{ij}} をみたすとする。r>kr > k ならば、空でない部分集合 S⊂{1,…,r}S \subset \lbrace 1, \dots, r \rbrace で、すべての jj について ∑i∈Seij\sum_{i \in S} e_{ij} が偶数になるものが存在する。このとき

X=∏i∈Sti,Y=∏j=1kpj12∑i∈SeijX = \prod_{i \in S} t_i, \qquad Y = \prod_{j=1}^{k} p_j^{\frac{1}{2}\sum_{i \in S} e_{ij}}

は X2≡Y2(modN)X^2 \equiv Y^2 \pmod{N} をみたす。

証明. vi=(ei1 mod 2,…,eik mod 2)∈F2kv_i = (e_{i1} \bmod 2, \dots, e_{ik} \bmod 2) \in \mathbb{F}_2^k とおく。r>kr > k なので v1,…,vrv_1, \dots, v_r は一次従属であり(02-linear-algebra 第2章 命題 2.22)、すべては 00 でない ci∈F2={0,1}c_i \in \mathbb{F}_2 = \lbrace 0, 1 \rbrace で ∑civi=0\sum c_iv_i = 0 となる。S={i∣ci=1}S = \lbrace i \mid c_i = 1 \rbrace とすればよい。このとき X2=∏i∈Sti2≡∏i∈SQ(ti)=Y2(modN)X^2 = \prod_{i \in S} t_i^2 \equiv \prod_{i \in S} Q(t_i) = Y^2 \pmod{N} である。□\square

X≡±YX \equiv \pm Y なら別の一次従属関係を試す。関係式はふるいで見つける。奇素数 p∈Fp \in \mathcal{F} について p∣Q(t)  ⟺  t≡±rp(modp)p \mid Q(t) \iff t \equiv \pm r_p \pmod{p}(rp2≡Nr_p^2 \equiv N)なので、pp で割り切れる tt は公差 pp の 2 つの等差数列をなす。エラトステネスのふるいと同じように、区間の中のこれらの tt に log⁡p\log p を足していけば、割り算をせずに、合計が log⁡Q(t)\log Q(t) に近い tt として滑らかな Q(t)Q(t) の候補が見つかる。これが二次ふるい法 (quadratic sieve) である。

例 3.12 N=22969N = 22969, B=13B = 13 とする。N mod 13=11N \bmod 13 = 11 は法 1313 の平方非剰余なので、因子基底は F={2,3,5,7,11}\mathcal{F} = \lbrace 2, 3, 5, 7, 11 \rbrace である。たとえば N≡4(mod5)N \equiv 4 \pmod{5} だから 5∣Q(t)  ⟺  t≡2,3(mod5)5 \mid Q(t) \iff t \equiv 2, 3 \pmod{5} で、t=152,153,157,158,…t = 152, 153, 157, 158, \dots がふるいで印をつけられる。m=152m = 152 から始めると

tt Q(t)Q(t) 素因数分解 指数  mod 2\bmod 2(2,3,5,7,112, 3, 5, 7, 11 の順)
152152 135135 33⋅53^3 \cdot 5 (0,1,1,0,0)(0, 1, 1, 0, 0)
153153 440440 23⋅5⋅112^3 \cdot 5 \cdot 11 (1,0,1,0,1)(1, 0, 1, 0, 1)
154154 747747 32⋅833^2 \cdot 83 (83∉F83 \notin \mathcal{F})
155155 10561056 25⋅3⋅112^5 \cdot 3 \cdot 11 (1,1,0,0,1)(1, 1, 0, 0, 1)

3 つのベクトルの和は 00 なので S={152,153,155}S = \lbrace 152, 153, 155 \rbrace ととると、135⋅440⋅1056=28⋅34⋅52⋅112135 \cdot 440 \cdot 1056 = 2^8 \cdot 3^4 \cdot 5^2 \cdot 11^2 より Y=24⋅32⋅5⋅11=7920Y = 2^4 \cdot 3^2 \cdot 5 \cdot 11 = 7920、X=152⋅153⋅155≡21516(modN)X = 152 \cdot 153 \cdot 155 \equiv 21516 \pmod{N} である。X≢±YX \not\equiv \pm Y で、gcd⁡(21516−7920,N)=gcd⁡(13596,22969)=103\gcd(21516 - 7920, N) = \gcd(13596, 22969) = 103。よって N=103⋅223N = 103 \cdot 223 である。

計算量の見積もり(概略) 鍵は滑らかな数の割合である。次の定理を使う。

定理 3.13(カンフィールド–エルデシュ–ポメランス, 1983 年)ε>0\varepsilon > 0 を固定する。u→∞u \to \infty のとき、u≤log⁡x/((1+ε)log⁡log⁡x)u \leq \log x/((1 + \varepsilon)\log\log x) の範囲で一様に、xx 以下の正の整数のうち x1/ux^{1/u}-滑らかなものの割合は u−u(1+o(1))u^{-u(1 + o(1))} である。

(主張のみ。解説は Crandall–Pomerance, Prime Numbers にある。)値 Q(t)Q(t) は N1/2+o(1)N^{1/2 + o(1)} 程度なので、これらがランダムな整数と同じ割合で滑らかになると仮定する。B=LN[1/2,b]B = L_N[1/2, b] とおくと u=log⁡N1/2/log⁡B≈12blog⁡N/log⁡log⁡Nu = \log N^{1/2}/\log B \approx \frac{1}{2b}\sqrt{\log N/\log\log N}, log⁡u≈12log⁡log⁡N\log u \approx \frac{1}{2}\log\log N なので、滑らかになる割合は u−u≈1/LN[1/2,1/(4b)]u^{-u} \approx 1/L_N[1/2, 1/(4b)] である。関係式は約 LN[1/2,b]L_N[1/2, b] 個(因子基底の大きさ程度)必要なので、調べる tt は約 LN[1/2,b+1/(4b)]L_N[1/2, b + 1/(4b)] 個で、ふるいなら 1 個あたりの手間は LN[1/2,o(1)]L_N[1/2, o(1)] である。一次従属の計算は、ほとんどの成分が 00 の約 B×BB \times B 行列について約 B2=LN[1/2,2b]B^2 = L_N[1/2, 2b] の手間である。max⁡(b+1/(4b),2b)\max(b + 1/(4b), 2b) は b=1/2b = 1/2 で最小値 11 をとるので、全体で LN[1/2,1]L_N[1/2, 1] となる。

数体ふるい法(紹介)f(m)≡0(modN)f(m) \equiv 0 \pmod{N} となる整数 mm と多項式 ff を選び、ff の根 α\alpha で生成される環 Z[α]\mathbb{Z}[\alpha] と Z\mathbb{Z} の両方で滑らかさを考え、環準同型 Z[α]→Z/NZ\mathbb{Z}[\alpha] \to \mathbb{Z}/N\mathbb{Z}, α↦m\alpha \mapsto m で両側の平方を法 NN の平方の合同に移す。滑らかであってほしい数が二次ふるい法よりずっと小さくなり、計算量は(ヒューリスティックに)LN[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)GG を位数 nn の巡回群、gg をその生成元とする。h∈Gh \in G に対し、gx=hg^x = h となる x∈Z/nZx \in \mathbb{Z}/n\mathbb{Z} を hh の(gg を底とする)離散対数といい、log⁡gh\log_g h と書く。g,hg, h から log⁡gh\log_g h を求める問題を離散対数問題(DLP)という。

x↦gxx \mapsto g^x は Z/nZ→G\mathbb{Z}/n\mathbb{Z} \to G の同型なので(04-algebra 第2章 定理 2.22)、log⁡gh\log_g h はただ一つ定まる。第2章では位数が素数の群で離散対数問題とディフィー–ヘルマン問題を考えたが、ここでは位数 nn を一般にする(3.8 節で nn の素因数分解が効いてくる)。

離散対数問題の難しさは、群の同型類ではなく群の元の表し方で決まる。加法群 Z/nZ\mathbb{Z}/n\mathbb{Z} の生成元 gg(gcd⁡(g,n)=1\gcd(g, n) = 1)では「gx=hg^x = h」は xg≡h(modn)xg \equiv h \pmod{n} のことで、拡張ユークリッドの互除法で一瞬で解ける。位数 nn の巡回群はすべて Z/nZ\mathbb{Z}/n\mathbb{Z} と同型だが、その同型写像の計算が離散対数問題そのものなのである。Fp×\mathbb{F}_p^\times には 3.10 節の準指数時間の方法があり、よく選んだ楕円曲線の群には 3.7〜3.9 節の汎用的な方法しか知られていない(第4章)。

群の元を不透明なラベルとして扱い、群演算と等しいかどうかの判定だけを使うアルゴリズムを汎用アルゴリズム (generic algorithm) という。3.7〜3.9 節の方法はすべて汎用アルゴリズムで、次の下界にほぼ到達している。

定理 3.15(ショウプ, 1997 年)nn の最大の素因数を qq とする。汎用群モデル (generic group model)、すなわち群の元が群の構造と無関係なランダムなラベルで表され、アルゴリズムはラベルどうしの演算を(オラクルに頼んで)行うことしかできないモデルを考える。このモデルで、x∈Z/nZx \in \mathbb{Z}/n\mathbb{Z} を一様ランダムに選んで gg と gxg^x のラベルを与えたとき、群演算を mm 回行う汎用アルゴリズムが xx を正しく出力する確率は O(m2/q)O(m^2/q) 以下である。特に、一定の確率で成功するには Ω(q)\Omega(\sqrt{q}) 回の群演算が必要である。

(主張のみ。)これは汎用アルゴリズムについての下界であり、元の表し方を使う方法(3.10 節の指数計算法など)には当てはまらない。

3.7 ベビーステップ・ジャイアントステップ法

定理 3.16(ベビーステップ・ジャイアントステップ法, baby-step giant-step)G=⟨g⟩G = \langle g \rangle を位数 nn の巡回群、h∈Gh \in G、m=⌈n⌉m = \lceil \sqrt{n} \rceil とする。0≤j<m0 \leq j < m について gjg^j を表に記録し(ベビーステップ)、γ=g−m\gamma = g^{-m} として i=0,1,…,m−1i = 0, 1, \dots, m - 1 の順に hγih\gamma^i が表にあるかを調べる(ジャイアントステップ)。このとき hγi=gjh\gamma^i = g^j となる (i,j)(i, j) が必ず見つかり、x=im+jx = im + j は log⁡gh\log_g h である。群演算は 2m+O(log⁡m)2m + O(\log m) 回以下、記憶する元は mm 個である。

証明. x0=log⁡ghx_0 = \log_g h を 0≤x0<n0 \leq x_0 < n の整数で表し、mm で割って x0=im+jx_0 = im + j(0≤j<m0 \leq j < m)とする。n≤m2n \leq m^2 より i≤(n−1)/m<mi \leq (n - 1)/m < m なので、この (i,j)(i, j) は調べる範囲に入っており、hγi=gx0−im=gjh\gamma^i = g^{x_0 - im} = g^j が成り立つ。逆に hγi=gjh\gamma^i = g^j なら h=gim+jh = g^{im + j} なので、見つかった (i,j)(i, j) は(最初に見つかったものでなくても)log⁡gh\log_g h を与える。群演算は、ベビーステップに m−1m - 1 回、γ=gn−m\gamma = g^{n - m} の計算に反復二乗法で O(log⁡n)=O(log⁡m)O(\log n) = O(\log m) 回、ジャイアントステップに m−1m - 1 回である。□\square

表をハッシュ表にすれば、表を引く手間は 1 回あたり平均で定数である。

例 3.17 p=101p = 101, g=2g = 2(法 101101 の原始根), h=37h = 37 とする。n=100n = 100, m=10m = 10 で、ベビーステップの表は

jj 00 11 22 33 44 55 66 77 88 99
2j mod 1012^j \bmod 101 11 22 44 88 1616 3232 6464 2727 5454 77

である。210≡142^{10} \equiv 14, γ=14−1≡65(mod101)\gamma = 14^{-1} \equiv 65 \pmod{101} で、ジャイアントステップは 37,82,78,20,88,6437, 82, 78, 20, 88, 64 と進み、i=5i = 5 で 64=2664 = 2^6 が表に見つかる。よって log⁡237=5⋅10+6=56\log_2 37 = 5 \cdot 10 + 6 = 56 である。

3.8 ポーリッヒ–ヘルマン法

定理 3.18(ポーリッヒ–ヘルマン法, Pohlig–Hellman)G=⟨g⟩G = \langle g \rangle を位数 n=∏i=1rqiein = \prod_{i=1}^{r} q_i^{e_i}(qiq_i は相異なる素数)の巡回群とする。GG の離散対数問題は、位数 qiq_i の巡回群の離散対数問題を合計 ∑iei\sum_i e_i 個解くことと、O(∑ieilog⁡n)O\bigl(\sum_i e_i \log n\bigr) 回の群演算と中国剰余定理の計算に帰着される。各段をベビーステップ・ジャイアントステップ法で解けば、群演算は O(∑iei(log⁡n+qi))O\bigl(\sum_i e_i(\log n + \sqrt{q_i})\bigr) 回である。

証明. h=gxh = g^x とする。

段階 1(素数べき位数への帰着) ni=n/qiein_i = n/q_i^{e_i}, gi=gnig_i = g^{n_i}, hi=hnih_i = h^{n_i} とおく。04-algebra 第2章 命題 2.19 (3) より gig_i の位数は n/gcd⁡(n,ni)=qiein/\gcd(n, n_i) = q_i^{e_i} で、hi=gixh_i = g_i^x なので、同 (2) より x mod qieix \bmod q_i^{e_i} は log⁡gihi\log_{g_i} h_i に等しい。これらがわかれば、中国剰余定理(04-algebra 第1章 定理 1.28)で x mod nx \bmod n が求まる。gi,hig_i, h_i の計算は反復二乗法で O(log⁡n)O(\log n) 回の群演算である。

段階 2(素数位数への帰着) γ\gamma を位数 qeq^e の元、η=γy\eta = \gamma^y(0≤y<qe0 \leq y < q^e)とし、y=y0+y1q+⋯+ye−1qe−1y = y_0 + y_1q + \cdots + y_{e-1}q^{e-1}(0≤yk<q0 \leq y_k < q)と qq 進展開する。δ=γqe−1\delta = \gamma^{q^{e-1}} は位数 qq の元である。y0,…,yk−1y_0, \dots, y_{k-1} がわかったとして sk=y0+⋯+yk−1qk−1s_k = y_0 + \cdots + y_{k-1}q^{k-1}(s0=0s_0 = 0), ηk=(ηγ−sk)qe−1−k\eta_k = (\eta\gamma^{-s_k})^{q^{e-1-k}} とおくと、ηγ−sk=γykqk+yk+1qk+1+⋯\eta\gamma^{-s_k} = \gamma^{y_kq^k + y_{k+1}q^{k+1} + \cdots} より

ηk=γykqe−1+(qe の倍数)=δyk\eta_k = \gamma^{y_kq^{e-1} + (q^e \text{ の倍数})} = \delta^{y_k}

である。よって yk=log⁡δηky_k = \log_\delta \eta_k は位数 qq の群の離散対数として求まる。各段の冪の計算は O(log⁡n)O(\log n) 回の群演算である。□\square

例 3.19 p=73p = 73, g=5g = 5(原始根), h=17h = 17 とする。n=72=23⋅32n = 72 = 2^3 \cdot 3^2 である。

  • 位数 88 の部分:g1=59≡10g_1 = 5^9 \equiv 10, h1=179≡63h_1 = 17^9 \equiv 63, δ=536≡−1\delta = 5^{36} \equiv -1。η0=634≡−1\eta_0 = 63^4 \equiv -1 より y0=1y_0 = 1。63⋅10−1≡63⋅22≡−163 \cdot 10^{-1} \equiv 63 \cdot 22 \equiv -1 で、η1=(−1)2=1\eta_1 = (-1)^2 = 1 より y1=0y_1 = 0、η2=−1\eta_2 = -1 より y2=1y_2 = 1。よって x≡1+0⋅2+1⋅4=5(mod8)x \equiv 1 + 0 \cdot 2 + 1 \cdot 4 = 5 \pmod{8}。
  • 位数 99 の部分:g2=58≡2g_2 = 5^8 \equiv 2, h2=178≡8h_2 = 17^8 \equiv 8, δ=524≡8\delta = 5^{24} \equiv 8(位数 33)。η0=83≡1\eta_0 = 8^3 \equiv 1 より y0=0y_0 = 0、η1=8=δ\eta_1 = 8 = \delta より y1=1y_1 = 1。よって x≡3(mod9)x \equiv 3 \pmod{9}。

中国剰余定理で x=21x = 21 を得る。実際 521≡17(mod73)5^{21} \equiv 17 \pmod{73} である。

定理 3.18 の帰結として、離散対数の難しさは群の位数 nn の最大の素因数 qq で決まる(汎用アルゴリズムでは定理 3.15 により q\sqrt{q} 程度が必要で、ポーリッヒ–ヘルマン法とベビーステップ・ジャイアントステップ法でほぼそれが達成される)。そのため暗号では、位数が大きな素数 qq の部分群を使う。Fp×\mathbb{F}_p^\times なら q∣p−1q \mid p - 1 となる位数 qq の部分群(DSA の方式)や、安全素数 (safe prime) p=2q+1p = 2q + 1(qq も素数)の平方剰余の部分群を、楕円曲線なら位数が大きな素数の点を使う。

3.9 ポラードの ρ\rho 法(離散対数)

ベビーステップ・ジャイアントステップ法は n\sqrt{n} 個の元を記憶する。ρ\rho 法は同程度の手間を、ほとんど記憶なしに実現する。G=⟨g⟩G = \langle g \rangle の位数 nn を素数とし、GG を 3 つの部分集合 S0,S1,S2S_0, S_1, S_2 に分けて

F(z)={gz(z∈S0)z2(z∈S1)hz(z∈S2)F(z) = \begin{cases} gz & (z \in S_0) \\ z^2 & (z \in S_1) \\ hz & (z \in S_2) \end{cases}

とおく。z0=ga0hb0z_0 = g^{a_0}h^{b_0} から zi+1=F(zi)z_{i+1} = F(z_i) で列を作ると、zi=gaihbiz_i = g^{a_i}h^{b_i} となる指数 (ai,bi)∈(Z/nZ)2(a_i, b_i) \in (\mathbb{Z}/n\mathbb{Z})^2 も同時に更新できる(S0S_0 なら aa に 11 を足し、S1S_1 なら両方を 2 倍し、S2S_2 なら bb に 11 を足す)。補題 3.4 により zi=z2iz_i = z_{2i} となる ii が見つかり、そのとき

gaihbi=ga2ihb2iより(bi−b2i)log⁡gh≡a2i−ai(modn)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}

である。bi≢b2ib_i \not\equiv b_{2i} なら log⁡gh\log_g h が求まり、そうでなければ別の z0z_0 でやり直す。FF がランダムな写像のようにふるまうと仮定すれば、補題 3.6 により段数は平均 O(n)O(\sqrt{n}) である(ヒューリスティック)。記憶するのは (zi,ai,bi)(z_i, a_i, b_i) と (z2i,a2i,b2i)(z_{2i}, a_{2i}, b_{2i}) だけである。多数の計算機で並列に実行する工夫もあり、楕円曲線の離散対数の記録的な計算はこの方法で行われている。

3.10 指数計算法

汎用アルゴリズムは群の元の表し方を使わない。Fp×\mathbb{F}_p^\times の元は 11 以上 p−1p - 1 以下の整数で表せるので、二次ふるい法と同じく「小さい素数に分解できる」という性質が使える。これが指数計算法 (index calculus) である。

  1. 因子基底 F={ℓ1,…,ℓk}\mathcal{F} = \lbrace \ell_1, \dots, \ell_k \rbrace(BB 以下の素数)を決める。
  2. ランダムな ss について gs mod pg^s \bmod p を整数とみて素因数分解し、BB-滑らかなら関係式 gs≡∏jℓjejg^s \equiv \prod_j \ell_j^{e_j}、すなわち s≡∑jejlog⁡gℓj(modp−1)s \equiv \sum_j e_j\log_g \ell_j \pmod{p - 1} を記録する。
  3. 関係式が十分集まったら、log⁡gℓj\log_g \ell_j についての連立一次合同式を  mod (p−1)\bmod (p - 1) で解く(p−1p - 1 の素因数ごとに解いて中国剰余定理でまとめる)。
  4. 目標の hh について hgs≡∏jℓjfjhg^s \equiv \prod_j \ell_j^{f_j}(BB-滑らか)となる ss を探せば、log⁡gh≡∑jfjlog⁡gℓj−s\log_g h \equiv \sum_j f_j\log_g \ell_j - s である。

例 3.20 p=709p = 709, g=17g = 17(原始根), F={2,3,5,7}\mathcal{F} = \lbrace 2, 3, 5, 7 \rbrace とする。指数を試すと、たとえば

1773≡2,1731≡24=23⋅3,1727≡30=2⋅3⋅5,1722≡315=32⋅5⋅7(mod709)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≤s≤7081 \leq s \leq 708 のうち 121121 個の ss で 17s mod 70917^s \bmod 709 は 77-滑らかである)。Lℓ=log⁡17ℓL_\ell = \log_{17}\ell と書くと、 mod 708\bmod 708 で L2=73L_2 = 73、3L2+L3=313L_2 + L_3 = 31 より L3=520L_3 = 520、L2+L3+L5=27L_2 + L_3 + L_5 = 27 より L5=142L_5 = 142、2L3+L5+L7=222L_3 + L_5 + L_7 = 22 より L7=256L_7 = 256 である。h=314h = 314 については 314⋅17≡375=3⋅53314 \cdot 17 \equiv 375 = 3 \cdot 5^3 なので、log⁡17314≡L3+3L5−1=945≡237(mod708)\log_{17} 314 \equiv L_3 + 3L_5 - 1 = 945 \equiv 237 \pmod{708}。実際 17237≡314(mod709)17^{237} \equiv 314 \pmod{709} である。

gs mod pg^s \bmod p は pp 程度の大きさの整数なので、3.5 節と同じ見積もりで(値の大きさが N1/2N^{1/2} ではなく pp になる)、基本的な指数計算法の計算量はヒューリスティックに Lp[1/2,2]L_p[1/2, \sqrt{2}] になる。数体ふるい法を離散対数に応用すると、素因数分解と同じ Lp[1/3,(64/9)1/3]L_p[1/3, (64/9)^{1/3}] になる(主張のみ)。このため Fp×\mathbb{F}_p^\times の離散対数に基づく方式は、同じビット数の RSA と同程度の大きさの pp を必要とする。

一方、素体上の一般の楕円曲線の点には「小さい素数への分解」にあたる性質が見つかっておらず、指数計算法のような準指数時間の方法は知られていない。これが楕円曲線暗号の鍵が短くてすむ理由である(第4章)。

3.11 安全な鍵長の目安とその根拠

暗号の強さは安全性ビット数で表す。「ss ビットの安全性」とは、最良の攻撃に約 2s2^s 回の基本演算が必要という意味で、ss ビットの鍵の共通鍵暗号を総当たりで破る手間に相当する。米国 NIST の SP 800-57 Part 1 Rev. 5(2020 年)は、同程度の安全性を与える鍵の大きさを次のように示している。

安全性ビット数 共通鍵暗号 有限体(DSA, DH) 素因数分解(RSA)の法 楕円曲線(ECDSA, EdDSA, ECDH)の位数 nn
112112 3TDEA(2024 年以降は暗号化に使えない) pp: 2048 ビット, qq: 224 ビット 2048 ビット 224〜255 ビット
128128 AES-128 pp: 3072, qq: 256 3072 256〜383
192192 AES-192 pp: 7680, qq: 384 7680 384〜511
256256 AES-256 pp: 15360, qq: 512 15360 512 以上

楕円曲線の列は 3.9 節から説明できる。位数 n≈2256n \approx 2^{256} の群では、ρ\rho 法の段数は約 πn/4≈2127.8\sqrt{\pi n/4} \approx 2^{127.8}(πn/2\sqrt{\pi n/2} から、楕円曲線では PP と −P-P を同一視して 2\sqrt{2} 倍速くできる)で、安全性ビット数は nn のビット数の半分になる。有限体と RSA の列は数体ふるい法の計算量に基づく。たとえば NIST SP 800-56B Rev. 2(2019 年)は、RSA の法のビット長 kk に対する安全性ビット数の目安として、LN[1/3,1.923]L_N[1/3, 1.923] の o(1)o(1) を 00 とおいた指数から定数を引いた

E(k)=1.923klog⁡23 (log⁡(klog⁡2))2/3−4.69log⁡2E(k) = \frac{1.923\sqrt[3]{k\log 2}\,\bigl(\log(k\log 2)\bigr)^{2/3} - 4.69}{\log 2}

を 8 の倍数に丸めた値を与えている。

法のビット数 kk 1024 2048 3072 4096 8192
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) を無視した式は計算時間そのものではなく、目安を与えるための式である。安全性ビット数を 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 の安全素数の群など)を使う。

まとめ

  • LN[α,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}) で計算量を比べる。試し割りと ρ\rho 法は指数時間(α=1\alpha = 1)、二次ふるい法は LN[1/2,1]L_N[1/2, 1]、数体ふるい法は LN[1/3,1.923]L_N[1/3, 1.923](ともにヒューリスティック)。
  • フェルマー法は p,qp, q が近いと速い。q−p≤22N1/4q - p \leq 2\sqrt{2}N^{1/4} なら最初の 1 回で分解できる。
  • ρ\rho 法は xi+1=xi2+cx_{i+1} = x_i^2 + c の法 pp での周期を、フロイドの方法と gcd⁡\gcd で見つける。誕生日の議論から段数は約 p\sqrt{p}(ヒューリスティック)。
  • p−1p - 1 法は、ある素因数 pp について p−1p - 1 が BB-べき滑らかなら gcd⁡(aMB−1,N)\gcd(a^{M_B} - 1, N) で pp を見つける。
  • 二次ふるい法は、滑らかな t2−Nt^2 - N を集め、F2\mathbb{F}_2 上の一次従属から X2≡Y2X^2 \equiv Y^2 を作り、gcd⁡(X−Y,N)\gcd(X - Y, N) で分解する。
  • 離散対数の難しさは群の表し方で決まる。汎用アルゴリズムには Ω(q)\Omega(\sqrt{q})(qq は位数の最大の素因数)の下界がある。
  • ベビーステップ・ジャイアントステップ法は O(n)O(\sqrt{n}) の時間と記憶、ρ\rho 法は O(n)O(\sqrt{n}) の時間(ヒューリスティック)とわずかな記憶で離散対数を求める。ポーリッヒ–ヘルマン法により、難しさは位数の最大の素因数で決まるので、素数位数の部分群を使う。
  • Fp×\mathbb{F}_p^\times には指数計算法(準指数時間)があるが、楕円曲線には知られていない。そのため同じ安全性に必要な鍵の長さが大きく違う(128 ビットの安全性なら RSA 3072 ビットに対し楕円曲線 256 ビット)。

演習問題

問題 3.1 ★ N=1022117N = 1022117 をフェルマー法で素因数分解せよ。また、命題 3.3 の条件 q−p≤22N1/4q - p \leq 2\sqrt{2}N^{1/4} がみたされていることを確かめよ。

解答

N=1010.998⋯\sqrt{N} = 1010.998\cdots なので x=1011x = 1011 から始める。10112−N=1022121−1022117=4=221011^2 - N = 1022121 - 1022117 = 4 = 2^2 なので、N=(1011−2)(1011+2)=1009⋅1013N = (1011 - 2)(1011 + 2) = 1009 \cdot 1013。10091009 と 10131013 はともに素数である(1013<32\sqrt{1013} < 32 なので、3131 以下の素数で割り切れないことを確かめればよい)。q−p=4q - p = 4 で、22N1/4≈89.92\sqrt{2}N^{1/4} \approx 89.9 なので条件はみたされている。

問題 3.2 ★ p=101p = 101, g=2g = 2 とする。ベビーステップ・ジャイアントステップ法で log⁡243\log_2 43 を求めよ(ベビーステップの表は例 3.17 のものを使ってよい)。

解答

γ=2−10≡65\gamma = 2^{-10} \equiv 65 で、ジャイアントステップは 43→43⋅65≡68→68⋅65≡77→77⋅65≡56→56⋅65≡4(mod101)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} と進む。i=4i = 4 で 4=224 = 2^2 が表にあるので log⁡243=4⋅10+2=42\log_2 43 = 4 \cdot 10 + 2 = 42。検算:反復二乗法で 242≡43(mod101)2^{42} \equiv 43 \pmod{101}。

問題 3.3 ★★ N=10590721=2521⋅4201N = 10590721 = 2521 \cdot 4201 に a=2a = 2, B=25B = 25 で p−1p - 1 法を適用すると gcd⁡(2M25−1,N)=N\gcd(2^{M_{25}} - 1, N) = N となり失敗する。その理由を説明し、BB を小さくすると分解できることを示せ。

解答

2520=23⋅32⋅5⋅72520 = 2^3 \cdot 3^2 \cdot 5 \cdot 7 と 4200=23⋅3⋅52⋅74200 = 2^3 \cdot 3 \cdot 5^2 \cdot 7 はともに 2525-べき滑らかなので M25M_{25} を割り、定理 3.8 (1) により 25212521 と 42014201 の両方が gcd⁡\gcd を割る。よって gcd⁡=N\gcd = N である。

B=20B = 20(または B=10B = 10)とすると、2520∣M202520 \mid M_{20} なので 2521∣gcd⁡2521 \mid \gcd である。一方 ord⁡4201(2)=525=3⋅52⋅7\operatorname{ord}_{4201}(2) = 525 = 3 \cdot 5^2 \cdot 7 は、M20=24⋅32⋅5⋅7⋅11⋅13⋅17⋅19M_{20} = 2^4 \cdot 3^2 \cdot 5 \cdot 7 \cdot 11 \cdot 13 \cdot 17 \cdot 19 が 525^2 で割り切れないので M20M_{20} を割らない。定理 3.8 (2) より gcd⁡(2M20−1,N)\gcd(2^{M_{20}} - 1, N) は非自明な約数で、計算すると 25212521 になる。実装では、MM を素数べきごとに大きくしながら途中で gcd⁡\gcd をとって、2 つの素因数が同時に見つかる危険を減らす。

問題 3.4 ★★ p=109p = 109, g=6g = 6(原始根)とする。ポーリッヒ–ヘルマン法で log⁡688\log_6 88 を求めよ。

解答

n=108=22⋅33n = 108 = 2^2 \cdot 3^3。

  • 位数 44 の部分:g1=627≡33g_1 = 6^{27} \equiv 33, h1=8827≡−1h_1 = 88^{27} \equiv -1, δ=654≡−1\delta = 6^{54} \equiv -1。η0=h12=1\eta_0 = h_1^2 = 1 より y0=0y_0 = 0、η1=h1=−1=δ\eta_1 = h_1 = -1 = \delta より y1=1y_1 = 1。よって x≡2(mod4)x \equiv 2 \pmod{4}。
  • 位数 2727 の部分:g2=64≡97g_2 = 6^4 \equiv 97, h2=884≡25h_2 = 88^4 \equiv 25, δ=636≡63\delta = 6^{36} \equiv 63(位数 33、δ2≡45\delta^2 \equiv 45)。η0=259≡45=δ2\eta_0 = 25^9 \equiv 45 = \delta^2 より y0=2y_0 = 2。η1=(25⋅97−2)3≡1\eta_1 = (25 \cdot 97^{-2})^3 \equiv 1 より y1=0y_1 = 0。η2=25⋅97−2≡63=δ\eta_2 = 25 \cdot 97^{-2} \equiv 63 = \delta より y2=1y_2 = 1。よって x≡2+0⋅3+1⋅9=11(mod27)x \equiv 2 + 0 \cdot 3 + 1 \cdot 9 = 11 \pmod{27}。

中国剰余定理で x≡2(mod4)x \equiv 2 \pmod 4, x≡11(mod27)x \equiv 11 \pmod{27} を解くと x=38x = 38。検算:638≡88(mod109)6^{38} \equiv 88 \pmod{109}。

問題 3.5 ★★ G=⟨g⟩G = \langle g \rangle を位数 nn の巡回群とし、h=gxh = g^x の xx が 0≤x<K0 \leq x < K(K≤nK \leq n)の範囲にあることがわかっているとする。O(K+log⁡n)O(\sqrt{K} + \log n) 回の群演算で xx を求める方法を与えよ。また、xx が 40 ビットの乱数なら、群がどれほど大きくても約 2212^{21} 回の群演算で求まることを確かめよ。

解答

定理 3.16 の mm を m=⌈K⌉m = \lceil \sqrt{K} \rceil に取り替える。0≤j<m0 \leq j < m の gjg^j を表にし、γ=g−m\gamma = g^{-m} として i=0,1,…,m−1i = 0, 1, \dots, m - 1 について hγih\gamma^i を表と照合する。x=im+jx = im + j(0≤j<m0 \leq j < m)と割ると K≤m2K \leq m^2 より i≤(K−1)/m<mi \leq (K - 1)/m < m なので、この (i,j)(i, j) は調べる範囲に入っていて、必ず一致が見つかる。見つかった (i,j)(i, j) は h=gim+jh = g^{im + j} をみたすので、im+j≡x(modn)im + j \equiv x \pmod{n} である。群演算はベビーステップとジャイアントステップに合わせて 2m2m 回以下、γ=gn−m\gamma = g^{n - m} の計算に O(log⁡n)O(\log n) 回である。K=240K = 2^{40} なら m=220m = 2^{20} で、全体は約 2⋅220=2212 \cdot 2^{20} = 2^{21} 回(記憶する元は 2202^{20} 個)である。秘密の指数を「大きな群の元だから安全」と考えて短い乱数から作ると、群の大きさではなく、乱数がとりうる値の個数の平方根の手間(ビット数でいえば乱数の半分)で破られる(第4章の署名のナンスで重要になる)。

問題 3.6 ★★ (この実装のどこが危ないか)あるサーバーは p=211p = 211 と原始根 g=2g = 2 を使い、固定の秘密 xx(1≤x<2101 \leq x < 210)で、受け取った AA に対して K=Ax mod pK = A^x \bmod p を計算し、KK から作った鍵で応答を暗号化して返す。受け取った AA は検査しない。攻撃者は AA として 210,196,107,171210, 196, 107, 171 を送り、応答の暗号を候補の鍵で試すことで、それぞれ K=210,1,188,148K = 210, 1, 188, 148 であることを知った。xx を求めよ。また、どう防げばよいか。

解答

p−1=210=2⋅3⋅5⋅7p - 1 = 210 = 2 \cdot 3 \cdot 5 \cdot 7 である。送られた AA はそれぞれ 2105,270,242,2302^{105}, 2^{70}, 2^{42}, 2^{30} で、位数は 2,3,5,72, 3, 5, 7 である。各 AA の冪を並べると

  • A=210=−1A = 210 = -1:冪は 1,2101, 210。K=210K = 210 より x≡1(mod2)x \equiv 1 \pmod 2。
  • A=196A = 196:冪は 1,196,141, 196, 14。K=1K = 1 より x≡0(mod3)x \equiv 0 \pmod 3。
  • A=107A = 107:冪は 1,107,55,188,711, 107, 55, 188, 71。K=188K = 188 より x≡3(mod5)x \equiv 3 \pmod 5。
  • A=171A = 171:冪は 1,171,123,144,148,199,581, 171, 123, 144, 148, 199, 58。K=148K = 148 より x≡4(mod7)x \equiv 4 \pmod 7。

中国剰余定理で x≡123(mod210)x \equiv 123 \pmod{210}、すなわち x=123x = 123 である。位数 rr の元を送るたびに、攻撃者は rr 通りの候補を試すだけで x mod rx \bmod r を知る(小部分群攻撃, small subgroup attack)。

防ぎ方:位数が大きな素数 qq の部分群を使い(安全素数 p=2q+1p = 2q + 1 など)、受け取った AA について 1<A<p−11 < A < p - 1 かつ Aq≡1(modp)A^q \equiv 1 \pmod{p} を確かめてから使う。標準化された群(RFC 7919 など)とライブラリの検査を使うのがよい。楕円曲線での同じ種類の攻撃は第4章で扱う。

問題 3.7 ★★★ N=pqN = pq(p≠qp \neq q は奇素数)とする。法 NN の平方剰余 cc(gcd⁡(c,N)=1\gcd(c, N) = 1)を入力するとその平方根 yy(y2≡cy^2 \equiv c)を一つ出力するアルゴリズム A\mathcal{A} があるとする。A\mathcal{A} を平均 2 回程度呼び出して NN を素因数分解する方法を与えよ(法 NN の平方根を求めることは素因数分解と同じくらい難しい)。

解答

x∈{1,…,N−1}x \in \lbrace 1, \dots, N - 1 \rbrace を一様ランダムに選ぶ。gcd⁡(x,N)>1\gcd(x, N) > 1 ならそれで分解できる。そうでなければ c=x2 mod Nc = x^2 \bmod N を A\mathcal{A} に与えて yy を得る。

中国剰余定理により、cc の法 NN の平方根は、法 pp の平方根 ±x\pm x と法 qq の平方根 ±x\pm x の組み合わせでちょうど 4 個ある:x,−x,x′,−x′x, -x, x', -x'(x′≡x(modp)x' \equiv x \pmod p, x′≡−x(modq)x' \equiv -x \pmod q)。(Z/NZ)×(\mathbb{Z}/N\mathbb{Z})^\times 上で x↦x2x \mapsto x^2 は 4 対 1 の写像なので、cc を固定したときの条件付き分布で xx はこの 4 個の上に一様に分布する。一方 A\mathcal{A} の出力 yy は cc だけから(xx とは独立な内部の乱数を使っても)決まる。したがって y≢±xy \not\equiv \pm x となる確率はちょうど 1/21/2 であり、そのとき命題 3.10 より gcd⁡(x−y,N)\gcd(x - y, N) は pp または qq である。失敗したら xx を選び直す。各回の成功確率は 1/21/2 以上なので、試行回数の平均は 2 回以下である。

この章を読み終えたら

「読了」にすると、学習記録と地図に反映されます。

この章の誤りを報告GitHub で見る