この 章の 目標
整数の 大きさを ビット長で 測り、四則演算・ユークリッドの 互除法・ 冪剰余が ビット長の 多項式時間で 計算できる ことを 証明できる
拡張ユークリッドの 互除法で 法 n n n の 逆元を 求め、中国剰余定理で RSA の 復号を 高速化できる
素数定理から、ランダムに 選んだ k k k ビットの 整数が 素数である 確率を 見積もれる
フェルマーテストの 限界を カーマイケル数と コルセルトの 判定法で 説明し、ミラー–ラビン法の 誤り 確率が 1 / 4 1/4 1/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)正の 整数 n n n の 2 進表示の 桁数 ℓ ( n ) = ⌊ log 2 n ⌋ + 1 \ell(n) = \lfloor \log_2 n \rfloor + 1 ℓ ( n ) = ⌊ log 2 n ⌋ + 1 を n n n の ビット長と いう。 ℓ ( n ) = k \ell(n) = k ℓ ( n ) = k 、すな わち 2 k − 1 ≤ n < 2 k 2^{k-1} \leq n < 2^k 2 k − 1 ≤ n < 2 k の とき、 n n n を k k k ビットの 整数と いう。
計算の 手間は ビット演算 (bit operation)、すな わち 1 ビットどうしの 論理演算の 回数で 測る(計算機が 64 ビット単位などで 処理する ことは 定数倍の 違いに すぎない)。 f ( k ) = O ( g ( k ) ) f(k) = O(g(k)) f ( k ) = O ( g ( k )) は、定数 C C C が あって 十分 大きい すべての k k k で f ( k ) ≤ C g ( k ) f(k) \leq Cg(k) f ( k ) ≤ C g ( k ) と なる ことを 表す。
定義 1.2 (多項式時間, polynomial time)整数を 入力と する アルゴリズムが 多項式時間であるとは、入力の ビット長の 和を L L L と する とき、ビット演算の 回数が O ( L c ) O(L^c) O ( L c ) と なる 定数 c c c が 存在する ことを いう。
例 1.3 (試し割り)n n n を 2 , 3 , … , ⌊ n ⌋ 2, 3, \dots, \lfloor \sqrt{n} \rfloor 2 , 3 , … , ⌊ n ⌋ で 順に 割って 素因数を 探す方法は、 n n n が 同じくらいの 大きさの 2 素数の 積なら 約 n ≈ 2 ℓ ( n ) / 2 \sqrt{n} \approx 2^{\ell(n)/2} n ≈ 2 ℓ ( n ) /2 回の 割り算を 要し、 ℓ ( n ) \ell(n) ℓ ( n ) の 指数関数である。 ℓ ( n ) = 2048 \ell(n) = 2048 ℓ ( n ) = 2048 なら 約 2 1024 ≈ 1.8 × 10 308 2^{1024} \approx 1.8 \times 10^{308} 2 1024 ≈ 1.8 × 1 0 308 回で、毎秒 10 18 10^{18} 1 0 18 回割れても 約 1.8 × 10 290 1.8 \times 10^{290} 1.8 × 1 0 290 秒かかる(宇宙の 年齢は 約 4 × 10 17 4 \times 10^{17} 4 × 1 0 17 秒)。
命題 1.4 (筆算の 計算量) a , b a, b a , b を 正の 整数、 k = ℓ ( a ) k = \ell(a) k = ℓ ( a ) , l = ℓ ( b ) l = \ell(b) l = ℓ ( b ) と する。
a + b a + b a + b と ∣ a − b ∣ \lvert a - b \rvert ∣ a − b ∣ は O ( max ( k , l ) ) O(\max(k, l)) O ( max ( k , l )) 回の ビット演算で 計算できる。
a b ab ab は O ( k l ) O(kl) O ( k l ) 回の ビット演算で 計算できる。
a ≥ b a \geq b a ≥ b の とき、 a = q b + r a = qb + r a = q b + r (0 ≤ r < b 0 \leq r < b 0 ≤ r < b )を みたす q , r q, r q , r は O ( l ⋅ ℓ ( q ) ) O(l \cdot \ell(q)) O ( l ⋅ ℓ ( q )) 回の ビット演算で 計算できる。
証明. 2 進の 筆算の 手順を 数える。(1) 下の 桁から 順に、その 桁と 繰り 上がり(繰り下がり)を 定数回の 論理演算で 求める。(2) k ≥ l k \geq l k ≥ l と して よい。 b = ∑ j b j 2 j b = \sum_j b_j 2^j b = ∑ j b j 2 j なら a b = ∑ b j = 1 2 j a ab = \sum_{b_j = 1} 2^j a ab = ∑ b j = 1 2 j a で、k + l k + l k + l ビット以下の 数を 高々 l l l 回足せば よいので、(1) より O ( l ( k + l ) ) = O ( k l ) O(l(k + l)) = O(kl) O ( l ( k + l )) = O ( k l ) 。(3) a < 2 k a < 2^k a < 2 k , b ≥ 2 l − 1 b \geq 2^{l-1} b ≥ 2 l − 1 より q < 2 k − l + 1 q < 2^{k-l+1} q < 2 k − l + 1 である。筆算の 割り算は q q q の ビットを 上から 1 つずつ、 l + 1 l + 1 l + 1 ビット以下の 数の 比較と 引き算で 決めるので、 O ( l ( k − l + 1 ) ) O(l(k - l + 1)) O ( l ( k − l + 1 )) 回で 済む。 k > l k > l k > l なら a / b > 2 k − 1 / 2 l a/b > 2^{k-1}/2^l a / b > 2 k − 1 / 2 l より ℓ ( q ) ≥ k − l \ell(q) \geq k - l ℓ ( q ) ≥ k − l で、q ≥ 1 q \geq 1 q ≥ 1 と 合わせて k − l + 1 ≤ 2 ℓ ( q ) k - l + 1 \leq 2\ell(q) k − l + 1 ≤ 2 ℓ ( q ) である。□ \square □
特に Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z の 積(積を n n n で 割った 余り)は O ( ℓ ( n ) 2 ) O(\ell(n)^2) O ( ℓ ( n ) 2 ) 回で 計算できる(カラツバ法など、より 速い 掛け算の 方法も ある)。
1.2 反復二乗法
RSA では a e m o d n a^e \bmod n a e mod n を 数千ビットの e , n e, n e , n で 計算する。 a a a を e − 1 e - 1 e − 1 回掛けるのでは 回数が 天文学的に なるが、指数を 2 進展開して 2 乗を 繰り返せば e e e の 桁数程度の 回数で 済む。
反復二乗法 (square-and-multiply) 入力は n ≥ 2 n \geq 2 n ≥ 2 , 0 ≤ a < n 0 \leq a < n 0 ≤ a < n , e ≥ 1 e \geq 1 e ≥ 1 で、e = ( e L − 1 ⋯ e 1 e 0 ) 2 e = (e_{L-1} \cdots e_1 e_0)_2 e = ( e L − 1 ⋯ e 1 e 0 ) 2 (L = ℓ ( e ) L = \ell(e) L = ℓ ( e ) , e L − 1 = 1 e_{L-1} = 1 e L − 1 = 1 )と する。 x ← a x \leftarrow a x ← a とし、i = L − 2 , … , 1 , 0 i = L - 2, \dots, 1, 0 i = L − 2 , … , 1 , 0 の 順に「 x ← x 2 m o d n x \leftarrow x^2 \bmod n x ← x 2 mod n とし、e i = 1 e_i = 1 e i = 1 ならさらに x ← x a m o d n x \leftarrow xa \bmod n x ← x a mod n と する」を 行って、最後の x x x を 出力する。
定理 1.5 (反復二乗法の 計算量)反復二乗法は a e m o d n a^e \bmod n a e mod n を 出力する。法 n n n での 乗算(2 乗を 含む)の 回数は ( ℓ ( e ) − 1 ) + ( w ( e ) − 1 ) ≤ 2 ( ℓ ( e ) − 1 ) (\ell(e) - 1) + (w(e) - 1) \leq 2(\ell(e) - 1) ( ℓ ( e ) − 1 ) + ( w ( e ) − 1 ) ≤ 2 ( ℓ ( e ) − 1 ) である(w ( e ) w(e) w ( e ) は e e e の 2 進表示の 1 1 1 の 個数)。ビット演算の 回数は O ( ℓ ( e ) ℓ ( n ) 2 ) O(\ell(e)\ell(n)^2) O ( ℓ ( e ) ℓ ( n ) 2 ) であり、特に 1 ≤ e < n 1 \leq e < n 1 ≤ e < n なら O ( ℓ ( n ) 3 ) O(\ell(n)^3) O ( ℓ ( n ) 3 ) である。
証明. E i = ⌊ e / 2 i ⌋ E_i = \lfloor e/2^i \rfloor E i = ⌊ e / 2 i ⌋ (上位の ビット e L − 1 ⋯ e i e_{L-1} \cdots e_i e L − 1 ⋯ e i が 表す数)と おくと、 E L − 1 = 1 E_{L-1} = 1 E L − 1 = 1 , E 0 = e E_0 = e E 0 = e , E i = 2 E i + 1 + e i E_i = 2E_{i+1} + e_i E i = 2 E i + 1 + e i である。添字 i i i の 処理後に x ≡ a E i ( m o d n ) x \equiv a^{E_i} \pmod{n} x ≡ a E i ( mod n ) と なる ことを i i i の 降順の 帰納法で 示す。最初は x = a = a E L − 1 x = a = a^{E_{L-1}} x = a = a E L − 1 で、添字 i + 1 i + 1 i + 1 で 成り立てば、添字 i i i の 処理後の x x x は ( a E i + 1 ) 2 a e i = a E i (a^{E_{i+1}})^2 a^{e_i} = a^{E_i} ( a E i + 1 ) 2 a e i = a E i と 合同である。よって 出力は a E 0 m o d n = a e m o d n a^{E_0} \bmod n = a^e \bmod n a E 0 mod n = a e mod n 。2 乗は L − 1 L - 1 L − 1 回、a a a を 掛けるのは i ≤ L − 2 i \leq L - 2 i ≤ L − 2 かつ e i = 1 e_i = 1 e i = 1 と なる w ( e ) − 1 w(e) - 1 w ( e ) − 1 回である。各乗算は n n n 未満の 2 数の 積と、 n 2 n^2 n 2 未満の 数の n n n に よる 割り算(商は n n n 未満)なので、命題 1.4 より O ( ℓ ( n ) 2 ) O(\ell(n)^2) O ( ℓ ( n ) 2 ) である。e < n e < n e < n なら ℓ ( e ) ≤ ℓ ( n ) \ell(e) \leq \ell(n) ℓ ( e ) ≤ ℓ ( n ) 。□ \square □
例 1.6 2 560 m o d 561 2^{560} \bmod 561 2 560 mod 561 を 計算する。 560 = ( 1000110000 ) 2 560 = (1000110000)_2 560 = ( 1000110000 ) 2 なので、2 乗 9 回と、2 2 2 を 掛ける 乗算 2 回で 済む。
ビット e i e_i e i
1 1 1
0 0 0
0 0 0
0 0 0
1 1 1
1 1 1
0 0 0
0 0 0
0 0 0
0 0 0
E i E_i E i
1 1 1
2 2 2
4 4 4
8 8 8
17 17 17
35 35 35
70 70 70
140 140 140
280 280 280
560 560 560
2 E i m o d 561 2^{E_i} \bmod 561 2 E i mod 561
2 2 2
4 4 4
16 16 16
256 256 256
359 359 359
263 263 263
166 166 166
67 67 67
1 1 1
1 1 1
たとえば 256 2 = 65536 ≡ 460 256^2 = 65536 \equiv 460 25 6 2 = 65536 ≡ 460 , 460 ⋅ 2 = 920 ≡ 359 460 \cdot 2 = 920 \equiv 359 460 ⋅ 2 = 920 ≡ 359 、67 2 = 4489 = 8 ⋅ 561 + 1 67^2 = 4489 = 8 \cdot 561 + 1 6 7 2 = 4489 = 8 ⋅ 561 + 1 である。よって 2 560 ≡ 1 ( m o d 561 ) 2^{560} \equiv 1 \pmod{561} 2 560 ≡ 1 ( mod 561 ) である(1.7 節で 再び使う)。
1 回の 乗算で 指数の 最大値は 高々 2 倍に しかならないので、 a e a^e a e には 少なくとも log 2 e \log_2 e log 2 e 回の 乗算が 要り、定理 1.5 の 回数は 最小の 2 倍以内である。RSA で よく 使われる e = 65537 = 2 16 + 1 e = 65537 = 2^{16} + 1 e = 65537 = 2 16 + 1 なら、2 乗 16 回と 乗算 1 回で 済む。
ヒント
実務では
反復二乗法を そのまま 実装すると、秘密の 指数の ビットが 1 1 1 の ところでだけ乗算が 増えるので、処理時間や 消費電力から ビットが 読み取られうる( サイドチャネル攻撃 。タイミング攻撃は 1996 年に P. Kocher が 示した)。暗号ライブラリは、ビットに よらず 同じ 順序で 演算する 方法(問題 1.2 の モンゴメリー・ラダーなど)や 乱数に よるかく 乱で 対策している。Python の pow に この 対策は ないので、秘密の 値の 計算に 流用しない。
1.3 拡張ユークリッドの 互除法
RSA の 鍵生成では 逆元 d = e − 1 m o d λ ( n ) d = e^{-1} \bmod \lambda(n) d = e − 1 mod λ ( n ) (第2章)を 計算する。 04-algebra 第1章 の 例 1.25 の 計算を、係数を 同時に 更新する 形に 整理して 計算量を 評価する。
拡張ユークリッドの 互除法 入力は a ≥ b ≥ 1 a \geq b \geq 1 a ≥ b ≥ 1 。r 0 = a r_0 = a r 0 = a , r 1 = b r_1 = b r 1 = b , ( s 0 , t 0 ) = ( 1 , 0 ) (s_0, t_0) = (1, 0) ( s 0 , t 0 ) = ( 1 , 0 ) , ( s 1 , t 1 ) = ( 0 , 1 ) (s_1, t_1) = (0, 1) ( s 1 , t 1 ) = ( 0 , 1 ) とし、i = 1 , 2 , … i = 1, 2, \dots i = 1 , 2 , … に ついて r i ≠ 0 r_i \neq 0 r i = 0 である間、q i = ⌊ r i − 1 / r i ⌋ q_i = \lfloor r_{i-1}/r_i \rfloor q i = ⌊ r i − 1 / r i ⌋ と して
r i + 1 = r i − 1 − q i r i , s i + 1 = s i − 1 − q i s i , t i + 1 = t i − 1 − q i t i r_{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 r i + 1 = r i − 1 − q i r i , s i + 1 = s i − 1 − q i s i , t i + 1 = t i − 1 − q i t i
と 定める。 r m + 1 = 0 r_{m+1} = 0 r m + 1 = 0 と なったら 止め、 ( r m , s m , t m ) (r_m, s_m, t_m) ( r m , s m , t m ) を 出力する( m m m は 割り算の 回数)。
定理 1.7 (拡張ユークリッドの 互除法, extended Euclidean algorithm) a ≥ b ≥ 1 a \geq b \geq 1 a ≥ b ≥ 1 と する。
0 ≤ i ≤ m + 1 0 \leq i \leq m + 1 0 ≤ i ≤ m + 1 で s i a + t i b = r i s_i a + t_i b = r_i s i a + t i b = r i であり、r m = gcd ( a , b ) r_m = \gcd(a, b) r m = g cd( a , b ) である。特に gcd ( a , b ) = 1 \gcd(a, b) = 1 g cd( a , b ) = 1 なら t m b ≡ 1 ( m o d a ) t_m b \equiv 1 \pmod{a} t m b ≡ 1 ( mod a ) 。
割り算の 回数は m ≤ 2 ⌊ log 2 b ⌋ + 1 m \leq 2\lfloor \log_2 b \rfloor + 1 m ≤ 2 ⌊ log 2 b ⌋ + 1 を みたす。
全体の ビット演算の 回数は O ( ℓ ( a ) 2 ) O(\ell(a)^2) O ( ℓ ( a ) 2 ) である。
証明. (1) i = 0 , 1 i = 0, 1 i = 0 , 1 では 定義から 成り立ち、 i − 1 i - 1 i − 1 と i i i で 成り立てば漸化式から i + 1 i + 1 i + 1 でも 成り立つ。 r m = gcd ( a , b ) r_m = \gcd(a, b) r m = g cd( a , b ) は 互除法の 正しさ( 04-algebra 第1章 補題 1.10)に よる。
(2) 1 ≤ i ≤ m 1 \leq i \leq m 1 ≤ i ≤ m の とき、 r i − 1 ≥ r i > r i + 1 r_{i-1} \geq r_i > r_{i+1} r i − 1 ≥ r i > r i + 1 より q i ≥ 1 q_i \geq 1 q i ≥ 1 で、r i − 1 = q i r i + r i + 1 > 2 r i + 1 r_{i-1} = q_i r_i + r_{i+1} > 2r_{i+1} r i − 1 = q i r i + r i + 1 > 2 r i + 1 。r 1 = b r_1 = b r 1 = b から 始めて これを 繰り返すと、 j ≥ 0 j \geq 0 j ≥ 0 に ついて r 2 j + 1 ≤ b / 2 j r_{2j+1} \leq b/2^j r 2 j + 1 ≤ b / 2 j である。m = 2 j + 1 m = 2j + 1 m = 2 j + 1 なら 1 ≤ r m ≤ b / 2 j 1 \leq r_m \leq b/2^j 1 ≤ r m ≤ b / 2 j 、m = 2 j m = 2j m = 2 j (j ≥ 1 j \geq 1 j ≥ 1 )なら 2 ≤ r 2 j − 1 ≤ b / 2 j − 1 2 \leq r_{2j-1} \leq b/2^{j-1} 2 ≤ r 2 j − 1 ≤ b / 2 j − 1 (r 2 j − 1 > r 2 j ≥ 1 r_{2j-1} > r_{2j} \geq 1 r 2 j − 1 > r 2 j ≥ 1 に よる)で、いずれも 2 j ≤ b 2^j \leq b 2 j ≤ b 、すな わち j ≤ ⌊ log 2 b ⌋ j \leq \lfloor \log_2 b \rfloor j ≤ ⌊ log 2 b ⌋ と なる。よって m ≤ 2 j + 1 ≤ 2 ⌊ log 2 b ⌋ + 1 m \leq 2j + 1 \leq 2\lfloor \log_2 b \rfloor + 1 m ≤ 2 j + 1 ≤ 2 ⌊ log 2 b ⌋ + 1 。
(3) まず 係数の 大きさを 抑える。 ∣ s i + 1 ∣ ≤ ∣ s i − 1 ∣ + q i ∣ s i ∣ ≤ ( q i + 1 ) max ( ∣ s i − 1 ∣ , ∣ s i ∣ ) \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) ∣ s i + 1 ∣ ≤ ∣ s i − 1 ∣ + q i ∣ s i ∣ ≤ ( q i + 1 ) max (∣ s i − 1 ∣ , ∣ s i ∣) と max ( ∣ s 0 ∣ , ∣ s 1 ∣ ) = 1 \max(\lvert s_0 \rvert, \lvert s_1 \rvert) = 1 max (∣ s 0 ∣ , ∣ s 1 ∣) = 1 から、帰納法で ∣ s i ∣ ≤ ∏ 1 ≤ j < i ( q j + 1 ) ≤ ∏ j = 1 m 2 q j \lvert s_i \rvert \leq \prod_{1 \leq j < i}(q_j + 1) \leq \prod_{j=1}^m 2q_j ∣ s i ∣ ≤ ∏ 1 ≤ j < i ( q j + 1 ) ≤ ∏ j = 1 m 2 q j を 得る( t t t も 同様)。 r i − 1 ≥ q i r i r_{i-1} \geq q_i r_i r i − 1 ≥ q i r i より ∏ i = 1 m q i ≤ ∏ i = 1 m r i − 1 / r i ≤ a \prod_{i=1}^m q_i \leq \prod_{i=1}^m r_{i-1}/r_i \leq a ∏ i = 1 m q i ≤ ∏ i = 1 m r i − 1 / r i ≤ a なので、∣ s i ∣ , ∣ t i ∣ ≤ 2 m a \lvert s_i \rvert, \lvert t_i \rvert \leq 2^m a ∣ s i ∣ , ∣ t i ∣ ≤ 2 m a 、すな わち係数の ビット長は m + ℓ ( a ) = O ( ℓ ( a ) ) m + \ell(a) = O(\ell(a)) m + ℓ ( a ) = O ( ℓ ( a )) 以下である。第 i i i 回の 計算(割り算、 q i s i q_i s_i q i s i と q i t i q_i t_i q i t i 、引き算)は 命題 1.4 より O ( ℓ ( a ) ( ℓ ( q i ) + 1 ) ) O(\ell(a)(\ell(q_i) + 1)) O ( ℓ ( a ) ( ℓ ( q i ) + 1 )) 回で できる。
∑ i = 1 m ( ℓ ( q i ) + 1 ) ≤ ∑ i = 1 m ( log 2 q i + 2 ) ≤ log 2 a + 2 m = 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)) i = 1 ∑ m ( ℓ ( q i ) + 1 ) ≤ i = 1 ∑ m ( log 2 q i + 2 ) ≤ log 2 a + 2 m = O ( ℓ ( a ))
(最後は (2) に よる)なので、全体で O ( ℓ ( a ) 2 ) O(\ell(a)^2) O ( ℓ ( a ) 2 ) である。□ \square □
例 1.8 17 17 17 の 法 3120 3120 3120 での 逆元を 求める( a = 3120 a = 3120 a = 3120 , b = 17 b = 17 b = 17 )。
i i i
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
r i r_i r i
3120 3120 3120
17 17 17
9 9 9
8 8 8
1 1 1
0 0 0
q i q_i q i
―
183 183 183
1 1 1
1 1 1
8 8 8
―
s i s_i s i
1 1 1
0 0 0
1 1 1
− 1 -1 − 1
2 2 2
− 17 -17 − 17
t i t_i t i
0 0 0
1 1 1
− 183 -183 − 183
184 184 184
− 367 -367 − 367
3120 3120 3120
m = 4 m = 4 m = 4 で、2 ⋅ 3120 − 367 ⋅ 17 = 1 2 \cdot 3120 - 367 \cdot 17 = 1 2 ⋅ 3120 − 367 ⋅ 17 = 1 より 17 − 1 ≡ − 367 ≡ 2753 ( m o d 3120 ) 17^{-1} \equiv -367 \equiv 2753 \pmod{3120} 1 7 − 1 ≡ − 367 ≡ 2753 ( mod 3120 ) 。3120 = ( 61 − 1 ) ( 53 − 1 ) 3120 = (61 - 1)(53 - 1) 3120 = ( 61 − 1 ) ( 53 − 1 ) なので、この 2753 2753 2753 は 第2章で RSA の 法 n = 61 ⋅ 53 = 3233 n = 61 \cdot 53 = 3233 n = 61 ⋅ 53 = 3233 の 秘密鍵と して 使う。
1.4 中国剰余定理に よる 高速化
秘密鍵の 持ち主は n = p q n = pq n = pq の 素因数を 知っているので、冪剰余を 半分の 大きさの 法での 2 つの 計算に 分けられる。
命題 1.9 (中国剰余定理に よる 冪剰余) p , q p, q p , q を 相異なる 奇素数、 n = p q n = pq n = pq とし、正の 整数 d d d は gcd ( d , p − 1 ) = gcd ( d , q − 1 ) = 1 \gcd(d, p - 1) = \gcd(d, q - 1) = 1 g cd( d , p − 1 ) = g cd( d , q − 1 ) = 1 を みたすと する。整数 c c c に 対し、 d p = d m o d ( p − 1 ) d_p = d \bmod (p - 1) d p = d mod ( p − 1 ) , d q = d m o d ( q − 1 ) d_q = d \bmod (q - 1) d q = d mod ( q − 1 ) , m p = c d p m o d p m_p = c^{d_p} \bmod p m p = c d p mod p , m q = c d q m o d q m_q = c^{d_q} \bmod q m q = c d q mod q , q ′ = q − 1 m o d p q' = q^{-1} \bmod p q ′ = q − 1 mod p , h = ( m p − m q ) q ′ m o d p h = (m_p - m_q)q' \bmod p h = ( m p − m q ) q ′ mod p と おき、 m = m q + q h m = m_q + qh m = m q + q h と する。この とき m = c d m o d n m = c^d \bmod n m = c d mod n である。
証明. p − 1 ≥ 2 p - 1 \geq 2 p − 1 ≥ 2 と gcd ( d , p − 1 ) = 1 \gcd(d, p - 1) = 1 g cd( d , p − 1 ) = 1 より p − 1 ∤ d p - 1 \nmid d p − 1 ∤ d なので d p ≥ 1 d_p \geq 1 d p ≥ 1 。p ∤ c p \nmid c p ∤ c なら、d = d p + j ( p − 1 ) d = d_p + j(p - 1) d = d p + j ( p − 1 ) と フェルマーの 小定理( 04-algebra 第1章 系 1.35)より c d ≡ c d p ( m o d p ) c^d \equiv c^{d_p} \pmod{p} c d ≡ c d p ( mod p ) 。p ∣ c p \mid c p ∣ c なら d , d p ≥ 1 d, d_p \geq 1 d , d p ≥ 1 より 両辺とも 0 0 0 と 合同。よって c d ≡ m p ( m o d p ) c^d \equiv m_p \pmod{p} c d ≡ m p ( mod p ) 、同様に c d ≡ m q ( m o d q ) c^d \equiv m_q \pmod{q} c d ≡ m q ( mod q ) 。一方 m ≡ m q ( m o d q ) m \equiv m_q \pmod{q} m ≡ m q ( mod q ) , m ≡ m p ( m o d p ) m \equiv m_p \pmod{p} m ≡ m p ( mod p ) , 0 ≤ m ≤ ( q − 1 ) + q ( p − 1 ) = n − 1 0 \leq m \leq (q - 1) + q(p - 1) = n - 1 0 ≤ m ≤ ( q − 1 ) + q ( p − 1 ) = n − 1 なので、中国剰余定理(同 定理 1.28)の 一意性より m = c d m o d n m = c^d \bmod n m = c d mod n 。□ \square □
ℓ ( n ) = k \ell(n) = k ℓ ( n ) = k で d d d が ランダムな k k k ビットの 数なら、定理 1.5 の 乗算は 約 1.5 k 1.5k 1.5 k 回、1 回あたり C k 2 Ck^2 C k 2 程度で 全体で 約 1.5 C k 3 1.5Ck^3 1.5 C k 3 。命題 1.9 では 法も 指数も 約 k / 2 k/2 k /2 ビットの 冪剰余 2 回で 約 2 ⋅ 1.5 C ( k / 2 ) 3 = 0.375 C k 3 2 \cdot 1.5C(k/2)^3 = 0.375Ck^3 2 ⋅ 1.5 C ( k /2 ) 3 = 0.375 C k 3 と なり、筆算の 評価で 約 4 倍速い。多くの RSA の 実装は この 方法を 使っている。
例 1.10 n = 3233 = 61 ⋅ 53 n = 3233 = 61 \cdot 53 n = 3233 = 61 ⋅ 53 , d = 2753 d = 2753 d = 2753 (例 1.8), c = 2790 c = 2790 c = 2790 と する。 d p = 2753 m o d 60 = 53 d_p = 2753 \bmod 60 = 53 d p = 2753 mod 60 = 53 , d q = 2753 m o d 52 = 49 d_q = 2753 \bmod 52 = 49 d q = 2753 mod 52 = 49 、c m o d 61 = 45 c \bmod 61 = 45 c mod 61 = 45 , c m o d 53 = 34 c \bmod 53 = 34 c mod 53 = 34 から m p = 45 53 m o d 61 = 4 m_p = 45^{53} \bmod 61 = 4 m p = 4 5 53 mod 61 = 4 , m q = 34 49 m o d 53 = 12 m_q = 34^{49} \bmod 53 = 12 m q = 3 4 49 mod 53 = 12 。53 − 1 m o d 61 = 38 53^{-1} \bmod 61 = 38 5 3 − 1 mod 61 = 38 より h = ( 4 − 12 ) ⋅ 38 m o d 61 = 1 h = (4 - 12) \cdot 38 \bmod 61 = 1 h = ( 4 − 12 ) ⋅ 38 mod 61 = 1 で、m = 12 + 53 = 65 m = 12 + 53 = 65 m = 12 + 53 = 65 。実際 65 17 ≡ 2790 ( m o d 3233 ) 65^{17} \equiv 2790 \pmod{3233} 6 5 17 ≡ 2790 ( mod 3233 ) である(第2章の RSA の 例)。
注意
命題 1.9 で RSA 署名 s = m d m o d n s = m^d \bmod n s = m d mod n を 計算する とき、誤動作で m p m_p m p だけが 誤ると、誤った 署名 s ′ s' s ′ は s ′ e ≡ m ( m o d q ) s'^e \equiv m \pmod{q} s ′ e ≡ m ( mod q ) を みたすが ( m o d p ) \pmod{p} ( mod p ) では みたさないので、 gcd ( s ′ e − m , n ) = q \gcd(s'^e - m, n) = q g cd( s ′ e − m , n ) = q から n n n が 素因数分解される(1997 年に ボネー・ デミロ・リプトンが 指摘した 故障利用攻撃)。出力前に s e ≡ m s^e \equiv m s e ≡ m を 検算する 必要が ある(問題 1.6)。
1.5 素数の 分布
RSA の 鍵には、たとえば 1024 ビットの 素数が 2 つ必要である。 x x x 以下の 素数の 個数を π ( x ) \pi(x) π ( 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 x → ∞ lim x / log x π ( x ) = 1 (log \log log は 自然対数)。
1896 年に アダマールと ド・ラ・ヴァレ・プーサンが 独立に 証明した(本教材では 05-complex-analysis 第8章の 定理 8.8)。実際の 値(PARI/GP で 計算)と 比べると、比は ゆっくり 1 1 1 に 近づく。
x x x
π ( x ) \pi(x) π ( x )
x / log x x/\log x x / log x
比
10 6 10^6 1 0 6
78498 78498 78498
72382.4 72382.4 72382.4
1.084 1.084 1.084
10 9 10^9 1 0 9
50847534 50847534 50847534
48254942.4 48254942.4 48254942.4
1.054 1.054 1.054
k k k ビットの 整数 2 k − 1 2^{k-1} 2 k − 1 個の うち素数は π ( 2 k ) − π ( 2 k − 1 ) \pi(2^k) - \pi(2^{k-1}) π ( 2 k ) − π ( 2 k − 1 ) 個である。π ( x ) ≈ x / log x \pi(x) \approx x/\log x π ( x ) ≈ x / log x を 代入すると
π ( 2 k ) − π ( 2 k − 1 ) 2 k − 1 ≈ 2 k log 2 − 1 ( k − 1 ) log 2 = k − 2 k ( k − 1 ) log 2 ≈ 1 k log 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} 2 k − 1 π ( 2 k ) − π ( 2 k − 1 ) ≈ k log 2 2 − ( k − 1 ) log 2 1 = k ( k − 1 ) log 2 k − 2 ≈ k log 2 1
と なる。素数定理は 極限の 主張なので、これは 定理ではなく 目安だが、実際と よく 合う( k = 32 k = 32 k = 32 では 素数は 98182656 98182656 98182656 個で 割合は 1 / 21.87 1/21.87 1/21.87 、目安は 1 / 22.18 1/22.18 1/22.18 )。目安に よれば 1024 ビットの 奇数の 約 1 / 355 1/355 1/355 が 素数であり、ランダムに 試せば すぐに 見つかる。
1.6 フェルマーテストと カーマイケル数
n n n が 素数なら、 n n n と 互いに 素な すべての a a a で a n − 1 ≡ 1 ( m o d n ) a^{n-1} \equiv 1 \pmod{n} a n − 1 ≡ 1 ( mod n ) である。したがって a n − 1 ≢ 1 ( m o d n ) a^{n-1} \not\equiv 1 \pmod n a n − 1 ≡ 1 ( mod n ) と なる a a a が 見つかれば、素因数を 見つけないまま n n n は 合成数だと 確定 する(フェルマーテスト )。
定義 1.12 (フェルマーの 証人と 偽証人) n ≥ 3 n \geq 3 n ≥ 3 を 奇数、 a ∈ { 1 , … , n − 1 } a \in \lbrace 1, \dots, n - 1 \rbrace a ∈ { 1 , … , n − 1 } と する。 a n − 1 ≢ 1 ( m o d n ) a^{n-1} \not\equiv 1 \pmod{n} a n − 1 ≡ 1 ( mod n ) の とき a a a を フェルマーの 証人 (Fermat witness) と いう。 n n n が 合成数で a n − 1 ≡ 1 ( m o d n ) a^{n-1} \equiv 1 \pmod{n} a n − 1 ≡ 1 ( mod n ) の とき、 a a a を フェルマーの 偽証人 (Fermat liar)、n n n を 底 a a a の 擬素数 (pseudoprime) と いう。
例 1.13 341 = 11 ⋅ 31 341 = 11 \cdot 31 341 = 11 ⋅ 31 は、2 10 = 1024 = 3 ⋅ 341 + 1 2^{10} = 1024 = 3 \cdot 341 + 1 2 10 = 1024 = 3 ⋅ 341 + 1 より 2 340 = ( 2 10 ) 34 ≡ 1 ( m o d 341 ) 2^{340} = (2^{10})^{34} \equiv 1 \pmod{341} 2 340 = ( 2 10 ) 34 ≡ 1 ( mod 341 ) を みたし、底 2 2 2 の 擬素数である(底 2 2 2 の 擬素数の 中で 最小)。一方 3 340 ≡ 56 ( m o d 341 ) 3^{340} \equiv 56 \pmod{341} 3 340 ≡ 56 ( mod 341 ) なので、3 3 3 は 証人である。
命題 1.14 n ≥ 3 n \geq 3 n ≥ 3 を 奇数の 合成数とし、 F = { a ∈ ( Z / n Z ) × ∣ a n − 1 = 1 } F = \lbrace a \in (\mathbb{Z}/n\mathbb{Z})^\times \mid a^{n-1} = 1 \rbrace F = { a ∈ ( Z / n Z ) × ∣ a n − 1 = 1 } と おく。 F F F は ( Z / n Z ) × (\mathbb{Z}/n\mathbb{Z})^\times ( Z / n Z ) × の 部分群で、フェルマーの 偽証人の 全体と 一致する。 F ≠ ( Z / n Z ) × F \neq (\mathbb{Z}/n\mathbb{Z})^\times F = ( Z / n Z ) × ならば 偽証人は φ ( n ) / 2 \varphi(n)/2 φ ( n ) /2 個以下である。
証明. a ↦ a n − 1 a \mapsto a^{n-1} a ↦ a n − 1 は 可換群 ( Z / n Z ) × (\mathbb{Z}/n\mathbb{Z})^\times ( Z / n Z ) × の 準同型なので、その 核 F F F は 部分群である。 a n − 1 ≡ 1 a^{n-1} \equiv 1 a n − 1 ≡ 1 なら a a a は 逆元 a n − 2 a^{n-2} a n − 2 を もつので、偽証人は 単元に 限り、 F F F に 一致する。 F F F が 真部分群なら、ラグランジュの 定理( 04-algebra 第2章 定理 2.29)より ∣ F ∣ \lvert F \rvert ∣ F ∣ は φ ( n ) \varphi(n) φ ( n ) の 真の 約数なので φ ( n ) / 2 \varphi(n)/2 φ ( n ) /2 以下である。□ \square □
定義 1.15 (カーマイケル数, Carmichael number)偽証人が 単元の すべてに なる合成数、すな わち合成数 n n n で、n n n と 互いに 素な すべての 整数 a a a に ついて a n − 1 ≡ 1 ( m o d n ) a^{n-1} \equiv 1 \pmod{n} a n − 1 ≡ 1 ( mod n ) が 成り立つものを カーマイケル数と いう。
561 = 3 ⋅ 11 ⋅ 17 561 = 3 \cdot 11 \cdot 17 561 = 3 ⋅ 11 ⋅ 17 は カーマイケル数である( 04-algebra 第1章 注意 1.37)。
定理 1.16 (コルセルトの 判定法, Korselt's criterion)合成数 n n n が カーマイケル数である ための 必要十分条件は、 n n n が 平方因子を もたず(どの 素数 p p p に ついても p 2 ∤ n p^2 \nmid n p 2 ∤ n )、n n n の 各素因数 p p p に ついて p − 1 ∣ n − 1 p - 1 \mid n - 1 p − 1 ∣ n − 1 と なる ことである。
証明. 十分性:gcd ( a , n ) = 1 \gcd(a, n) = 1 g cd( a , n ) = 1 と する。 n n n の 各素因数 p p p に ついて、フェルマーの 小定理と p − 1 ∣ n − 1 p - 1 \mid n - 1 p − 1 ∣ n − 1 より a n − 1 ≡ 1 ( m o d p ) a^{n-1} \equiv 1 \pmod{p} a n − 1 ≡ 1 ( mod p ) 。n n n は 相異なる 素数の 積なので、中国剰余定理より a n − 1 ≡ 1 ( m o d n ) a^{n-1} \equiv 1 \pmod{n} a n − 1 ≡ 1 ( mod n ) 。
必要性:n n n を カーマイケル数と する。 p 2 ∣ n p^2 \mid n p 2 ∣ n と なる 素数 p p p が あったとし、 a = 1 + n / p a = 1 + n/p a = 1 + n / p と おく。 n n n の 素因数は すべて n / p n/p n / p を 割るので gcd ( a , n ) = 1 \gcd(a, n) = 1 g cd( a , n ) = 1 。また ( n / p ) 2 = n ⋅ ( n / p 2 ) (n/p)^2 = n \cdot (n/p^2) ( n / p ) 2 = n ⋅ ( n / p 2 ) は n n n の 倍数なので、二項展開に より a n − 1 ≡ 1 + ( n − 1 ) n / p ( m o d n ) a^{n-1} \equiv 1 + (n - 1)n/p \pmod{n} a n − 1 ≡ 1 + ( n − 1 ) n / p ( mod n ) 。これが 1 1 1 と 合同なら n ∣ ( n − 1 ) n / p n \mid (n - 1)n/p n ∣ ( n − 1 ) n / p 、すな わち p ∣ n − 1 p \mid n - 1 p ∣ n − 1 と なるが、 p ∣ n p \mid n p ∣ n なので 不可能である。よって n n n は 平方因子を もたない。次に p p p を n n n の 素因数、 g g g を 法 p p p の 原始根( 04-algebra 第1章 定理 1.44)と する。 p p p と n / p n/p n / p は 互いに 素なので、中国剰余定理に より a ≡ g ( m o d p ) a \equiv g \pmod{p} a ≡ g ( mod p ) , a ≡ 1 ( m o d n / p ) a \equiv 1 \pmod{n/p} a ≡ 1 ( mod n / p ) と なる a a a が とれる。すると a n − 1 ≡ 1 ( m o d n ) a^{n-1} \equiv 1 \pmod{n} a n − 1 ≡ 1 ( mod n ) より g n − 1 ≡ 1 ( m o d p ) g^{n-1} \equiv 1 \pmod{p} g n − 1 ≡ 1 ( mod p ) で、g g g の 位数は p − 1 p - 1 p − 1 なので p − 1 ∣ n − 1 p - 1 \mid n - 1 p − 1 ∣ n − 1 (同 命題 1.40)。□ \square □
系 1.17 カーマイケル数は 奇数であり、相異なる 素因数を 少なくとも 3 個もつ。
証明. カーマイケル数 n n n は 平方因子を もたない合成数なので、相異なる 2 個以上の 素数の 積である。 n n n が 偶数なら 奇素因数 p p p を もち、偶数 p − 1 p - 1 p − 1 が 奇数 n − 1 n - 1 n − 1 を 割る ことになり矛盾する。 n = p q n = pq n = pq (p < q p < q p < q )なら、n − 1 = p ( q − 1 ) + ( p − 1 ) n - 1 = p(q - 1) + (p - 1) n − 1 = p ( q − 1 ) + ( p − 1 ) より q − 1 ∣ p − 1 q - 1 \mid p - 1 q − 1 ∣ p − 1 だが、0 < p − 1 < q − 1 0 < p - 1 < q - 1 0 < p − 1 < q − 1 なので 矛盾する。 □ \square □
例 1.18 1105 = 5 ⋅ 13 ⋅ 17 1105 = 5 \cdot 13 \cdot 17 1105 = 5 ⋅ 13 ⋅ 17 (1104 1104 1104 は 4 , 12 , 16 4, 12, 16 4 , 12 , 16 の 倍数)、 1729 = 7 ⋅ 13 ⋅ 19 1729 = 7 \cdot 13 \cdot 19 1729 = 7 ⋅ 13 ⋅ 19 (1728 1728 1728 は 6 , 12 , 18 6, 12, 18 6 , 12 , 18 の 倍数)も カーマイケル数である。計算機で 調べると、 10 4 10^4 1 0 4 未満の カーマイケル数は 561 , 1105 , 1729 , 2465 , 2821 , 6601 , 8911 561, 1105, 1729, 2465, 2821, 6601, 8911 561 , 1105 , 1729 , 2465 , 2821 , 6601 , 8911 の 7 個、10 6 10^6 1 0 6 未満では 43 個である。数は 少ないが 無限に 存在する(アルフォード・グランヴィル・ポメランス、1994 年。主張のみ)。
カーマイケル数を フェルマーテストで 見抜けるのは n n n と 互いに 素でない a a a を 引いた ときだけである。その 確率は 1 − φ ( n ) / n 1 - \varphi(n)/n 1 − φ ( n ) / n 未満で、素因数が どれも 大きければ きわめて 小さい。
1.7 ミラー–ラビン法
フェルマーテストを 強化する 鍵は、「法が 素数なら 1 1 1 の 平方根は ± 1 \pm 1 ± 1 しかない」と いう 事実である。
補題 1.19 (1 の 非自明な 平方根) n ≥ 3 n \geq 3 n ≥ 3 , x 2 ≡ 1 ( m o d n ) x^2 \equiv 1 \pmod{n} x 2 ≡ 1 ( mod n ) , x ≢ ± 1 ( m o d n ) x \not\equiv \pm 1 \pmod{n} x ≡ ± 1 ( mod n ) ならば、gcd ( x − 1 , n ) \gcd(x - 1, n) g cd( x − 1 , n ) は n n n の 1 1 1 でも n n n でもない 約数である。特に n n n が 素数なら、 x 2 ≡ 1 ( m o d n ) x^2 \equiv 1 \pmod{n} x 2 ≡ 1 ( mod n ) の 解は x ≡ ± 1 x \equiv \pm 1 x ≡ ± 1 に 限る。
証明. n ∣ ( x − 1 ) ( x + 1 ) n \mid (x - 1)(x + 1) n ∣ ( x − 1 ) ( x + 1 ) である。gcd ( x − 1 , n ) = n \gcd(x - 1, n) = n g cd( x − 1 , n ) = n なら x ≡ 1 x \equiv 1 x ≡ 1 。gcd ( x − 1 , n ) = 1 \gcd(x - 1, n) = 1 g cd( x − 1 , n ) = 1 なら 04-algebra 第1章の 命題 1.9 より n ∣ x + 1 n \mid x + 1 n ∣ x + 1 で x ≡ − 1 x \equiv -1 x ≡ − 1 。いずれも 仮定に 反する。素数 n n n の 正の 約数は 1 1 1 と n n n だけなので、後半も 従う。 □ \square □
以下、n ≥ 3 n \geq 3 n ≥ 3 を 奇数とし、 n − 1 = 2 s t n - 1 = 2^s t n − 1 = 2 s t (s ≥ 1 s \geq 1 s ≥ 1 , t t t は 奇数)と 書く。
定義 1.20 (強い 証人と 強い 偽証人) a ∈ { 1 , … , n − 1 } a \in \lbrace 1, \dots, n - 1 \rbrace a ∈ { 1 , … , n − 1 } が
a t ≡ 1 ( m o d n ) または a 2 i t ≡ − 1 ( m o d n ) ( ある 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) a t ≡ 1 ( mod n ) または a 2 i t ≡ − 1 ( mod n ) ( ある 0 ≤ i ≤ s − 1 )
を みたすとき、 a a a は n n n の 強い 検定に 合格すると いう。合格しない a a a を 強い 証人 (strong witness) と いう。 n n n が 合成数で a a a が 合格する とき、 a a a を 強い 偽証人 (strong liar)、n n n を 底 a a a の 強擬素数 (strong pseudoprime) と いう。
命題 1.21 n n n が 奇素数なら、すべての a ∈ { 1 , … , n − 1 } a \in \lbrace 1, \dots, n - 1 \rbrace a ∈ { 1 , … , n − 1 } は 強い 検定に 合格する。したがって 強い 証人が 1 つでも あれば n n n は 合成数である。
証明. 列 a t , a 2 t , … , a 2 s t = a n − 1 a^t, a^{2t}, \dots, a^{2^s t} = a^{n-1} a t , a 2 t , … , a 2 s t = a n − 1 の 最後の 項は フェルマーの 小定理より 1 1 1 と 合同である。 a t ≢ 1 a^t \not\equiv 1 a t ≡ 1 なら、a 2 j t ≡ 1 a^{2^j t} \equiv 1 a 2 j t ≡ 1 と なる 最小の j j j (1 ≤ j ≤ s 1 \leq j \leq s 1 ≤ j ≤ s )に ついて x = a 2 j − 1 t x = a^{2^{j-1}t} x = a 2 j − 1 t は x 2 ≡ 1 x^2 \equiv 1 x 2 ≡ 1 , x ≢ 1 x \not\equiv 1 x ≡ 1 を みたすので、補題 1.19 より x ≡ − 1 x \equiv -1 x ≡ − 1 であり、i = j − 1 i = j - 1 i = j − 1 と して合格する。 □ \square □
例 1.22 (1) n = 561 n = 561 n = 561 , a = 2 a = 2 a = 2 の とき、 560 = 2 4 ⋅ 35 560 = 2^4 \cdot 35 560 = 2 4 ⋅ 35 で、例 1.6 の 表から 列 2 35 , 2 70 , 2 140 , 2 280 2^{35}, 2^{70}, 2^{140}, 2^{280} 2 35 , 2 70 , 2 140 , 2 280 は 263 , 166 , 67 , 1 263, 166, 67, 1 263 , 166 , 67 , 1 である。67 2 ≡ 1 67^2 \equiv 1 6 7 2 ≡ 1 だが 67 ≢ ± 1 67 \not\equiv \pm 1 67 ≡ ± 1 なので 2 2 2 は 強い 証人であり、フェルマーテストでは 見抜けなかった カーマイケル数が 同じ 計算の 途中経過から 見抜けた。補題 1.19 より 約数 gcd ( 66 , 561 ) = 33 \gcd(66, 561) = 33 g cd( 66 , 561 ) = 33 まで 得られる。(2) n = 2047 = 23 ⋅ 89 n = 2047 = 23 \cdot 89 n = 2047 = 23 ⋅ 89 の とき、 2046 = 2 ⋅ 1023 2046 = 2 \cdot 1023 2046 = 2 ⋅ 1023 で、2 11 = 2048 ≡ 1 2^{11} = 2048 \equiv 1 2 11 = 2048 ≡ 1 より 2 1023 = ( 2 11 ) 93 ≡ 1 2^{1023} = (2^{11})^{93} \equiv 1 2 1023 = ( 2 11 ) 93 ≡ 1 なので、2 2 2 は 強い 偽証人である。これは 底 2 2 2 の 強擬素数の 中で 最小で、底を 固定した 判定は だまされうる。
ミラー–ラビン法 (Miller–Rabin test) ミラー(1976 年)が 一般化リーマン予想のもとで 考えた 決定的な 判定法を、ラビン(1980 年)が 底を ランダムに 選ぶ確率的な 判定法に 作り替えた ものである。入力は 奇数 n ≥ 5 n \geq 5 n ≥ 5 と 反復回数 r r r 。{ 2 , … , n − 2 } \lbrace 2, \dots, n - 2 \rbrace { 2 , … , n − 2 } から a a a を 一様ランダムに 選んで 強い 検定を 行う ことを r r r 回繰り返し、一度でも 強い 証人が 出れば「合成数」、出なければ「おそらく 素数」と 出力する。
1 回の 検定は 定理 1.5 より O ( ℓ ( n ) 3 ) O(\ell(n)^3) O ( ℓ ( n ) 3 ) で できる。命題 1.21 より 素数が「合成数」と 判定される ことは なく、合成数を 誤る 確率は 次の 定理で 抑えられる。
定理 1.23 (ラビン, モニエ, 1980 年)n n n を 奇数の 合成数と する。 n n n の 強い 偽証人の 個数は、 n ≠ 9 n \neq 9 n = 9 なら φ ( n ) / 4 \varphi(n)/4 φ ( n ) /4 以下であり、n = 9 n = 9 n = 9 を 含めて つねに ( n − 1 ) / 4 (n - 1)/4 ( n − 1 ) /4 以下である。
証明. G = ( Z / n Z ) × G = (\mathbb{Z}/n\mathbb{Z})^\times G = ( Z / n Z ) × 、強い 偽証人の 全体を L L L と する。 a ∈ L a \in L a ∈ L なら 2 乗を 繰り返して a n − 1 ≡ 1 a^{n-1} \equiv 1 a n − 1 ≡ 1 と なるので、 L L L は 命題 1.14 の 部分群 F F F に 含まれる。
(i) n = p e n = p^e n = p e (p p p は 奇素数、 e ≥ 2 e \geq 2 e ≥ 2 )の 場合. 法 p p p への 還元 ρ : G → ( Z / p Z ) × \rho\colon G \to (\mathbb{Z}/p\mathbb{Z})^\times ρ : G → ( Z / p Z ) × は 全射準同型で、核 U U U の 位数は φ ( p e ) / ( p − 1 ) = p e − 1 \varphi(p^e)/(p - 1) = p^{e-1} φ ( p e ) / ( p − 1 ) = p e − 1 である。a ∈ F ∩ U a \in F \cap U a ∈ F ∩ U の 位数は p e − 1 p^e - 1 p e − 1 を 割り( 04-algebra 第2章 命題 2.19)、ラグランジュの 定理より p e − 1 p^{e-1} p e − 1 も 割るので、 a = 1 a = 1 a = 1 。よって ρ \rho ρ は F F F 上で 単射で、 ∣ L ∣ ≤ ∣ F ∣ ≤ p − 1 = φ ( n ) / p e − 1 \lvert L \rvert \leq \lvert F \rvert \leq p - 1 = \varphi(n)/p^{e-1} ∣ L ∣ ≤ ∣ F ∣ ≤ p − 1 = φ ( n ) / p e − 1 。( p , e ) ≠ ( 3 , 2 ) (p, e) \neq (3, 2) ( p , e ) = ( 3 , 2 ) なら p e − 1 ≥ 4 p^{e-1} \geq 4 p e − 1 ≥ 4 なので ∣ L ∣ ≤ φ ( n ) / 4 \lvert L \rvert \leq \varphi(n)/4 ∣ L ∣ ≤ φ ( n ) /4 。また n − 1 ≥ p 2 − 1 = ( p − 1 ) ( p + 1 ) ≥ 4 ( p − 1 ) n - 1 \geq p^2 - 1 = (p - 1)(p + 1) \geq 4(p - 1) n − 1 ≥ p 2 − 1 = ( p − 1 ) ( p + 1 ) ≥ 4 ( p − 1 ) より、つねに ∣ L ∣ ≤ ( n − 1 ) / 4 \lvert L \rvert \leq (n - 1)/4 ∣ L ∣ ≤ ( n − 1 ) /4 。
(ii) n n n が 相異なる k ≥ 2 k \geq 2 k ≥ 2 個の 素因数を もつ 場合. n = p 1 e 1 ⋯ p k e k n = p_1^{e_1} \cdots p_k^{e_k} n = p 1 e 1 ⋯ p k e k と 書く。 ( − 1 ) t = − 1 (-1)^t = -1 ( − 1 ) t = − 1 なので、b 2 i t ≡ − 1 ( m o d n ) b^{2^i t} \equiv -1 \pmod{n} b 2 i t ≡ − 1 ( mod n ) と なる b ∈ G b \in G b ∈ G と 0 ≤ i ≤ s − 1 0 \leq i \leq s - 1 0 ≤ i ≤ s − 1 は 存在する。そのような i i i の 最大値を i 0 i_0 i 0 、対応する b b b を 1 つとり、M = 2 i 0 t M = 2^{i_0}t M = 2 i 0 t と して、部分群
J = { a ∈ G ∣ a M ≡ ± 1 ( m o d n ) } ⊂ K = { a ∈ G ∣ 各 j で a M ≡ ± 1 ( m o d p j e j ) } 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 J = { a ∈ G ∣ a M ≡ ± 1 ( mod n )} ⊂ K = { a ∈ G ∣ 各 j で a M ≡ ± 1 ( mod p j e j )}
を 考える( K K K の 符号は j j j ごとに 異なってよい)。
第 1 段(L ⊂ J L \subset J L ⊂ J )。a ∈ L a \in L a ∈ L と する。 a t ≡ 1 a^t \equiv 1 a t ≡ 1 なら a M ≡ 1 a^M \equiv 1 a M ≡ 1 。a 2 i t ≡ − 1 a^{2^i t} \equiv -1 a 2 i t ≡ − 1 なら i 0 i_0 i 0 の 最大性より i ≤ i 0 i \leq i_0 i ≤ i 0 で、a M = ( a 2 i t ) 2 i 0 − i ≡ ± 1 a^M = (a^{2^i t})^{2^{i_0 - i}} \equiv \pm 1 a M = ( a 2 i t ) 2 i 0 − i ≡ ± 1 。
第 2 段([ K : J ] = 2 k − 1 [K : J] = 2^{k-1} [ K : J ] = 2 k − 1 )。準同型 χ : K → { ± 1 } k \chi\colon K \to \lbrace \pm 1 \rbrace^k χ : K → { ± 1 } k , a ↦ ( a M m o d p j e j ) j a \mapsto (a^M \bmod p_j^{e_j})_j a ↦ ( a M mod p j e j ) j を 考える。符号の 組を 任意に 与え、中国剰余定理で、符号が − 1 -1 − 1 の j j j では a ≡ b a \equiv b a ≡ b 、+ 1 +1 + 1 の j j j では a ≡ 1 ( m o d p j e j ) a \equiv 1 \pmod{p_j^{e_j}} a ≡ 1 ( mod p j e j ) と なる a ∈ G a \in G a ∈ G を とれば、 χ ( a ) \chi(a) χ ( a ) は その 組に なるので、 χ \chi χ は 全射である。 p j p_j p j は 奇数なので 1 ≢ − 1 ( m o d p j e j ) 1 \not\equiv -1 \pmod{p_j^{e_j}} 1 ≡ − 1 ( mod p j e j ) であり、中国剰余定理より J = χ − 1 ( { ( 1 , … , 1 ) , ( − 1 , … , − 1 ) } ) J = \chi^{-1}(\lbrace (1, \dots, 1), (-1, \dots, -1) \rbrace) J = χ − 1 ({( 1 , … , 1 ) , ( − 1 , … , − 1 )}) 。よって [ K : J ] = 2 k / 2 [K : J] = 2^k/2 [ K : J ] = 2 k /2 。
第 3 段([ G : J ] ≥ 4 [G : J] \geq 4 [ G : J ] ≥ 4 )。k ≥ 3 k \geq 3 k ≥ 3 なら [ K : J ] ≥ 4 [K : J] \geq 4 [ K : J ] ≥ 4 。k = 2 k = 2 k = 2 と する。 a ∈ K a \in K a ∈ K なら a 2 M ≡ 1 ( m o d n ) a^{2M} \equiv 1 \pmod{n} a 2 M ≡ 1 ( mod n ) で、2 M = 2 i 0 + 1 t 2M = 2^{i_0 + 1}t 2 M = 2 i 0 + 1 t は n − 1 n - 1 n − 1 を 割るので a ∈ F a \in F a ∈ F 、つまり K ⊂ F K \subset F K ⊂ F 。系 1.17 より n n n は カーマイケル数でないので F ≠ G F \neq G F = G で、[ G : K ] ≥ [ G : F ] ≥ 2 [G : K] \geq [G : F] \geq 2 [ G : K ] ≥ [ G : F ] ≥ 2 。よって [ G : J ] = [ G : K ] [ K : J ] ≥ 4 [G : J] = [G : K][K : J] \geq 4 [ G : J ] = [ G : K ] [ K : J ] ≥ 4 。
以上より ∣ L ∣ ≤ ∣ J ∣ ≤ φ ( n ) / 4 ≤ ( n − 1 ) / 4 \lvert L \rvert \leq \lvert J \rvert \leq \varphi(n)/4 \leq (n - 1)/4 ∣ L ∣ ≤ ∣ J ∣ ≤ φ ( n ) /4 ≤ ( n − 1 ) /4 。□ \square □
n = 9 n = 9 n = 9 の 強い 偽証人は 1 , 8 1, 8 1 , 8 の 2 個で、φ ( 9 ) / 4 \varphi(9)/4 φ ( 9 ) /4 を 超えるが ( 9 − 1 ) / 4 (9 - 1)/4 ( 9 − 1 ) /4 に 等しい。 n = 15 , 91 n = 15, 91 n = 15 , 91 では 強い 偽証人が ちょうど φ ( n ) / 4 \varphi(n)/4 φ ( n ) /4 個あり、1 / 4 1/4 1/4 は 改良できない。
系 1.24 奇数の 合成数 n n n に 対し、ミラー–ラビン法が「おそらく 素数」と 出力する 確率は 4 − r 4^{-r} 4 − r 以下である。
証明. 1 1 1 と n − 1 n - 1 n − 1 は つねに 強い偽証人である( ( − 1 ) t = − 1 (-1)^t = -1 ( − 1 ) t = − 1 )。定理 1.23 より { 2 , … , n − 2 } \lbrace 2, \dots, n - 2 \rbrace { 2 , … , n − 2 } の 中の 強い 偽証人は ( n − 1 ) / 4 − 2 = ( n − 9 ) / 4 (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 ( n − 9 ) / ( 4 ( n − 3 )) < 1/4 。r r r 回の 選択は 独立なので、すべて 偽証人である 確率は 4 − r 4^{-r} 4 − r 未満である。□ \square □
計算機で 総当たりすると、カーマイケル数 561 , 1105 , 1729 561, 1105, 1729 561 , 1105 , 1729 の フェルマーの 偽証人は 単元の すべて( 320 , 768 , 1296 320, 768, 1296 320 , 768 , 1296 個)だが、強い 偽証人は 10 , 30 , 162 10, 30, 162 10 , 30 , 162 個しかない。
注意
系 1.24 の 4 − r 4^{-r} 4 − r は「合成数 n n n を 固定した とき 、それを 素数と 誤判定する 確率」であり、「おそらく 素数と 判定された 数が 合成数である 確率」ではない。後者は 判定に かける 数の 分布に よるので、ベイズの 定理で 考える。ランダムな 1024 ビットの 奇数は 約 1 / 355 1/355 1/355 しか 素数でないので、系 1.24 から 言えるのは「判定を 通った 数が 合成数である 確率は 354 ⋅ 4 − r 354 \cdot 4^{-r} 354 ⋅ 4 − r 程度以下」までである(問題 1.5)。
補足
一般化リーマン予想を 仮定すれば、 2 ≤ a ≤ 2 ( log n ) 2 2 \leq a \leq 2(\log n)^2 2 ≤ a ≤ 2 ( log n ) 2 の 底を すべて 試す決定的な 多項式時間の 判定が できる(底を O ( ( log n ) 2 ) O((\log n)^2) O (( log n ) 2 ) 個に 限れる ことは ミラーが 示し、定数 2 2 2 は バッハに よる)。仮定なしでも 決定的多項式時間の AKS 法(アグラワル・カヤル・サクセナ。2002 年に 発表、論文は 2004 年)が あるが、実用上は ミラー–ラビン法や その 変形が 使われる。
1.8 素数の 生成
k k k ビットの 素数は 次のように 生成できる :(1) 最上位ビットと 最下位ビットを 1 1 1 に した k k k ビットの 奇数 n n n を ランダムに 選ぶ。(2) 1000 1000 1000 未満の 奇素数などの 小さい 素数で 割り切れれば (1) に 戻る。(3) ミラー–ラビン法を r r r 回行い、「合成数」なら (1) に 戻り、「おそらく 素数」なら n n n を 出力する。
1.5 節の 目安に よれば、ランダムな k k k ビットの 奇数が 素数である 確率は 約 2 / ( k log 2 ) 2/(k\log 2) 2/ ( k log 2 ) なので、候補の 個数の 期待値は 約 ( k log 2 ) / 2 (k\log 2)/2 ( k log 2 ) /2 、k = 1024 k = 1024 k = 1024 なら 約 355 355 355 である。合成数の 候補は ほとんど (2) か 1 回目の 検定(系 1.24)で 除かれるので、手間は 目安と して 検定 O ( k ) O(k) O ( k ) 回分、O ( k 4 ) O(k^4) O ( k 4 ) 回の ビット演算程度である。この 手順( r = 40 r = 40 r = 40 )を Python で 実装し、種を 固定した 擬似乱数で 1024 ビットの 素数を 100 個生成すると、候補数の 平均は 390.7 390.7 390.7 だった(平均の 揺らぎは 約 35 35 35 なので、目安と 合っている)。
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(米国の デジタル署名の 規格)などにも 定められている。
まとめ
計算の 手間は 入力の ビット長で 測る。 n n n に 比例する 試し割りは 指数時間である。
冪剰余は 反復二乗法で 乗算 2 ( ℓ ( e ) − 1 ) 2(\ell(e) - 1) 2 ( ℓ ( e ) − 1 ) 回以下、O ( ℓ ( e ) ℓ ( n ) 2 ) O(\ell(e)\ell(n)^2) O ( ℓ ( e ) ℓ ( n ) 2 ) で 計算できる。拡張ユークリッドの 互除法は O ( ℓ ( a ) 2 ) O(\ell(a)^2) O ( ℓ ( a ) 2 ) で 逆元を 求める。
n = p q n = pq n = pq の 素因数を 知っていれば、中国剰余定理で 冪剰余を 約 4 倍速く できる。故障した 結果は 素因数分解に つながるので 検算が 要る。
素数定理に より、 k k k ビットの 整数の およそ 1 / ( k log 2 ) 1/(k\log 2) 1/ ( k log 2 ) が 素数である(目安)。フェルマーテストは カーマイケル数(平方因子を もたず、すべての 素因数 p p p で p − 1 ∣ n − 1 p - 1 \mid n - 1 p − 1 ∣ n − 1 と なる合成数)を 見抜けない。
奇数の 合成数の 強い 偽証人は ( n − 1 ) / 4 (n - 1)/4 ( n − 1 ) /4 以下(n ≠ 9 n \neq 9 n = 9 なら φ ( n ) / 4 \varphi(n)/4 φ ( n ) /4 以下)なので、ミラー–ラビン法の 誤り確率は 4 − r 4^{-r} 4 − r 以下である(合成数を 固定した ときの 確率)。
素数は ランダムな 奇数を 判定して 生成する。乱数には 暗号論的擬似乱数生成器を 使う。
演習問題
問題 1.1 ★ 反復二乗法で 7 100 m o d 221 7^{100} \bmod 221 7 100 mod 221 を 計算し、2 乗と 乗算の 回数が 定理 1.5 の とおりである ことを 確かめよ。また 221 = 13 ⋅ 17 221 = 13 \cdot 17 221 = 13 ⋅ 17 と 中国剰余定理で 検算せよ。
解答
100 = ( 1100100 ) 2 100 = (1100100)_2 100 = ( 1100100 ) 2 で ℓ ( 100 ) = 7 \ell(100) = 7 ℓ ( 100 ) = 7 , w ( 100 ) = 3 w(100) = 3 w ( 100 ) = 3 なので、2 乗 6 回と 乗算 2 回である。指数 E i = 1 , 3 , 6 , 12 , 25 , 50 , 100 E_i = 1, 3, 6, 12, 25, 50, 100 E i = 1 , 3 , 6 , 12 , 25 , 50 , 100 に 対し、 7 E i m o d 221 7^{E_i} \bmod 221 7 E i mod 221 は 7 , 122 , 77 , 183 , 163 , 49 , 191 7, 122, 77, 183, 163, 49, 191 7 , 122 , 77 , 183 , 163 , 49 , 191 と 変わる( 49 ⋅ 7 = 343 ≡ 122 49 \cdot 7 = 343 \equiv 122 49 ⋅ 7 = 343 ≡ 122 、122 2 = 14884 ≡ 77 122^2 = 14884 \equiv 77 12 2 2 = 14884 ≡ 77 、77 2 = 5929 ≡ 183 77^2 = 5929 \equiv 183 7 7 2 = 5929 ≡ 183 、183 2 ≡ 118 183^2 \equiv 118 18 3 2 ≡ 118 , 118 ⋅ 7 = 826 ≡ 163 118 \cdot 7 = 826 \equiv 163 118 ⋅ 7 = 826 ≡ 163 、163 2 ≡ 49 163^2 \equiv 49 16 3 2 ≡ 49 、49 2 = 2401 ≡ 191 49^2 = 2401 \equiv 191 4 9 2 = 2401 ≡ 191 )。よって 7 100 ≡ 191 7^{100} \equiv 191 7 100 ≡ 191 。検算:法 13 13 13 では 7 12 ≡ 1 7^{12} \equiv 1 7 12 ≡ 1 より 7 100 ≡ 7 4 = 2401 ≡ 9 7^{100} \equiv 7^4 = 2401 \equiv 9 7 100 ≡ 7 4 = 2401 ≡ 9 、法 17 17 17 では 7 16 ≡ 1 7^{16} \equiv 1 7 16 ≡ 1 より 7 100 ≡ 7 4 ≡ 4 7^{100} \equiv 7^4 \equiv 4 7 100 ≡ 7 4 ≡ 4 。x = 4 + 17 y ≡ 9 ( m o d 13 ) x = 4 + 17y \equiv 9 \pmod{13} x = 4 + 17 y ≡ 9 ( mod 13 ) から 4 y ≡ 5 4y \equiv 5 4 y ≡ 5 、y ≡ 5 ⋅ 10 ≡ 11 y \equiv 5 \cdot 10 \equiv 11 y ≡ 5 ⋅ 10 ≡ 11 で x = 191 x = 191 x = 191 。一致する。
問題 1.2 ★ ★ (モンゴメリー・ラダー)e = ( e L − 1 ⋯ e 0 ) 2 e = (e_{L-1} \cdots e_0)_2 e = ( e L − 1 ⋯ e 0 ) 2 (e L − 1 = 1 e_{L-1} = 1 e L − 1 = 1 )と する。 R 0 = a R_0 = a R 0 = a , R 1 = a 2 m o d n R_1 = a^2 \bmod n R 1 = a 2 mod n から 始め、 i = L − 2 , … , 0 i = L - 2, \dots, 0 i = L − 2 , … , 0 の 順に、 e i = 0 e_i = 0 e i = 0 なら ( R 0 , R 1 ) ← ( R 0 2 , R 0 R 1 ) (R_0, R_1) \leftarrow (R_0^2, R_0R_1) ( R 0 , R 1 ) ← ( R 0 2 , R 0 R 1 ) 、e i = 1 e_i = 1 e i = 1 なら ( R 0 , R 1 ) ← ( R 0 R 1 , R 1 2 ) (R_0, R_1) \leftarrow (R_0R_1, R_1^2) ( R 0 , R 1 ) ← ( R 0 R 1 , R 1 2 ) ( m o d n \bmod n mod n )と 更新する。最後の R 0 R_0 R 0 が a e m o d n a^e \bmod n a e mod n である ことを 示し、この 方法が 反復二乗法より サイドチャネル攻撃に 強い 理由を 述べよ。
解答
E i = ⌊ e / 2 i ⌋ E_i = \lfloor e/2^i \rfloor E i = ⌊ e / 2 i ⌋ とし、添字 i i i の 処理後に R 0 ≡ a E i R_0 \equiv a^{E_i} R 0 ≡ a E i , R 1 ≡ a E i + 1 R_1 \equiv a^{E_i + 1} R 1 ≡ a E i + 1 と なる ことを 示す。最初は E L − 1 = 1 E_{L-1} = 1 E L − 1 = 1 で 成り立つ。添字 i + 1 i + 1 i + 1 で 成り立つとき、 e i = 0 e_i = 0 e i = 0 なら E i = 2 E i + 1 E_i = 2E_{i+1} E i = 2 E i + 1 で R 0 2 ≡ a E i R_0^2 \equiv a^{E_i} R 0 2 ≡ a E i , R 0 R 1 ≡ a 2 E i + 1 + 1 = a E i + 1 R_0R_1 \equiv a^{2E_{i+1} + 1} = a^{E_i + 1} R 0 R 1 ≡ a 2 E i + 1 + 1 = a E i + 1 。e i = 1 e_i = 1 e i = 1 なら E i = 2 E i + 1 + 1 E_i = 2E_{i+1} + 1 E i = 2 E i + 1 + 1 で R 0 R 1 ≡ a E i R_0R_1 \equiv a^{E_i} R 0 R 1 ≡ a E i , R 1 2 ≡ a 2 E i + 1 + 2 = a E i + 1 R_1^2 \equiv a^{2E_{i+1} + 2} = a^{E_i + 1} R 1 2 ≡ a 2 E i + 1 + 2 = a E i + 1 。よって 最後に R 0 ≡ a E 0 = a e R_0 \equiv a^{E_0} = a^e R 0 ≡ a E 0 = a e 。
どの ビットでも 乗算 1 回と 2 乗 1 回を 行うので、演算の 回数と 種類の 並びが 秘密の ビットに 依存しない(ただし、使う レジスタの 入れ替えも 分岐や メモリアクセスの 違いと して 漏れないように 実装する 必要が ある)。
問題 1.3 ★ ★ 6 k + 1 6k + 1 6 k + 1 , 12 k + 1 12k + 1 12 k + 1 , 18 k + 1 18k + 1 18 k + 1 が すべて 素数ならば、その 積は カーマイケル数である ことを 示せ。 k = 1 k = 1 k = 1 では 何が 得られるか。
解答
3 つの 素数は 相異なるので、積 n n n は 平方因子を もたない合成数である。 n = 1296 k 3 + 396 k 2 + 36 k + 1 n = 1296k^3 + 396k^2 + 36k + 1 n = 1296 k 3 + 396 k 2 + 36 k + 1 より n − 1 = 36 k ( 36 k 2 + 11 k + 1 ) n - 1 = 36k(36k^2 + 11k + 1) n − 1 = 36 k ( 36 k 2 + 11 k + 1 ) で、36 k 36k 36 k は 6 k 6k 6 k , 12 k 12k 12 k , 18 k 18k 18 k の 倍数なので、定理 1.16 より n n n は カーマイケル数である。 k = 1 k = 1 k = 1 では 7 , 13 , 19 7, 13, 19 7 , 13 , 19 が 素数で、 n = 1729 n = 1729 n = 1729 を 得る。
問題 1.4 ★ ★ n = 1105 n = 1105 n = 1105 , a = 2 a = 2 a = 2 で ミラー–ラビン法の 検定を 行い、 2 2 2 が 強い 証人である ことを 確かめよ。さらに、途中で 得られる 数から 1105 1105 1105 の 約数を 求めよ。
解答
1104 = 2 4 ⋅ 69 1104 = 2^4 \cdot 69 1104 = 2 4 ⋅ 69 なので s = 4 s = 4 s = 4 , t = 69 t = 69 t = 69 。反復二乗法で 2 69 ≡ 967 ( m o d 1105 ) 2^{69} \equiv 967 \pmod{1105} 2 69 ≡ 967 ( mod 1105 ) で、2 乗を 繰り返すと 967 2 ≡ 259 967^2 \equiv 259 96 7 2 ≡ 259 、259 2 = 67081 ≡ 781 259^2 = 67081 \equiv 781 25 9 2 = 67081 ≡ 781 、781 2 = 609961 = 552 ⋅ 1105 + 1 781^2 = 609961 = 552 \cdot 1105 + 1 78 1 2 = 609961 = 552 ⋅ 1105 + 1 である。列 967 , 259 , 781 , 1 967, 259, 781, 1 967 , 259 , 781 , 1 に − 1 ≡ 1104 -1 \equiv 1104 − 1 ≡ 1104 は 現れず 2 t ≢ 1 2^t \not\equiv 1 2 t ≡ 1 なので、2 2 2 は 強い 証人である。 x = 781 x = 781 x = 781 は 1 の 非自明な 平方根なので、補題 1.19 より gcd ( 780 , 1105 ) = 65 \gcd(780, 1105) = 65 g cd( 780 , 1105 ) = 65 と gcd ( 782 , 1105 ) = 17 \gcd(782, 1105) = 17 g cd( 782 , 1105 ) = 17 は 非自明な 約数である( 1105 = 5 ⋅ 13 ⋅ 17 1105 = 5 \cdot 13 \cdot 17 1105 = 5 ⋅ 13 ⋅ 17 )。
問題 1.5 ★ ★ ランダムな 1024 ビットの 奇数 n n n に ミラー–ラビン法を r r r 回行う。n n n が 素数である 確率を π 0 ≈ 1 / 355 \pi_0 \approx 1/355 π 0 ≈ 1/355 とし、「おそらく 素数」と 判定されたと いう 条件のもとで n n n が 合成数である 確率は 4 − r ( 1 − π 0 ) / π 0 4^{-r}(1 - \pi_0)/\pi_0 4 − r ( 1 − π 0 ) / π 0 以下である ことを 示して、 r = 5 , 10 , 40 r = 5, 10, 40 r = 5 , 10 , 40 での 値を 求めよ。「 r = 5 r = 5 r = 5 なら 誤り確率は 4 − 5 ≈ 0.1 4^{-5} \approx 0.1 4 − 5 ≈ 0.1 パーセント」と いう 説明は どこが 誤りか。
解答
A A A を「n n n が 合成数」、 B B B を「r r r 回とも合格」と する。系 1.24 よりどの 合成数でも B B B の 確率は 4 − r 4^{-r} 4 − r 以下なので P ( B ∣ A ) ≤ 4 − r P(B \mid A) \leq 4^{-r} P ( B ∣ A ) ≤ 4 − r 。素数は 必ず合格するので P ( B ) ≥ P ( B ∩ A c ) = π 0 P(B) \geq P(B \cap A^c) = \pi_0 P ( B ) ≥ P ( B ∩ A c ) = π 0 。ベイズの 定理より
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) ≤ 4 − r ( 1 − π 0 ) π 0 P(A \mid B) = \frac{P(B \mid A)P(A)}{P(B)} \leq \frac{4^{-r}(1 - \pi_0)}{\pi_0} P ( A ∣ B ) = P ( B ) P ( B ∣ A ) P ( A ) ≤ π 0 4 − r ( 1 − π 0 )
( 1 − π 0 ) / π 0 ≈ 354 (1 - \pi_0)/\pi_0 \approx 354 ( 1 − π 0 ) / π 0 ≈ 354 なので、上界は r = 5 r = 5 r = 5 で 約 0.35 0.35 0.35 、r = 10 r = 10 r = 10 で 約 3.4 × 10 − 4 3.4 \times 10^{-4} 3.4 × 1 0 − 4 、r = 40 r = 40 r = 40 で 約 2.9 × 10 − 22 2.9 \times 10^{-22} 2.9 × 1 0 − 22 。4 − r 4^{-r} 4 − r は 合成数を 固定した ときの 確率で、判定を 通った 数の うちの 合成数の 割合ではない。素数が まれなので、最悪の 場合の 評価だけでは、 r = 5 r = 5 r = 5 で「判定を 通った 数の 35 パーセントが 合成数」と いう 可能性すら 排除できない。
問題 1.6 ★ ★ (実装の 危険)RSA の 公開鍵 ( n , e ) = ( 3233 , 17 ) (n, e) = (3233, 17) ( n , e ) = ( 3233 , 17 ) の 持ち主が、命題 1.9 の 方法で m = 65 m = 65 m = 65 の 署名を 計算した ところ、装置の 誤動作で 誤った 署名 s ′ = 2602 s' = 2602 s ′ = 2602 が 出力された( s ′ 17 ≡ 1496 ( m o d 3233 ) s'^{17} \equiv 1496 \pmod{3233} s ′ 17 ≡ 1496 ( mod 3233 ) )。公開されている 情報だけから n n n を 素因数分解せよ。また、この 攻撃を 防ぐには どうすれば よいか。
解答
gcd ( s ′ e − m , n ) = gcd ( 1431 , 3233 ) \gcd(s'^e - m, n) = \gcd(1431, 3233) g cd( s ′ e − m , n ) = g cd( 1431 , 3233 ) を 互除法で 計算すると、 3233 = 2 ⋅ 1431 + 371 3233 = 2 \cdot 1431 + 371 3233 = 2 ⋅ 1431 + 371 , 1431 = 3 ⋅ 371 + 318 1431 = 3 \cdot 371 + 318 1431 = 3 ⋅ 371 + 318 , 371 = 318 + 53 371 = 318 + 53 371 = 318 + 53 , 318 = 6 ⋅ 53 318 = 6 \cdot 53 318 = 6 ⋅ 53 より 53 53 53 。よって n = 53 ⋅ 61 n = 53 \cdot 61 n = 53 ⋅ 61 。正しい 署名 s = 588 s = 588 s = 588 と 比べると s ′ ≡ s ≡ 5 ( m o d 53 ) s' \equiv s \equiv 5 \pmod{53} s ′ ≡ s ≡ 5 ( mod 53 ) だが s ′ ≡ 40 ≢ 39 ≡ s ( m o d 61 ) s' \equiv 40 \not\equiv 39 \equiv s \pmod{61} s ′ ≡ 40 ≡ 39 ≡ s ( mod 61 ) で、法 61 61 61 の 成分だけが 誤っている ため、 s ′ e − m s'^e - m s ′ e − m は 53 53 53 でだけ割り切れる。対策は、出力前に s e ≡ m ( m o d n ) s^e \equiv m \pmod{n} s e ≡ m ( mod n ) を 検算する ことである( e e e が 小さいので 安い)。
問題 1.7 ★ (乱数の 事故)ある機器が 作った 2 つの RSA の 法 n 1 = 2773 n_1 = 2773 n 1 = 2773 , n 2 = 3599 n_2 = 3599 n 2 = 3599 が 公開されている。互除法で gcd ( n 1 , n 2 ) \gcd(n_1, n_2) g cd( n 1 , n 2 ) を 計算して 両方を 素因数分解せよ。また、大量の 公開鍵に 対して この 攻撃が 現実的である 理由を 説明せよ。
解答
3599 = 2773 + 826 3599 = 2773 + 826 3599 = 2773 + 826 , 2773 = 3 ⋅ 826 + 295 2773 = 3 \cdot 826 + 295 2773 = 3 ⋅ 826 + 295 , 826 = 2 ⋅ 295 + 236 826 = 2 \cdot 295 + 236 826 = 2 ⋅ 295 + 236 , 295 = 236 + 59 295 = 236 + 59 295 = 236 + 59 , 236 = 4 ⋅ 59 236 = 4 \cdot 59 236 = 4 ⋅ 59 より gcd = 59 \gcd = 59 g cd= 59 で、n 1 = 47 ⋅ 59 n_1 = 47 \cdot 59 n 1 = 47 ⋅ 59 , n 2 = 59 ⋅ 61 n_2 = 59 \cdot 61 n 2 = 59 ⋅ 61 。素因数分解は 難しいが、 gcd \gcd g cd は 2048 ビットの 数でも 互除法で 一瞬で 計算できる(定理 1.7)。数百万個の 法が あっても、積の 木などを 使えば すべての 組の gcd \gcd g cd を まとめて 効率よく 計算できる。乱数の 種が 乏しい 機器が 同じ 素数を 生成すれば、素因数分解の 困難さと 無関係に 鍵が 破られる。