
revised on 03/02/01
![]()

盗聴
改竄(かいざん)
なりすまし

図 9.2.1 安全な鍵の搬送
Yx (mod P) (ただし,Y<P)
この「mod(モジュラーと読む)」という計算については後に説明しますが,Windowsなどのパソコンにはかならず付加されている関数「電卓」ではこの計算が容易にできますからやってみましょう.
A さて,この公式を認めておいて,BobとAliceは暗号世界では安全とはいえない電話でも手紙でもよい,二人の間でつかう「Y」,「P」を決めます.たとえば,Y=7,P=11のように.間違いなくEveに傍受されていることでしょうが...
7x (mod11)
B ここで,Bobは「独自に」xの値を決めます.これは誰にも口外しないBobだけの秘密鍵です.たとえば,x=3のように.同じようにAliceも「独自に」x=6のように決めます.こうしてそれぞれに上式の数値計算をします.すなわち,Bobは, 73(mod 11)=2.またAliceも, 76(mod 11)=4 となります.
C BobはAliceに電話をかけて2という結果を伝えます.AliceもBobに電話をかけて4という結果を教えます.
D これらの数値をつかって,両者は再度つぎのように計算します.BobはAliceから教えられた4を使って, 43(mod 11)=9 を得ます.またAliceも同様にBobから教えてもらった2を使って, 26(mod 11)=9 を得ます.この共通の数値「9」こそが二人の間の暗号鍵です.
この方法は実にスマートです.1976年,米国のマーティン・ヘルマン,ホイットフィールド・ディフィーらによって発明されました.鍵の配送のアルゴリズムを公開しながら,それでいて誰にも知られずに鍵の配送ができるからです.同じ年1976年11月23日,アメリカ政府はDES( Data Encryption Standard )という「アルゴリズム公開型暗号」を発表しました.これも共通鍵暗号ですから,鍵の配送の問題は深刻ですが,デフィーらの配送アルゴリズムを使えば安全な暗号体系が実用化されたことになります.
しかし,不特定多数の人とやり取りする電子メールなどでは,メール送受信の前にいちいち共通鍵を決めるなどは面倒で事実上不可能です.そこで共通鍵を使わずに済ます方法が望まれます.そのために今もっとも注目を集めているのが「公開鍵暗号方式」です.
公開鍵暗号とは,たとえてみれば,こうです.南京錠を開ける鍵を私は一つだけ持っています.もちろんこれは秘密の鍵です.そして南京錠の方は,同じものを駅や空港の待合室,郵便局の窓口やコンビニのカウンターなどところかまわず世界中にばらまいておきます.南京錠のかけ方を知らない人などいませんから,私に手紙を出す人はこの鍵で暗号化します.ひとたび鍵がかけられてしまうと,開ける鍵は私しか持っていませんから誰にも開けられません.送られてきた暗号文は私の鍵で復号化できます.公開鍵の原理とはこういうものです.これについて以下で見ていきましょう.
114,381,625,757,888,867,669,235,779,976,146,612,010,218,296,
721,242,362,532,561,842,935,706,935,245,733,897,830,597,123,563,
958,705,058,989,075,147,599,290,026,879,543,541
この挑戦に応じた600人のボランティアの若い人たちがいました.ただし,彼らがそれぞれに大学などのコンピュータを使って分担して総当りで答えを探し,
3,409,529,510,847,650,949,147,849,619,903,898,133,417,764,638,493,387,843,990,820,577
という二つの正解を報告してきたのは,1994年4月26日,すでに17年という年月が経っていました.
これは129桁の数字ですが,この調子でやるとして,もしコンピュータが進歩しないで計算速度が変わらないとすれば一桁増やして130桁になると170年かかります.更に131桁では1,700年,132桁では17,000年,136桁では1億7千万年,140桁では1兆7千億年かかる勘定です.もちろんこの間にコンピュータ技術も飛躍的に進歩しているでしょう.ちなみに,インテルの創業者ゴードン=ムーアによれば,チップの性能は18ヶ月で2倍,つまり3年で4倍に向上するという「ムーアの法則」なるものがあります.コンピュータだって負けてはいません.しかし,それでも300桁ぐらいの因数分解はやはり人類誕生以来の年数より長い時間を要すると思われます.これほどまでに,素因数分解は厄介です.
法演算の一般的公式については,
を見て確認しておきましょう.
(eq.2.5.1)
| a | aの6 乗 | mod 2 | mod 3 | mod 4 | mod 5 | mod 6 | mod 7 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 64 | 0 | 1 | 0 | 4 | 4 | 1 |
| 3 | 729 | 1 | 0 | 1 | 4 | 3 | 1 |
| 4 | 4096 | 0 | 1 | 0 | 1 | 4 | 1 |
| 5 | 15625 | 1 | 1 | 1 | 0 | 1 | 1 |
| 6 | 46656 | 0 | 0 | 0 | 1 | 0 | 1 |
| 7 | 117649 | 1 | 1 | 1 | 4 | 1 | 0 |
| 8 | 262144 | 0 | 1 | 0 | 4 | 4 | 1 |
| 9 | 531441 | 1 | 0 | 1 | 1 | 3 | 1 |
| 10 | 1000000 | 0 | 1 | 0 | 0 | 4 | 1 |
例として(eq.2.5.1)についてaを1から1ずつ変化させ,その6乗についてmod2〜7について計算をしてみた結果が上の表です.表を見ますと,あまり意味のありそうなものは見当たりませんが,唯一mod7の時にすべて1になるのが分かります.
関数を計算して,答が1になるということは,その逆(関)数が存在することを意味します.すなわち,y=a6という指数関数では,aが1から6の有限な数値に対して,mod7の時にのみ逆関数が求められることを意味しています.指数関数の逆関数は対数関数ですので,こういう対数関数の剰余計算のことを離散対数関数ということがあります.離散というのは,その数値が不規則になっているという意味がこめられています.そして,この離散対数を求める数学的アルゴリズムは存在せず,これは一方向関数です.
ところで,上の表2.3.1で,p=7は素数です.そこで,次のFermatの小定理が成り立ちます.
(eq.2.5.2)
これをフェルマー(Fermat)の(小)定理といいます.
証明は,省略して実際の計算値の一例を素数p=7として下の表2.3.2に示しました.結果を見ると,m<pのすべてのmについて全部1となっています.
表2.3.2 フェルマーの小定理
| m | mの6乗 | 計算結果 |
| 1 | 1 | 1 |
| 2 | 64 | 1 |
| 3 | 729 | 1 |
| 4 | 4096 | 1 |
| 5 | 15625 | 1 |
| 6 | 46656 | 1 |
L=(p-1)(q-1) (eq.2.5.3)
です.
二つの素数pとqの積の合成数N=p*qを法とする法演算では,mが,NまたはL=(p-1)(q-1)と素な関係にあるときには,Fermatの小定理に類似した次の式が成立します.
(eq.2.5.4)
つぎに説明する代表的公開鍵暗号であるRSA暗号では,この式が重要な役割を果たします.これについてp=5,q=2で法10の例をExcelで調べてみましょう.
以上で,公開鍵暗号の一つRSA暗号のアルゴリズムに関する数学的準備はすべて完了しました.以下では,その具体的な手法について説明します.
となります.したがって,nを整数として,
n(p-1)+1=qd (eq.2.6.0)
を満たす整数dを秘密鍵とすればよいと考えたくなります.
しかし,これではダメです.公開鍵暗号方式というのはアルゴリズムも公開していますから,上の考え方からして誰にでも秘密鍵dが計算できてしまいます.離散対数という一方向関数を使ったものの,逆方向からではなく順方向から解けてしまうのであって,これでは暗号にはなりません.
上の失敗はどこから来たかといえば,Fermatの小定理を直接使用したためです.そこでこの欠点を補うために計算アルゴリズムが存在しない素因数分解を導入します.そのために,(eq.2.6.0)のn(p-1)のところを書き換えてp-1とq-1の最小公倍数Lとし、nを-cに置き換えます.すなわち,RSA暗号の小道具として次を用意します.
@ 二つの素数p,q (eq.2.6.1)
A N=p*q (eq.2.6.2)
B p−1,q−1の最小公倍数L (eq.2.6.3)
C Lと素な数e (eq.2.6.4)
D L*c+d*e=1 となるd. (eq.2.6.5)
(e,N)・・・・・・・・・・・・・公開鍵 (eq.2.6.6)
であり,秘密鍵は,
d ・・・・・・・・・・・・・・・・・・・・・・秘密鍵 (eq.2.6.7)
です.
このようにRSA暗号では,公開鍵だけでなくアルゴリズムも公知です.それなのにこれが暗号として使用に耐えるのは,Nがpとqの積ですが,Nが分かったからといってpとqは有限の時間の中では求められないためです.また,離散対数のアルゴリズムが無いために、dをあてずっぽうに想像して,総当りで暗号文を読むとしても,やはり有限時間では読めないためです.
(eq.2.6.8)
(eq.2.6.9)
(eq.2.6.10)
ただし,ここで,Lは(p-1)と(q-1)の最小公倍数ですので,sまたはtを整数とすると,
(eq.2.6.11)
(eq.2.6.12)
(eq.2.6.13)
それではここで一つ例題をやってみましょう.
@ 二つの素数p=71,q=97 (eq.2.7.1)
A N=p*q=71×97=6887 (eq.2.7.2)
B p−1,q−1の最小公倍数L=3360 (eq.2.7.3)
C Lと素な数e=13 (eq.2.7.4)
D L*c+d*e=1 となるd=517 (eq.2.7.5)
ただし(eq.2.6.5)でc=-2とした.ゆえに,公開鍵,秘密鍵はそれぞれつぎのように決まります.
公開鍵 e=13,N=6887 (eq.2.7.6)
秘密鍵 d=517 (eq.2.7.7)
いま,平文を十進数で表した文章を,M=1687としましょう.これを暗号化するには(eq.2.6.8)を使って,
=168713 (mod 6887)
=57 (eq.2.7.8)
つまり,C=57が暗号文です.
これを受け取った受信者は自分の秘密鍵で開けます.それには (eq.2.6.10)を使います.
=57517 (mod 6887)
=1687 (eq.2.7.9)
たしかに暗号文57は秘密鍵517によって平文1687になりました.上記の数値計算は,Windowsの関数電卓を使えば簡単にできますから自分で計算してみましょう.
この例題では,鍵として4桁程度のものを使っていますから,これでは簡単にpとqを割り出せてしまいます.しかし,p,qとも100桁ほどにしてみたらどうでしょうか.十進数で200桁の数値の素因数分解は最新鋭のスーパーコンピュータを使っても数億年はかかります.したがって,暗号文が効力をもっている期間ではまず問題なさそうです.十分秘密鍵を奪われない限り,暗号を解読されることはなさそうです.