Lemma

第1章暗号のための整数論と計算量

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

この章の目標

  • 整数の大きさをビット長で測り、四則演算・ユークリッドの互除法・冪剰余がビット長の多項式時間で計算できることを証明できる
  • 拡張ユークリッドの互除法で法 nn の逆元を求め、中国剰余定理で RSA の復号を高速化できる
  • 素数定理から、ランダムに選んだ kk ビットの整数が素数である確率を見積もれる
  • フェルマーテストの限界をカーマイケル数とコルセルトの判定法で説明し、ミラー–ラビン法の誤り確率が 1/41/4 以下であることを証明できる
  • 鍵となる素数の生成で、乱数の質が安全性を左右する理由を説明できる

前提:04-algebra 第1章(合同式・中国剰余定理・オイラーの定理・原始根)、04-algebra 第2章(ラグランジュの定理・元の位数)。1.5 節では素数定理(05-complex-analysis 第8章で証明される)の主張だけを使う。

https で始まる Web ページを開くと、ブラウザとサーバーは数十ミリ秒のうちに数百桁の整数の冪剰余などを計算して、鍵を共有し、相手が本物であることを確かめる(TLS。第2章)。一方でその安全性は、「617 桁の整数の素因数分解には、現在知られている方法では天文学的な時間がかかる」といった事実に支えられている。公開鍵暗号は、速く計算できることと、速く計算する方法が知られていないことの落差の上に作られている。

本章ではこの落差の「易しい側」を確かめる。計算の速さの物差しを定め、逆元や冪剰余が多項式時間で計算できることを証明したあと、RSA の鍵に必要な大きな素数の見つけ方を考える。ミラー–ラビン法を使えば、素因数を一つも見つけないまま合成数であることを見抜ける。素数かどうかの判定は易しく、素因数分解は難しい――この非対称性が RSA 暗号の土台である。「難しい側」のアルゴリズムは第3章で扱う。

1.1 計算量の考え方

現在推奨される RSA の法は 2048 ビット(10 進で 617 桁)以上である(第2章)。このような数の計算の手間は、数の大きさではなく桁数で測る。

定義 1.1(ビット長, bit length)正の整数 nn の 2 進表示の桁数 ℓ(n)=⌊log⁡2n⌋+1\ell(n) = \lfloor \log_2 n \rfloor + 1 を nn のビット長という。ℓ(n)=k\ell(n) = k、すなわち 2k−1≤n<2k2^{k-1} \leq n < 2^k のとき、nn を kk ビットの整数という。

計算の手間はビット演算 (bit operation)、すなわち 1 ビットどうしの論理演算の回数で測る(計算機が 64 ビット単位などで処理することは定数倍の違いにすぎない)。f(k)=O(g(k))f(k) = O(g(k)) は、定数 CC があって十分大きいすべての kk で f(k)≤Cg(k)f(k) \leq Cg(k) となることを表す。

定義 1.2(多項式時間, polynomial time)整数を入力とするアルゴリズムが多項式時間であるとは、入力のビット長の和を LL とするとき、ビット演算の回数が O(Lc)O(L^c) となる定数 cc が存在することをいう。

例 1.3(試し割り)nn を 2,3,…,⌊n⌋2, 3, \dots, \lfloor \sqrt{n} \rfloor で順に割って素因数を探す方法は、nn が同じくらいの大きさの 2 素数の積なら約 n≈2ℓ(n)/2\sqrt{n} \approx 2^{\ell(n)/2} 回の割り算を要し、ℓ(n)\ell(n) の指数関数である。ℓ(n)=2048\ell(n) = 2048 なら約 21024≈1.8×103082^{1024} \approx 1.8 \times 10^{308} 回で、毎秒 101810^{18} 回割れても約 1.8×102901.8 \times 10^{290} 秒かかる(宇宙の年齢は約 4×10174 \times 10^{17} 秒)。

命題 1.4(筆算の計算量)a,ba, b を正の整数、k=ℓ(a)k = \ell(a), l=ℓ(b)l = \ell(b) とする。

  1. a+ba + b と ∣a−b∣\lvert a - b \rvert は O(max⁡(k,l))O(\max(k, l)) 回のビット演算で計算できる。
  2. abab は O(kl)O(kl) 回のビット演算で計算できる。
  3. a≥ba \geq b のとき、a=qb+ra = qb + r(0≤r<b0 \leq r < b)をみたす q,rq, r は O(l⋅ℓ(q))O(l \cdot \ell(q)) 回のビット演算で計算できる。

証明. 2 進の筆算の手順を数える。(1) 下の桁から順に、その桁と繰り上がり(繰り下がり)を定数回の論理演算で求める。(2) k≥lk \geq l としてよい。b=∑jbj2jb = \sum_j b_j 2^j なら ab=∑bj=12jaab = \sum_{b_j = 1} 2^j a で、k+lk + l ビット以下の数を高々 ll 回足せばよいので、(1) より O(l(k+l))=O(kl)O(l(k + l)) = O(kl)。(3) a<2ka < 2^k, b≥2l−1b \geq 2^{l-1} より q<2k−l+1q < 2^{k-l+1} である。筆算の割り算は qq のビットを上から 1 つずつ、l+1l + 1 ビット以下の数の比較と引き算で決めるので、O(l(k−l+1))O(l(k - l + 1)) 回で済む。k>lk > l なら a/b>2k−1/2la/b > 2^{k-1}/2^l より ℓ(q)≥k−l\ell(q) \geq k - l で、q≥1q \geq 1 と合わせて k−l+1≤2ℓ(q)k - l + 1 \leq 2\ell(q) である。□\square

特に Z/nZ\mathbb{Z}/n\mathbb{Z} の積(積を nn で割った余り)は O(ℓ(n)2)O(\ell(n)^2) 回で計算できる(カラツバ法など、より速い掛け算の方法もある)。

1.2 反復二乗法

RSA では ae mod na^e \bmod n を数千ビットの e,ne, n で計算する。aa を e−1e - 1 回掛けるのでは回数が天文学的になるが、指数を 2 進展開して 2 乗を繰り返せば ee の桁数程度の回数で済む。

反復二乗法(square-and-multiply) 入力は n≥2n \geq 2, 0≤a<n0 \leq a < n, e≥1e \geq 1 で、e=(eL−1⋯e1e0)2e = (e_{L-1} \cdots e_1 e_0)_2(L=ℓ(e)L = \ell(e), eL−1=1e_{L-1} = 1)とする。x←ax \leftarrow a とし、i=L−2,…,1,0i = L - 2, \dots, 1, 0 の順に「x←x2 mod nx \leftarrow x^2 \bmod n とし、ei=1e_i = 1 ならさらに x←xa mod nx \leftarrow xa \bmod n とする」を行って、最後の xx を出力する。

