q q 情報セキュリティ 第6回:2007年5月25日(金) q q 本日学ぶこと RSAのアルゴリズム q q q q 前回 RSAの安全性 q 剰余演算,べき剰余 ユークリッドの互除法とその拡張 素数判定 素因数分解 対数の計算,離散対数問題 RSA鍵生成で,乱数を用いて生成する値と,式を計算して求 める値がある. 指数時間アルゴリズムは効率が悪い. 素因数分解が効率よく行えるなら,RSAは安全でない. 2 素数生成 入力:ビット数b 出力:bビットの素数 アルゴリズム q q q 1 ? ? … ? ? 1 Step 1. 最上位が1,間は(b-2回の1ビット乱数生成により)b-2 ビットの乱数,最下位は1となるような,bビットの整数nをランダ ムに生成する. Step 2. nが素数であるかどうかを判定する.素数でないと判定 されたら,Step 1に戻る. Step 3. nを出力して終了する. 3 素数判定 入力:2以上の整数n,テスト回数T ap-1 % p = 1 ) 出力:nが素数なら「yes」,素数でないなら「no」 アルゴリズム(フェルマーテスト) q q q q q q q フェルマーの小定理: p が素数 ⇒ (gcd(p,a)=1 ⇒ Step 1. i←1とする. Step 2. 2以上n未満の正整数aをランダムに生成する. Step 3. gcd(a,n)>1ならば,Step 7に進む. Step 4. an-1%n≠1ならば,Step 7に進む. Step 5. i←i+1とする.i≦Tならば,Step 2に戻る. Step 6. 「yes」と出力して終了する. Step 7. 「no」と出力して終了する. うまくいく? q 素数であれば必ず「yes」と出力するが,素数でないのに誤って 「yes」を出力することもある. 4 素数判定法の分類(1) 確率的手法 q q q 乱数を使う. 素数でないと判定したら,必ず素数でないが, 素数であると判定しても,実は素数でない可能性がある. 精度と実行時間は,テスト回数次第. 事実 素数でない 素数である ○ 判 素数でない 定 結 果 素数である 起こり得る 起こらない ○ 5 素数判定法の分類(2) 確定的手法 q q q 乱数は使わない. 判定結果は正しい. 計算に時間がかかる. 事実 素数でない 素数である 判 素数でない 定 結 果 素数である ○ 起こらない 起こらない ○ 6 鍵ペア生成の流れ 素数p,qを生成 N=p*q, L=lcm(p-1,q-1) Eを1<E<Lの範囲で生成 E*D % L = 1 となるDを1<D<Lの範囲で求める (E,N)が暗号化鍵(公開鍵),(D,N)が復号鍵(プライベート鍵) 乱 E E*D % L = 1 D L = lcm(p-1, q-1) 暗号化鍵 乱 p N 復号鍵 乱 q N = p*q N 図の出典:『暗号技術入門―秘密の国のアリス』 p.130を一部改変 7 鍵ペア生成の流れ:余談 RSAの初期仕様やWikipediaでは,L=(p-1)(q-1) と記載され ている.この式を用いて鍵ペア(E,N), (D,N)を求めても,暗号 化・復号は問題なくできる. lcm(p-1,q-1)≦(p-1)(q-1)/2<(p-1)(q-1) に注意すると, L=lcm(p-1,q-1)を用いてDを求めるほうが,その値が小さくな り,より速く復号できるので望ましい. 参考文献 q 池野信一,小山謙二:『現代暗号理論』,電子情報通信学会, pp.106-108 (1986). 8 RSAは安全か? 安全性を破るアプローチ q q N = p*q に着目する…素因数分解問題 C = ME % N に着目する…離散対数問題の変種 9 RSAと素因数分解の関係 素因数分解が効率よく行えるなら,RSAは安全でない. 略証: q q NとEを既知とし,(素因数分解により)Nの素因数pが知られて いるときに,Dを計算できればよい. q←N/p,L←lcm(p-1,q-1) とし,a*E+b*L=1を満たす整数の組 (a,b)を拡張ユークリッドの互除法により求め,D←a % L とすれ ばよい.これらの操作はいずれも効率よく行える. 「RSAが安全でないなら,素因数分解が効率よく行える」は 証明されていない. 10 効率の良いアルゴリズム・悪いアルゴリズム 処理時間が,入力の値のビット数 L と適当な定数 C,k を 用いて C・Lk で抑えられるならば,効率が良い. q 多項式時間アルゴリズムと呼ばれる. 処理時間が,入力の値に比例するならば,効率が悪い. q q q 例1: a % m, a2 % m, …, ab % m の順にべき剰余を求める. 例2: a*b % n = 1 を満たす整数 b を,b←1, 2, … と順に 代入して求める. 入力の値のビット数を L とすると,処理時間は2L に比例する ため,指数時間アルゴリズムと呼ばれる. 11 RSAにおける素因数分解の方法 Nをk=3, 5, 7, ...の順に割って割り切れる(余りが0になる)か 調べる. 乱数を生成して,Nがその数で割り切れるか調べる. 乱数Mを1<M<Nの範囲で生成して,gcd(N,M)を求める.こ れが1より大きければ,Nの素因数の一つである. これらで素因数を発見するための実行回数の期待値は, N(の素因数の小さいほうの値)に比例する.したがって, 指数時間アルゴリズムであり,効率は悪い. 12 整数の対数を求める方法 入力:2以上の整数a,正整数y 出力: y = az を満たす整数 z 方法1 q q log2 az = z log2 a を用いる. 整数値xのビット数を |x| で表すとき,|y| ≒ z×|a| である. よって z ≒ |y| / |a|. 方法2 q q 2分探索を応用する. q q+1 a, a2, a4, a8,... を求めていき,a2 ≦y<a2 を満たす整数qが q 見つかれば,2q≦z<2q+1とわかる.y'=y / a2 に対して,y'=az' を満たすz'を(再帰的に)求め,z=2q+z' とする. 13 RSAの解読問題(≠離散対数問題) 入力:正整数m,2以上の整数a,正整数y 出力: y = az % mを満たす整数z (ただし1≦z<m) 前記の「整数の対数を求める方法」は, いずれも適用できない. 14 離散対数問題 入力:素数p,生成元g, 正整数y 出力: y = gz % pを満たす整数z (ただし1≦z<p) (前ページの)RSAの解読問題が効率よく解ければ,離散対 数問題も効率よく解ける. q 「Diffie-Hellman 鍵交換」の安全性の 根拠となっている ただし,mが二つの素数の積であることを利用して,効率よく解 くのであれば,その手法は離散対数問題に適用できない. 離散対数問題が効率よく解けるとしても,(前ページの)RSA の解読問題には利用できない. 「gがpの生成元である」の必要十分条件 2 p-2 % p がどれも異なる. g % p,g % p,…,g 2 p-2 % p がいずれも1ではない. g % p,g % p,…,g 素数かつp-1の約数(p-1の素因数)であるすべてqに対して,g(p-1)/q % p ≠ 1 15 数論アルゴリズムの計算例(1) 310 % 7 は? q q q 初期値: a = 3, b = 10, m = 7, r = 1, s = a = 3, t = b = 10 反復: t が奇数のとき r ← r * s % m t の偶奇に関係なく,s ← s * s % m, t ← t / 2 t=0 になった時点の r が解(以下の表では,4) r s t 1 3 10 ↓ 2 5 2 4 2 ↓ 2 1 4 0 16 数論アルゴリズムの計算例(2) 1440x + 50y = gcd(1440, 50) を満たす整数x, yは? q q q q q 初期化:a = 1440, b = 50, s = 1440, t = 50, u = 0, v = 1 反復: q←s/t, r←s-q*t, w←u-q*v, s←t, t←r, u←v, v←w r=0になった時点で, x←(t-b*v)/a, y←v s t u 1440 50 0 50 40 40 10 v q r w 1 28 40 -28 1 -28 1 10 29 -28 29 4 0 y = 29, x = -1 gcd(a,b) = t = 10.実際,1440*(-1)+50*29=10 である. 17 検算の方法 Linuxが使えるなら,bcコマンドが便利 q q echo '3 ^ 10 % 7' | bc echo '1440 * -1 + 50 * 29' | bc 計算機が使えない場合,目で危なそうな箇所をチェック q q べき剰余 r の更新と s の更新を間違えていないか? t の最後は…→1→0になっているか? 拡張ユークリッドの互除法 u,v,w は整数,それ以外は非負整数になっているか? x と y の一方が正,もう一方が負になっているか? 18 例題 117 % 13は? 194x + 37y = 1 を満たす整数(x,y)は? 104x % 231 = 1 を満たす整数xは? q 104x + 231y = 1と変形して求める 19
© Copyright 2025 ExpyDoc