定理 1.5(反復二乗法の計算量)反復二乗法は ae mod na^e \bmod n を出力する。法 nn での乗算(2 乗を含む)の回数は (ℓ(e)−1)+(w(e)−1)≤2(ℓ(e)−1)(\ell(e) - 1) + (w(e) - 1) \leq 2(\ell(e) - 1) である(w(e)w(e) は ee の 2 進表示の 11 の個数)。ビット演算の回数は O(ℓ(e)ℓ(n)2)O(\ell(e)\ell(n)^2) であり、特に 1≤e<n1 \leq e < n なら O(ℓ(n)3)O(\ell(n)^3) である。

証明. Ei=⌊e/2i⌋E_i = \lfloor e/2^i \rfloor(上位のビット eL−1⋯eie_{L-1} \cdots e_i が表す数)とおくと、EL−1=1E_{L-1} = 1, E0=eE_0 = e, Ei=2Ei+1+eiE_i = 2E_{i+1} + e_i である。添字 ii の処理後に x≡aEi(modn)x \equiv a^{E_i} \pmod{n} となることを ii の降順の帰納法で示す。最初は x=a=aEL−1x = a = a^{E_{L-1}} で、添字 i+1i + 1 で成り立てば、添字 ii の処理後の xx は (aEi+1)2aei=aEi(a^{E_{i+1}})^2 a^{e_i} = a^{E_i} と合同である。よって出力は aE0 mod n=ae mod na^{E_0} \bmod n = a^e \bmod n。2 乗は L−1L - 1 回、aa を掛けるのは i≤L−2i \leq L - 2 かつ ei=1e_i = 1 となる w(e)−1w(e) - 1 回である。各乗算は nn 未満の 2 数の積と、n2n^2 未満の数の nn による割り算(商は nn 未満)なので、命題 1.4 より O(ℓ(n)2)O(\ell(n)^2) である。e<ne < n なら ℓ(e)≤ℓ(n)\ell(e) \leq \ell(n)。□\square

例 1.6 2560 mod 5612^{560} \bmod 561 を計算する。560=(1000110000)2560 = (1000110000)_2 なので、2 乗 9 回と、22 を掛ける乗算 2 回で済む。

ビット eie_i 11 00 00 00 11 11 00 00 00 00
EiE_i 11 22 44 88 1717 3535 7070 140140 280280 560560
2Ei mod 5612^{E_i} \bmod 561 22 44 1616 256256 359359 263263 166166 6767 11 11

たとえば 2562=65536≡460256^2 = 65536 \equiv 460, 460⋅2=920≡359460 \cdot 2 = 920 \equiv 359、672=4489=8⋅561+167^2 = 4489 = 8 \cdot 561 + 1 である。よって 2560≡1(mod561)2^{560} \equiv 1 \pmod{561} である(1.7 節で再び使う)。

1 回の乗算で指数の最大値は高々 2 倍にしかならないので、aea^e には少なくとも log⁡2e\log_2 e 回の乗算が要り、定理 1.5 の回数は最小の 2 倍以内である。RSA でよく使われる e=65537=216+1e = 65537 = 2^{16} + 1 なら、2 乗 16 回と乗算 1 回で済む。

ヒント

実務では 反復二乗法をそのまま実装すると、秘密の指数のビットが 11 のところでだけ乗算が増えるので、処理時間や消費電力からビットが読み取られうる(サイドチャネル攻撃。タイミング攻撃は 1996 年に P. Kocher が示した)。暗号ライブラリは、ビットによらず同じ順序で演算する方法(問題 1.2 のモンゴメリー・ラダーなど)や乱数によるかく乱で対策している。Python の pow にこの対策はないので、秘密の値の計算に流用しない。

1.3 拡張ユークリッドの互除法

RSA の鍵生成では逆元 d=e−1 mod λ(n)d = e^{-1} \bmod \lambda(n)(第2章)を計算する。04-algebra 第1章の例 1.25 の計算を、係数を同時に更新する形に整理して計算量を評価する。

拡張ユークリッドの互除法 入力は a≥b≥1a \geq b \geq 1。r0=ar_0 = a, r1=br_1 = b, (s0,t0)=(1,0)(s_0, t_0) = (1, 0), (s1,t1)=(0,1)(s_1, t_1) = (0, 1) とし、i=1,2,…i = 1, 2, \dots について ri≠0r_i \neq 0 である間、qi=⌊ri−1/ri⌋q_i = \lfloor r_{i-1}/r_i \rfloor として

ri+1=ri−1−qiri,si+1=si−1−qisi,ti+1=ti−1−qitir_{i+1} = r_{i-1} - q_i r_i, \qquad s_{i+1} = s_{i-1} - q_i s_i, \qquad t_{i+1} = t_{i-1} - q_i t_i

と定める。rm+1=0r_{m+1} = 0 となったら止め、(rm,sm,tm)(r_m, s_m, t_m) を出力する(mm は割り算の回数)。

定理 1.7(拡張ユークリッドの互除法, extended Euclidean algorithm)a≥b≥1a \geq b \geq 1 とする。

  1. 0≤i≤m+10 \leq i \leq m + 1 で sia+tib=ris_i a + t_i b = r_i であり、rm=gcd⁡(a,b)r_m = \gcd(a, b) である。特に gcd⁡(a,b)=1\gcd(a, b) = 1 なら tmb≡1(moda)t_m b \equiv 1 \pmod{a}。
  2. 割り算の回数は m≤2⌊log⁡2b⌋+1m \leq 2\lfloor \log_2 b \rfloor + 1 をみたす。
  3. 全体のビット演算の回数は O(ℓ(a)2)O(\ell(a)^2) である。

証明. (1) i=0,1i = 0, 1 では定義から成り立ち、i−1i - 1 と ii で成り立てば漸化式から i+1i + 1 でも成り立つ。rm=gcd⁡(a,b)r_m = \gcd(a, b) は互除法の正しさ(04-algebra 第1章 補題 1.10)による。

(2) 1≤i≤m1 \leq i \leq m のとき、ri−1≥ri>ri+1r_{i-1} \geq r_i > r_{i+1} より qi≥1q_i \geq 1 で、ri−1=qiri+ri+1>2ri+1r_{i-1} = q_i r_i + r_{i+1} > 2r_{i+1}。r1=br_1 = b から始めてこれを繰り返すと、j≥0j \geq 0 について r2j+1≤b/2jr_{2j+1} \leq b/2^j である。m=2j+1m = 2j + 1 なら 1≤rm≤b/2j1 \leq r_m \leq b/2^j、m=2jm = 2j(j≥1j \geq 1)なら 2≤r2j−1≤b/2j−12 \leq r_{2j-1} \leq b/2^{j-1}(r2j−1>r2j≥1r_{2j-1} > r_{2j} \geq 1 による)で、いずれも 2j≤b2^j \leq b、すなわち j≤⌊log⁡2b⌋j \leq \lfloor \log_2 b \rfloor となる。よって m≤2j+1≤2⌊log⁡2b⌋+1m \leq 2j + 1 \leq 2\lfloor \log_2 b \rfloor + 1。

(3) まず係数の大きさを抑える。∣si+1∣≤∣si−1∣+qi∣si∣≤(qi+1)max⁡(∣si−1∣,∣si∣)\lvert s_{i+1} \rvert \leq \lvert s_{i-1} \rvert + q_i\lvert s_i \rvert \leq (q_i + 1)\max(\lvert s_{i-1} \rvert, \lvert s_i \rvert) と max⁡(∣s0∣,∣s1∣)=1\max(\lvert s_0 \rvert, \lvert s_1 \rvert) = 1 から、帰納法で ∣si∣≤∏1≤j<i(qj+1)≤∏j=1m2qj\lvert s_i \rvert \leq \prod_{1 \leq j < i}(q_j + 1) \leq \prod_{j=1}^m 2q_j を得る(tt も同様)。ri−1≥qirir_{i-1} \geq q_i r_i より ∏i=1mqi≤∏i=1mri−1/ri≤a\prod_{i=1}^m q_i \leq \prod_{i=1}^m r_{i-1}/r_i \leq a なので、∣si∣,∣ti∣≤2ma\lvert s_i \rvert, \lvert t_i \rvert \leq 2^m a、すなわち係数のビット長は m+ℓ(a)=O(ℓ(a))m + \ell(a) = O(\ell(a)) 以下である。第 ii 回の計算(割り算、qisiq_i s_i と qitiq_i t_i、引き算)は命題 1.4 より O(ℓ(a)(ℓ(qi)+1))O(\ell(a)(\ell(q_i) + 1)) 回でできる。

∑i=1m(ℓ(qi)+1)≤∑i=1m(log⁡2qi+2)≤log⁡2a+2m=O(ℓ(a))\sum_{i=1}^m (\ell(q_i) + 1) \leq \sum_{i=1}^m (\log_2 q_i + 2) \leq \log_2 a + 2m = O(\ell(a))

(最後は (2) による)なので、全体で O(ℓ(a)2)O(\ell(a)^2) である。□\square

例 1.8 1717 の法 31203120 での逆元を求める(a=3120a = 3120, b=17b = 17)。

ii 00 11 22 33 44 55
rir_i 31203120 1717 99 88 11 00
qiq_i ― 183183 11 11 88 ―
sis_i 11 00 11 −1-1 22 −17-17
tit_i 00 11 −183-183 184184 −367-367 31203120

m=4m = 4 で、2⋅3120−367⋅17=12 \cdot 3120 - 367 \cdot 17 = 1 より 17−1≡−367≡2753(mod3120)17^{-1} \equiv -367 \equiv 2753 \pmod{3120}。3120=(61−1)(53−1)3120 = (61 - 1)(53 - 1) なので、この 27532753 は第2章で RSA の法 n=61⋅53=3233n = 61 \cdot 53 = 3233 の秘密鍵として使う。

1.4 中国剰余定理による高速化

秘密鍵の持ち主は n=pqn = pq の素因数を知っているので、冪剰余を半分の大きさの法での 2 つの計算に分けられる。

命題 1.9(中国剰余定理による冪剰余)p,qp, q を相異なる奇素数、n=pqn = pq とし、正の整数 dd は gcd⁡(d,p−1)=gcd⁡(d,q−1)=1\gcd(d, p - 1) = \gcd(d, q - 1) = 1 をみたすとする。整数 cc に対し、dp=d mod (p−1)d_p = d \bmod (p - 1), dq=d mod (q−1)d_q = d \bmod (q - 1), mp=cdp mod pm_p = c^{d_p} \bmod p, mq=cdq mod qm_q = c^{d_q} \bmod q, q′=q−1 mod pq' = q^{-1} \bmod p, h=(mp−mq)q′ mod ph = (m_p - m_q)q' \bmod p とおき、m=mq+qhm = m_q + qh とする。このとき m=cd mod nm = c^d \bmod n である。

証明. p−1≥2p - 1 \geq 2 と gcd⁡(d,p−1)=1\gcd(d, p - 1) = 1 より p−1∤dp - 1 \nmid d なので dp≥1d_p \geq 1。p∤cp \nmid c なら、d=dp+j(p−1)d = d_p + j(p - 1) とフェルマーの小定理(04-algebra 第1章 系 1.35)より cd≡cdp(modp)c^d \equiv c^{d_p} \pmod{p}。p∣cp \mid c なら d,dp≥1d, d_p \geq 1 より両辺とも 00 と合同。よって cd≡mp(modp)c^d \equiv m_p \pmod{p}、同様に cd≡mq(modq)c^d \equiv m_q \pmod{q}。一方 m≡mq(modq)m \equiv m_q \pmod{q}, m≡mp(modp)m \equiv m_p \pmod{p}, 0≤m≤(q−1)+q(p−1)=n−10 \leq m \leq (q - 1) + q(p - 1) = n - 1 なので、中国剰余定理(同 定理 1.28)の一意性より m=cd mod nm = c^d \bmod n。□\square

ℓ(n)=k\ell(n) = k で dd がランダムな kk ビットの数なら、定理 1.5 の乗算は約 1.5k1.5k 回、1 回あたり Ck2Ck^2 程度で全体で約 1.5Ck31.5Ck^3。命題 1.9 では法も指数も約 k/2k/2 ビットの冪剰余 2 回で約 2⋅1.5C(k/2)3=0.375Ck32 \cdot 1.5C(k/2)^3 = 0.375Ck^3 となり、筆算の評価で約 4 倍速い。多くの RSA の実装はこの方法を使っている。

例 1.10 n=3233=61⋅53n = 3233 = 61 \cdot 53, d=2753d = 2753(例 1.8), c=2790c = 2790 とする。dp=2753 mod 60=53d_p = 2753 \bmod 60 = 53, dq=2753 mod 52=49d_q = 2753 \bmod 52 = 49、c mod 61=45c \bmod 61 = 45, c mod 53=34c \bmod 53 = 34 から mp=4553 mod 61=4m_p = 45^{53} \bmod 61 = 4, mq=3449 mod 53=12m_q = 34^{49} \bmod 53 = 12。53−1 mod 61=3853^{-1} \bmod 61 = 38 より h=(4−12)⋅38 mod 61=1h = (4 - 12) \cdot 38 \bmod 61 = 1 で、m=12+53=65m = 12 + 53 = 65。実際 6517≡2790(mod3233)65^{17} \equiv 2790 \pmod{3233} である(第2章の RSA の例)。

注意

命題 1.9 で RSA 署名 s=md mod ns = m^d \bmod n を計算するとき、誤動作で mpm_p だけが誤ると、誤った署名 s′s' は s′e≡m(modq)s'^e \equiv m \pmod{q} をみたすが (modp)\pmod{p} ではみたさないので、gcd⁡(s′e−m,n)=q\gcd(s'^e - m, n) = q から nn が素因数分解される(1997 年にボネー・デミロ・リプトンが指摘した故障利用攻撃)。出力前に se≡ms^e \equiv m を検算する必要がある(問題 1.6)。

1.5 素数の分布

RSA の鍵には、たとえば 1024 ビットの素数が 2 つ必要である。xx 以下の素数の個数を π(x)\pi(x) と書く。

定理 1.11(素数定理, prime number theorem)lim⁡x→∞π(x)x/log⁡x=1\displaystyle\lim_{x \to \infty} \frac{\pi(x)}{x/\log x} = 1(log⁡\log は自然対数)。

1896 年にアダマールとド・ラ・ヴァレ・プーサンが独立に証明した(本教材では05-complex-analysis 第8章の定理 8.8)。実際の値(PARI/GP で計算)と比べると、比はゆっくり 11 に近づく。

xx π(x)\pi(x) x/log⁡xx/\log x 比
10610^6 7849878498 72382.472382.4 1.0841.084
10910^9 5084753450847534 48254942.448254942.4 1.0541.054

kk ビットの整数 2k−12^{k-1} 個のうち素数は π(2k)−π(2k−1)\pi(2^k) - \pi(2^{k-1}) 個である。π(x)≈x/log⁡x\pi(x) \approx x/\log x を代入すると

π(2k)−π(2k−1)2k−1≈2klog⁡2−1(k−1)log⁡2=k−2k(k−1)log⁡2≈1klog⁡2\frac{\pi(2^k) - \pi(2^{k-1})}{2^{k-1}} \approx \frac{2}{k\log 2} - \frac{1}{(k - 1)\log 2} = \frac{k - 2}{k(k-1)\log 2} \approx \frac{1}{k \log 2}

となる。素数定理は極限の主張なので、これは定理ではなく目安だが、実際とよく合う(k=32k = 32 では素数は 9818265698182656 個で割合は 1/21.871/21.87、目安は 1/22.181/22.18)。目安によれば 1024 ビットの奇数の約 1/3551/355 が素数であり、ランダムに試せばすぐに見つかる。

1.6 フェルマーテストとカーマイケル数

nn が素数なら、nn と互いに素なすべての aa で an−1≡1(modn)a^{n-1} \equiv 1 \pmod{n} である。したがって an−1≢1(modn)a^{n-1} \not\equiv 1 \pmod n となる aa が見つかれば、素因数を見つけないまま nn は合成数だと確定する(フェルマーテスト)。

定義 1.12(フェルマーの証人と偽証人)n≥3n \geq 3 を奇数、a∈{1,…,n−1}a \in \lbrace 1, \dots, n - 1 \rbrace とする。an−1≢1(modn)a^{n-1} \not\equiv 1 \pmod{n} のとき aa をフェルマーの証人 (Fermat witness) という。nn が合成数で an−1≡1(modn)a^{n-1} \equiv 1 \pmod{n} のとき、aa をフェルマーの偽証人 (Fermat liar)、nn を底 aa の擬素数 (pseudoprime) という。

例 1.13 341=11⋅31341 = 11 \cdot 31 は、210=1024=3⋅341+12^{10} = 1024 = 3 \cdot 341 + 1 より 2340=(210)34≡1(mod341)2^{340} = (2^{10})^{34} \equiv 1 \pmod{341} をみたし、底 22 の擬素数である(底 22 の擬素数の中で最小)。一方 3340≡56(mod341)3^{340} \equiv 56 \pmod{341} なので、33 は証人である。

命題 1.14 n≥3n \geq 3 を奇数の合成数とし、F={a∈(Z/nZ)×∣an−1=1}F = \lbrace a \in (\mathbb{Z}/n\mathbb{Z})^\times \mid a^{n-1} = 1 \rbrace とおく。FF は (Z/nZ)×(\mathbb{Z}/n\mathbb{Z})^\times の部分群で、フェルマーの偽証人の全体と一致する。F≠(Z/nZ)×F \neq (\mathbb{Z}/n\mathbb{Z})^\times ならば偽証人は φ(n)/2\varphi(n)/2 個以下である。

証明. a↦an−1a \mapsto a^{n-1} は可換群 (Z/nZ)×(\mathbb{Z}/n\mathbb{Z})^\times の準同型なので、その核 FF は部分群である。an−1≡1a^{n-1} \equiv 1 なら aa は逆元 an−2a^{n-2} をもつので、偽証人は単元に限り、FF に一致する。FF が真部分群なら、ラグランジュの定理(04-algebra 第2章 定理 2.29)より ∣F∣\lvert F \rvert は φ(n)\varphi(n) の真の約数なので φ(n)/2\varphi(n)/2 以下である。□\square

定義 1.15(カーマイケル数, Carmichael number)偽証人が単元のすべてになる合成数、すなわち合成数 nn で、nn と互いに素なすべての整数 aa について an−1≡1(modn)a^{n-1} \equiv 1 \pmod{n} が成り立つものをカーマイケル数という。

561=3⋅11⋅17561 = 3 \cdot 11 \cdot 17 はカーマイケル数である(04-algebra 第1章 注意 1.37)。

定理 1.16(コルセルトの判定法, Korselt's criterion)合成数 nn がカーマイケル数であるための必要十分条件は、nn が平方因子をもたず(どの素数 pp についても p2∤np^2 \nmid n)、nn の各素因数 pp について p−1∣n−1p - 1 \mid n - 1 となることである。

証明. 十分性:gcd⁡(a,n)=1\gcd(a, n) = 1 とする。nn の各素因数 pp について、フェルマーの小定理と p−1∣n−1p - 1 \mid n - 1 より an−1≡1(modp)a^{n-1} \equiv 1 \pmod{p}。nn は相異なる素数の積なので、中国剰余定理より an−1≡1(modn)a^{n-1} \equiv 1 \pmod{n}。

必要性:nn をカーマイケル数とする。p2∣np^2 \mid n となる素数 pp があったとし、a=1+n/pa = 1 + n/p とおく。nn の素因数はすべて n/pn/p を割るので gcd⁡(a,n)=1\gcd(a, n) = 1。また (n/p)2=n⋅(n/p2)(n/p)^2 = n \cdot (n/p^2) は nn の倍数なので、二項展開により an−1≡1+(n−1)n/p(modn)a^{n-1} \equiv 1 + (n - 1)n/p \pmod{n}。これが 11 と合同なら n∣(n−1)n/pn \mid (n - 1)n/p、すなわち p∣n−1p \mid n - 1 となるが、p∣np \mid n なので不可能である。よって nn は平方因子をもたない。次に pp を nn の素因数、gg を法 pp の原始根(04-algebra 第1章 定理 1.44)とする。pp と n/pn/p は互いに素なので、中国剰余定理により a≡g(modp)a \equiv g \pmod{p}, a≡1(modn/p)a \equiv 1 \pmod{n/p} となる aa がとれる。すると an−1≡1(modn)a^{n-1} \equiv 1 \pmod{n} より gn−1≡1(modp)g^{n-1} \equiv 1 \pmod{p} で、gg の位数は p−1p - 1 なので p−1∣n−1p - 1 \mid n - 1(同 命題 1.40)。□\square

系 1.17 カーマイケル数は奇数であり、相異なる素因数を少なくとも 3 個もつ。

証明. カーマイケル数 nn は平方因子をもたない合成数なので、相異なる 2 個以上の素数の積である。nn が偶数なら奇素因数 pp をもち、偶数 p−1p - 1 が奇数 n−1n - 1 を割ることになり矛盾する。n=pqn = pq(p<qp < q)なら、n−1=p(q−1)+(p−1)n - 1 = p(q - 1) + (p - 1) より q−1∣p−1q - 1 \mid p - 1 だが、0<p−1<q−10 < p - 1 < q - 1 なので矛盾する。□\square

例 1.18 1105=5⋅13⋅171105 = 5 \cdot 13 \cdot 17(11041104 は 4,12,164, 12, 16 の倍数)、1729=7⋅13⋅191729 = 7 \cdot 13 \cdot 19(17281728 は 6,12,186, 12, 18 の倍数)もカーマイケル数である。計算機で調べると、10410^4 未満のカーマイケル数は 561,1105,1729,2465,2821,6601,8911561, 1105, 1729, 2465, 2821, 6601, 8911 の 7 個、10610^6 未満では 43 個である。数は少ないが無限に存在する(アルフォード・グランヴィル・ポメランス、1994 年。主張のみ)。

カーマイケル数をフェルマーテストで見抜けるのは nn と互いに素でない aa を引いたときだけである。その確率は 1−φ(n)/n1 - \varphi(n)/n 未満で、素因数がどれも大きければきわめて小さい。

1.7 ミラー–ラビン法

フェルマーテストを強化する鍵は、「法が素数なら 11 の平方根は ±1\pm 1 しかない」という事実である。

補題 1.19(1 の非自明な平方根)n≥3n \geq 3, x2≡1(modn)x^2 \equiv 1 \pmod{n}, x≢±1(modn)x \not\equiv \pm 1 \pmod{n} ならば、gcd⁡(x−1,n)\gcd(x - 1, n) は nn の 11 でも nn でもない約数である。特に nn が素数なら、x2≡1(modn)x^2 \equiv 1 \pmod{n} の解は x≡±1x \equiv \pm 1 に限る。

証明. n∣(x−1)(x+1)n \mid (x - 1)(x + 1) である。gcd⁡(x−1,n)=n\gcd(x - 1, n) = n なら x≡1x \equiv 1。gcd⁡(x−1,n)=1\gcd(x - 1, n) = 1 なら04-algebra 第1章の命題 1.9 より n∣x+1n \mid x + 1 で x≡−1x \equiv -1。いずれも仮定に反する。素数 nn の正の約数は 11 と nn だけなので、後半も従う。□\square

以下、n≥3n \geq 3 を奇数とし、n−1=2stn - 1 = 2^s t(s≥1s \geq 1, tt は奇数)と書く。

定義 1.20(強い証人と強い偽証人)a∈{1,…,n−1}a \in \lbrace 1, \dots, n - 1 \rbrace が

at≡1(modn)またはa2it≡−1(modn)  (ある 0≤i≤s−1)a^t \equiv 1 \pmod{n} \quad \text{または} \quad a^{2^i t} \equiv -1 \pmod{n}\ \ (\text{ある}\ 0 \leq i \leq s - 1)

をみたすとき、aa は nn の強い検定に合格するという。合格しない aa を強い証人 (strong witness) という。nn が合成数で aa が合格するとき、aa を強い偽証人 (strong liar)、nn を底 aa の強擬素数 (strong pseudoprime) という。

命題 1.21 nn が奇素数なら、すべての a∈{1,…,n−1}a \in \lbrace 1, \dots, n - 1 \rbrace は強い検定に合格する。したがって強い証人が 1 つでもあれば nn は合成数である。

証明. 列 at,a2t,…,a2st=an−1a^t, a^{2t}, \dots, a^{2^s t} = a^{n-1} の最後の項はフェルマーの小定理より 11 と合同である。at≢1a^t \not\equiv 1 なら、a2jt≡1a^{2^j t} \equiv 1 となる最小の jj(1≤j≤s1 \leq j \leq s)について x=a2j−1tx = a^{2^{j-1}t} は x2≡1x^2 \equiv 1, x≢1x \not\equiv 1 をみたすので、補題 1.19 より x≡−1x \equiv -1 であり、i=j−1i = j - 1 として合格する。□\square

例 1.22 (1) n=561n = 561, a=2a = 2 のとき、560=24⋅35560 = 2^4 \cdot 35 で、例 1.6 の表から列 235,270,2140,22802^{35}, 2^{70}, 2^{140}, 2^{280} は 263,166,67,1263, 166, 67, 1 である。672≡167^2 \equiv 1 だが 67≢±167 \not\equiv \pm 1 なので 22 は強い証人であり、フェルマーテストでは見抜けなかったカーマイケル数が同じ計算の途中経過から見抜けた。補題 1.19 より約数 gcd⁡(66,561)=33\gcd(66, 561) = 33 まで得られる。(2) n=2047=23⋅89n = 2047 = 23 \cdot 89 のとき、2046=2⋅10232046 = 2 \cdot 1023 で、211=2048≡12^{11} = 2048 \equiv 1 より 21023=(211)93≡12^{1023} = (2^{11})^{93} \equiv 1 なので、22 は強い偽証人である。これは底 22 の強擬素数の中で最小で、底を固定した判定はだまされうる。

ミラー–ラビン法(Miller–Rabin test) ミラー(1976 年)が一般化リーマン予想のもとで考えた決定的な判定法を、ラビン(1980 年)が底をランダムに選ぶ確率的な判定法に作り替えたものである。入力は奇数 n≥5n \geq 5 と反復回数 rr。{2,…,n−2}\lbrace 2, \dots, n - 2 \rbrace から aa を一様ランダムに選んで強い検定を行うことを rr 回繰り返し、一度でも強い証人が出れば「合成数」、出なければ「おそらく素数」と出力する。

1 回の検定は定理 1.5 より O(ℓ(n)3)O(\ell(n)^3) でできる。命題 1.21 より素数が「合成数」と判定されることはなく、合成数を誤る確率は次の定理で抑えられる。

定理 1.23(ラビン, モニエ, 1980 年)nn を奇数の合成数とする。nn の強い偽証人の個数は、n≠9n \neq 9 なら φ(n)/4\varphi(n)/4 以下であり、n=9n = 9 を含めてつねに (n−1)/4(n - 1)/4 以下である。

証明. G=(Z/nZ)×G = (\mathbb{Z}/n\mathbb{Z})^\times、強い偽証人の全体を LL とする。a∈La \in L なら 2 乗を繰り返して an−1≡1a^{n-1} \equiv 1 となるので、LL は命題 1.14 の部分群 FF に含まれる。

(i) n=pen = p^e(pp は奇素数、e≥2e \geq 2)の場合. 法 pp への還元 ρ ⁣:G→(Z/pZ)×\rho\colon G \to (\mathbb{Z}/p\mathbb{Z})^\times は全射準同型で、核 UU の位数は φ(pe)/(p−1)=pe−1\varphi(p^e)/(p - 1) = p^{e-1} である。a∈F∩Ua \in F \cap U の位数は pe−1p^e - 1 を割り(04-algebra 第2章 命題 2.19)、ラグランジュの定理より pe−1p^{e-1} も割るので、a=1a = 1。よって ρ\rho は FF 上で単射で、∣L∣≤∣F∣≤p−1=φ(n)/pe−1\lvert L \rvert \leq \lvert F \rvert \leq p - 1 = \varphi(n)/p^{e-1}。(p,e)≠(3,2)(p, e) \neq (3, 2) なら pe−1≥4p^{e-1} \geq 4 なので ∣L∣≤φ(n)/4\lvert L \rvert \leq \varphi(n)/4。また n−1≥p2−1=(p−1)(p+1)≥4(p−1)n - 1 \geq p^2 - 1 = (p - 1)(p + 1) \geq 4(p - 1) より、つねに ∣L∣≤(n−1)/4\lvert L \rvert \leq (n - 1)/4。

(ii) nn が相異なる k≥2k \geq 2 個の素因数をもつ場合. n=p1e1⋯pkekn = p_1^{e_1} \cdots p_k^{e_k} と書く。(−1)t=−1(-1)^t = -1 なので、b2it≡−1(modn)b^{2^i t} \equiv -1 \pmod{n} となる b∈Gb \in G と 0≤i≤s−10 \leq i \leq s - 1 は存在する。そのような ii の最大値を i0i_0、対応する bb を 1 つとり、M=2i0tM = 2^{i_0}t として、部分群

J={a∈G∣aM≡±1(modn)}⊂K={a∈G∣各 j で aM≡±1(modpjej)}J = \lbrace a \in G \mid a^M \equiv \pm 1 \pmod{n} \rbrace \subset K = \lbrace a \in G \mid \text{各}\ j\ \text{で}\ a^M \equiv \pm 1 \pmod{p_j^{e_j}} \rbrace

を考える(KK の符号は jj ごとに異なってよい)。

第 1 段(L⊂JL \subset J)。a∈La \in L とする。at≡1a^t \equiv 1 なら aM≡1a^M \equiv 1。a2it≡−1a^{2^i t} \equiv -1 なら i0i_0 の最大性より i≤i0i \leq i_0 で、aM=(a2it)2i0−i≡±1a^M = (a^{2^i t})^{2^{i_0 - i}} \equiv \pm 1。

第 2 段([K:J]=2k−1[K : J] = 2^{k-1})。準同型 χ ⁣:K→{±1}k\chi\colon K \to \lbrace \pm 1 \rbrace^k, a↦(aM mod pjej)ja \mapsto (a^M \bmod p_j^{e_j})_j を考える。符号の組を任意に与え、中国剰余定理で、符号が −1-1 の jj では a≡ba \equiv b、+1+1 の jj では a≡1(modpjej)a \equiv 1 \pmod{p_j^{e_j}} となる a∈Ga \in G をとれば、χ(a)\chi(a) はその組になるので、χ\chi は全射である。pjp_j は奇数なので 1≢−1(modpjej)1 \not\equiv -1 \pmod{p_j^{e_j}} であり、中国剰余定理より J=χ−1({(1,…,1),(−1,…,−1)})J = \chi^{-1}(\lbrace (1, \dots, 1), (-1, \dots, -1) \rbrace)。よって [K:J]=2k/2[K : J] = 2^k/2。

第 3 段([G:J]≥4[G : J] \geq 4)。k≥3k \geq 3 なら [K:J]≥4[K : J] \geq 4。k=2k = 2 とする。a∈Ka \in K なら a2M≡1(modn)a^{2M} \equiv 1 \pmod{n} で、2M=2i0+1t2M = 2^{i_0 + 1}t は n−1n - 1 を割るので a∈Fa \in F、つまり K⊂FK \subset F。系 1.17 より nn はカーマイケル数でないので F≠GF \neq G で、[G:K]≥[G:F]≥2[G : K] \geq [G : F] \geq 2。よって [G:J]=[G:K][K:J]≥4[G : J] = [G : K][K : J] \geq 4。

以上より ∣L∣≤∣J∣≤φ(n)/4≤(n−1)/4\lvert L \rvert \leq \lvert J \rvert \leq \varphi(n)/4 \leq (n - 1)/4。□\square

n=9n = 9 の強い偽証人は 1,81, 8 の 2 個で、φ(9)/4\varphi(9)/4 を超えるが (9−1)/4(9 - 1)/4 に等しい。n=15,91n = 15, 91 では強い偽証人がちょうど φ(n)/4\varphi(n)/4 個あり、1/41/4 は改良できない。

系 1.24 奇数の合成数 nn に対し、ミラー–ラビン法が「おそらく素数」と出力する確率は 4−r4^{-r} 以下である。

証明. 11 と n−1n - 1 はつねに強い偽証人である((−1)t=−1(-1)^t = -1)。定理 1.23 より {2,…,n−2}\lbrace 2, \dots, n - 2 \rbrace の中の強い偽証人は (n−1)/4−2=(n−9)/4(n - 1)/4 - 2 = (n - 9)/4 個以下なので、1 回で偽証人を引く確率は (n−9)/(4(n−3))<1/4(n - 9)/(4(n - 3)) < 1/4。rr 回の選択は独立なので、すべて偽証人である確率は 4−r4^{-r} 未満である。□\square

計算機で総当たりすると、カーマイケル数 561,1105,1729561, 1105, 1729 のフェルマーの偽証人は単元のすべて(320,768,1296320, 768, 1296 個)だが、強い偽証人は 10,30,16210, 30, 162 個しかない。

注意

系 1.24 の 4−r4^{-r} は「合成数 nn を固定したとき、それを素数と誤判定する確率」であり、「おそらく素数と判定された数が合成数である確率」ではない。後者は判定にかける数の分布によるので、ベイズの定理で考える。ランダムな 1024 ビットの奇数は約 1/3551/355 しか素数でないので、系 1.24 から言えるのは「判定を通った数が合成数である確率は 354⋅4−r354 \cdot 4^{-r} 程度以下」までである(問題 1.5)。

補足

一般化リーマン予想を仮定すれば、2≤a≤2(log⁡n)22 \leq a \leq 2(\log n)^2 の底をすべて試す決定的な多項式時間の判定ができる(底を O((log⁡n)2)O((\log n)^2) 個に限れることはミラーが示し、定数 22 はバッハによる)。仮定なしでも決定的多項式時間の AKS 法(アグラワル・カヤル・サクセナ。2002 年に発表、論文は 2004 年)があるが、実用上はミラー–ラビン法やその変形が使われる。

1.8 素数の生成

kk ビットの素数は次のように生成できる:(1) 最上位ビットと最下位ビットを 11 にした kk ビットの奇数 nn をランダムに選ぶ。(2) 10001000 未満の奇素数などの小さい素数で割り切れれば (1) に戻る。(3) ミラー–ラビン法を rr 回行い、「合成数」なら (1) に戻り、「おそらく素数」なら nn を出力する。

1.5 節の目安によれば、ランダムな kk ビットの奇数が素数である確率は約 2/(klog⁡2)2/(k\log 2) なので、候補の個数の期待値は約 (klog⁡2)/2(k\log 2)/2、k=1024k = 1024 なら約 355355 である。合成数の候補はほとんど (2) か 1 回目の検定(系 1.24)で除かれるので、手間は目安として検定 O(k)O(k) 回分、O(k4)O(k^4) 回のビット演算程度である。この手順(r=40r = 40)を Python で実装し、種を固定した擬似乱数で 1024 ビットの素数を 100 個生成すると、候補数の平均は 390.7390.7 だった(平均の揺らぎは約 3535 なので、目安と合っている)。

1.9 乱数の重要性

上の実験では再現のため種を固定したが、鍵の生成でこれをしてはいけない。種(たとえば時刻)を推測されれば、同じ素数を作り直される。

統計的な「乱数らしさ」と、暗号に必要な「予測できなさ」は別物である。Python の random モジュールのメルセンヌ・ツイスターは統計的には優れているが、連続する 624 個の 32 ビット出力から内部状態が復元でき、以降の出力を予測できる。暗号には、過去の出力から次の出力を効率的に予測できない暗号論的擬似乱数生成器 (CSPRNG) を使う。Python では secrets モジュールがそれにあたる。乱数の質の低さは実際に事故を起こしてきた。

  • 2008 年に、Debian 系の Linux の OpenSSL の改変(2006 年に混入)で、鍵生成の乱数の種にプロセス ID(アーキテクチャごとに高々 32767 通り)しか反映されていなかったことが発覚した。その期間の鍵は、候補の列挙で破れた。
  • 2012 年に 2 つの研究グループが、インターネット上の大量の RSA 公開鍵の法どうしの最大公約数を計算し、素因数を共有する鍵が少なからずあることを報告した。起動直後で乱数の種が乏しい組み込み機器が、同じ素数を生成していた(問題 1.7)。

ヒント

実務では 鍵・素数・ナンス(使い捨ての乱数)は、OS の乱数源を使う CSPRNG で、実績のある暗号ライブラリを通して生成する。時刻やプロセス ID を種にしない。組み込み機器では、起動直後のエントロピー(予測できなさの量)が足りないうちに鍵を作らない。素数判定や鍵生成は自作しないのが原則である。RSA の素数の生成手順は FIPS 186-5(米国のデジタル署名の規格)などにも定められている。

まとめ

  • 計算の手間は入力のビット長で測る。nn に比例する試し割りは指数時間である。
  • 冪剰余は反復二乗法で乗算 2(ℓ(e)−1)2(\ell(e) - 1) 回以下、O(ℓ(e)ℓ(n)2)O(\ell(e)\ell(n)^2) で計算できる。拡張ユークリッドの互除法は O(ℓ(a)2)O(\ell(a)^2) で逆元を求める。
  • n=pqn = pq の素因数を知っていれば、中国剰余定理で冪剰余を約 4 倍速くできる。故障した結果は素因数分解につながるので検算が要る。
  • 素数定理により、kk ビットの整数のおよそ 1/(klog⁡2)1/(k\log 2) が素数である(目安)。フェルマーテストはカーマイケル数(平方因子をもたず、すべての素因数 pp で p−1∣n−1p - 1 \mid n - 1 となる合成数)を見抜けない。
  • 奇数の合成数の強い偽証人は (n−1)/4(n - 1)/4 以下(n≠9n \neq 9 なら φ(n)/4\varphi(n)/4 以下)なので、ミラー–ラビン法の誤り確率は 4−r4^{-r} 以下である(合成数を固定したときの確率)。
  • 素数はランダムな奇数を判定して生成する。乱数には暗号論的擬似乱数生成器を使う。

演習問題

問題 1.1 ★ 反復二乗法で 7100 mod 2217^{100} \bmod 221 を計算し、2 乗と乗算の回数が定理 1.5 のとおりであることを確かめよ。また 221=13⋅17221 = 13 \cdot 17 と中国剰余定理で検算せよ。

解答

100=(1100100)2100 = (1100100)_2 で ℓ(100)=7\ell(100) = 7, w(100)=3w(100) = 3 なので、2 乗 6 回と乗算 2 回である。指数 Ei=1,3,6,12,25,50,100E_i = 1, 3, 6, 12, 25, 50, 100 に対し、7Ei mod 2217^{E_i} \bmod 221 は 7,122,77,183,163,49,1917, 122, 77, 183, 163, 49, 191 と変わる(49⋅7=343≡12249 \cdot 7 = 343 \equiv 122、1222=14884≡77122^2 = 14884 \equiv 77、772=5929≡18377^2 = 5929 \equiv 183、1832≡118183^2 \equiv 118, 118⋅7=826≡163118 \cdot 7 = 826 \equiv 163、1632≡49163^2 \equiv 49、492=2401≡19149^2 = 2401 \equiv 191)。よって 7100≡1917^{100} \equiv 191。検算:法 1313 では 712≡17^{12} \equiv 1 より 7100≡74=2401≡97^{100} \equiv 7^4 = 2401 \equiv 9、法 1717 では 716≡17^{16} \equiv 1 より 7100≡74≡47^{100} \equiv 7^4 \equiv 4。x=4+17y≡9(mod13)x = 4 + 17y \equiv 9 \pmod{13} から 4y≡54y \equiv 5、y≡5⋅10≡11y \equiv 5 \cdot 10 \equiv 11 で x=191x = 191。一致する。

問題 1.2 ★★(モンゴメリー・ラダー)e=(eL−1⋯e0)2e = (e_{L-1} \cdots e_0)_2(eL−1=1e_{L-1} = 1)とする。R0=aR_0 = a, R1=a2 mod nR_1 = a^2 \bmod n から始め、i=L−2,…,0i = L - 2, \dots, 0 の順に、ei=0e_i = 0 なら (R0,R1)←(R02,R0R1)(R_0, R_1) \leftarrow (R_0^2, R_0R_1)、ei=1e_i = 1 なら (R0,R1)←(R0R1,R12)(R_0, R_1) \leftarrow (R_0R_1, R_1^2)( mod n\bmod n)と更新する。最後の R0R_0 が ae mod na^e \bmod n であることを示し、この方法が反復二乗法よりサイドチャネル攻撃に強い理由を述べよ。

解答

Ei=⌊e/2i⌋E_i = \lfloor e/2^i \rfloor とし、添字 ii の処理後に R0≡aEiR_0 \equiv a^{E_i}, R1≡aEi+1R_1 \equiv a^{E_i + 1} となることを示す。最初は EL−1=1E_{L-1} = 1 で成り立つ。添字 i+1i + 1 で成り立つとき、ei=0e_i = 0 なら Ei=2Ei+1E_i = 2E_{i+1} で R02≡aEiR_0^2 \equiv a^{E_i}, R0R1≡a2Ei+1+1=aEi+1R_0R_1 \equiv a^{2E_{i+1} + 1} = a^{E_i + 1}。ei=1e_i = 1 なら Ei=2Ei+1+1E_i = 2E_{i+1} + 1 で R0R1≡aEiR_0R_1 \equiv a^{E_i}, R12≡a2Ei+1+2=aEi+1R_1^2 \equiv a^{2E_{i+1} + 2} = a^{E_i + 1}。よって最後に R0≡aE0=aeR_0 \equiv a^{E_0} = a^e。

どのビットでも乗算 1 回と 2 乗 1 回を行うので、演算の回数と種類の並びが秘密のビットに依存しない(ただし、使うレジスタの入れ替えも分岐やメモリアクセスの違いとして漏れないように実装する必要がある)。

問題 1.3 ★★ 6k+16k + 1, 12k+112k + 1, 18k+118k + 1 がすべて素数ならば、その積はカーマイケル数であることを示せ。k=1k = 1 では何が得られるか。

解答

3 つの素数は相異なるので、積 nn は平方因子をもたない合成数である。n=1296k3+396k2+36k+1n = 1296k^3 + 396k^2 + 36k + 1 より n−1=36k(36k2+11k+1)n - 1 = 36k(36k^2 + 11k + 1) で、36k36k は 6k6k, 12k12k, 18k18k の倍数なので、定理 1.16 より nn はカーマイケル数である。k=1k = 1 では 7,13,197, 13, 19 が素数で、n=1729n = 1729 を得る。

問題 1.4 ★★ n=1105n = 1105, a=2a = 2 でミラー–ラビン法の検定を行い、22 が強い証人であることを確かめよ。さらに、途中で得られる数から 11051105 の約数を求めよ。

解答

1104=24⋅691104 = 2^4 \cdot 69 なので s=4s = 4, t=69t = 69。反復二乗法で 269≡967(mod1105)2^{69} \equiv 967 \pmod{1105} で、2 乗を繰り返すと 9672≡259967^2 \equiv 259、2592=67081≡781259^2 = 67081 \equiv 781、7812=609961=552⋅1105+1781^2 = 609961 = 552 \cdot 1105 + 1 である。列 967,259,781,1967, 259, 781, 1 に −1≡1104-1 \equiv 1104 は現れず 2t≢12^t \not\equiv 1 なので、22 は強い証人である。x=781x = 781 は 1 の非自明な平方根なので、補題 1.19 より gcd⁡(780,1105)=65\gcd(780, 1105) = 65 と gcd⁡(782,1105)=17\gcd(782, 1105) = 17 は非自明な約数である(1105=5⋅13⋅171105 = 5 \cdot 13 \cdot 17)。

問題 1.5 ★★ ランダムな 1024 ビットの奇数 nn にミラー–ラビン法を rr 回行う。nn が素数である確率を π0≈1/355\pi_0 \approx 1/355 とし、「おそらく素数」と判定されたという条件のもとで nn が合成数である確率は 4−r(1−π0)/π04^{-r}(1 - \pi_0)/\pi_0 以下であることを示して、r=5,10,40r = 5, 10, 40 での値を求めよ。「r=5r = 5 なら誤り確率は 4−5≈0.14^{-5} \approx 0.1 パーセント」という説明はどこが誤りか。

解答

AA を「nn が合成数」、BB を「rr 回とも合格」とする。系 1.24 よりどの合成数でも BB の確率は 4−r4^{-r} 以下なので P(B∣A)≤4−rP(B \mid A) \leq 4^{-r}。素数は必ず合格するので P(B)≥P(B∩Ac)=π0P(B) \geq P(B \cap A^c) = \pi_0。ベイズの定理より

P(A∣B)=P(B∣A)P(A)P(B)≤4−r(1−π0)π0P(A \mid B) = \frac{P(B \mid A)P(A)}{P(B)} \leq \frac{4^{-r}(1 - \pi_0)}{\pi_0}

(1−π0)/π0≈354(1 - \pi_0)/\pi_0 \approx 354 なので、上界は r=5r = 5 で約 0.350.35、r=10r = 10 で約 3.4×10−43.4 \times 10^{-4}、r=40r = 40 で約 2.9×10−222.9 \times 10^{-22}。4−r4^{-r} は合成数を固定したときの確率で、判定を通った数のうちの合成数の割合ではない。素数がまれなので、最悪の場合の評価だけでは、r=5r = 5 で「判定を通った数の 35 パーセントが合成数」という可能性すら排除できない。

問題 1.6 ★★(実装の危険)RSA の公開鍵 (n,e)=(3233,17)(n, e) = (3233, 17) の持ち主が、命題 1.9 の方法で m=65m = 65 の署名を計算したところ、装置の誤動作で誤った署名 s′=2602s' = 2602 が出力された(s′17≡1496(mod3233)s'^{17} \equiv 1496 \pmod{3233})。公開されている情報だけから nn を素因数分解せよ。また、この攻撃を防ぐにはどうすればよいか。

解答

gcd⁡(s′e−m,n)=gcd⁡(1431,3233)\gcd(s'^e - m, n) = \gcd(1431, 3233) を互除法で計算すると、3233=2⋅1431+3713233 = 2 \cdot 1431 + 371, 1431=3⋅371+3181431 = 3 \cdot 371 + 318, 371=318+53371 = 318 + 53, 318=6⋅53318 = 6 \cdot 53 より 5353。よって n=53⋅61n = 53 \cdot 61。正しい署名 s=588s = 588 と比べると s′≡s≡5(mod53)s' \equiv s \equiv 5 \pmod{53} だが s′≡40≢39≡s(mod61)s' \equiv 40 \not\equiv 39 \equiv s \pmod{61} で、法 6161 の成分だけが誤っているため、s′e−ms'^e - m は 5353 でだけ割り切れる。対策は、出力前に se≡m(modn)s^e \equiv m \pmod{n} を検算することである(ee が小さいので安い)。

問題 1.7 ★(乱数の事故)ある機器が作った 2 つの RSA の法 n1=2773n_1 = 2773, n2=3599n_2 = 3599 が公開されている。互除法で gcd⁡(n1,n2)\gcd(n_1, n_2) を計算して両方を素因数分解せよ。また、大量の公開鍵に対してこの攻撃が現実的である理由を説明せよ。

解答

3599=2773+8263599 = 2773 + 826, 2773=3⋅826+2952773 = 3 \cdot 826 + 295, 826=2⋅295+236826 = 2 \cdot 295 + 236, 295=236+59295 = 236 + 59, 236=4⋅59236 = 4 \cdot 59 より gcd⁡=59\gcd = 59 で、n1=47⋅59n_1 = 47 \cdot 59, n2=59⋅61n_2 = 59 \cdot 61。素因数分解は難しいが、gcd⁡\gcd は 2048 ビットの数でも互除法で一瞬で計算できる(定理 1.7)。数百万個の法があっても、積の木などを使えばすべての組の gcd⁡\gcd をまとめて効率よく計算できる。乱数の種が乏しい機器が同じ素数を生成すれば、素因数分解の困難さと無関係に鍵が破られる。

この章を読み終えたら

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

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