RSA暗号体験入門
目次 | 第1章 | 第2章 | 第3章 | 第4章
本章ではRSA暗号の基本的な原理や使用法を説明します。RSA暗号はRivest,Shamir,Adleman という3人の研究者によって考案されたものであり,その名称はそれぞれの名前の頭文字を取って付けられたものです。
この暗号方式には以下のような特徴があります。
- RSA暗号方式は,公開鍵暗号の中で信頼性が高く最も広く使われている。
- RSAは暗号化も復号化も行える公開鍵暗号方式であり,鍵の長さは可変長である。
- RSAの利用者は,安全性の強化のためには長い鍵を,効率のためには短い鍵を選べばよい。
- RSAの平文の長さ(暗号化されるデータのサイズ)もまた可変長である。
- 平文の長さは,鍵の長さよりも小さい必要がある。
- 暗号文の長さは鍵の長さと同じになる。
初めは意味が分からないかもしれませんが,本章を精読後まとめとして読んで理解できれば大丈夫です。
ここからはRSA暗号の原理について説明しますが,説明文中に"^"という記号が登場します。
これは,例えば a^b と表記した場合,aのb乗を意味します。つまりべき乗の演算子です。
また,説明文中に頻繁に"mod"という記号が登場します。
これは例えば次のような意味として使われます。すなわち,
b = a mod n
と表記した場合,aはnを法として考えたとき,bになるという意味です。
さらに分かりやすく言うと,「aをnで割った余りはbになる」ということです。
具体例: |
1 = 10 mod 3 |
7 = 37 mod 10 |
5 = 53 mod 12 |
13 = 1234 mod 111 |
まず,暗号化を行う前に,予め以下の手順に従って秘密鍵と公開鍵を作成しておく必要があります。
- 2つの大きな素数p,qを選択する。
- n=pqとφ(n)=(p−1)(q−1)を計算する。
このnを係数と呼ぶ。
- gcd(e,φ(n))=1の関係をもつ乱数e(公開指数)を選択する。
ちなみにgcdとは2つの引数の最大公約数を意味する。
この公開指数eと係数nが公開鍵(e,n)となる。
- 1=de mod φ(n)となるd(秘密指数)を計算する。
この秘密指数dと係数nが秘密鍵(d,n)となる。
- 公開鍵(e,n)を公開する。p,
q,dは誰にも知られないようにしておく。
平文をM,暗号文をCとすると,M<nであれば,以下の関係式が必ず成り立ちます。
C=M^e mod n ・・・・・・(1)
M=C^d mod n ・・・・・・(2)
RSA暗号の原理は,これらの関係式が必ず成り立つという数学的特性を利用しています。
ただしその理由はここではあえて言及しません。
(1)が暗号化の操作,(2)が復号化の操作をそれぞれ示しています。
実は,ここでいくら暗号文C,係数nおよび公開指数eの値を知っていたとしても,
秘密指数dの値を知らなければ暗号文Cから平文Mを得ることは計算量的に殆ど不可能なのです。
この事がRSA暗号の安全性を保証しているわけです。
以下に,鍵の作成から暗号化,復号化までの一連の流れの例を示します。
ただし,分かりやすくするために安全でない鍵を使うものとします。
AさんはBさんからネットワークを介して,ある極秘情報が記載された重要文書M
(その内容は簡単のため数値化されているとして,仮に10000であるとします)を受け取りたいとします。
そこで,AさんはBさんにRSA暗号を用いて暗号化して送ってもらおうと考えます。
そのためには,Aさんは秘密鍵(d,n)を,
Bさんはそれに対応する公開鍵(e,n)をそれぞれ持っていなければなりませんが,
あいにく今は持ち合わせていません。そこで,Aさんはそれら2つの鍵を作成することにします。
- まず,2つの素数に例えばp=1231,
q=4567を選びます。
(ただし,実際にはもっと大きな値にする必要があります。)
- 次に,これらを用いてnとφ(n)を求めると,
n=1231*4567=5621977
φ(n)=(1231-1)*(4567-1)=1230*4566=5616180
となります。
- 続いて,gcd(e,φ(n))=1の関係をもつ乱数e(公開指数)を選択します。
(これは第3章で述べるEuclidアルゴリズムを用いて簡単に見つけられますが,
最大公約数の計算をしたい場合は桁数無制限電卓をご利用下さい。)
ただし,一般的にはeに65537または3が使われることが多いので,
ここではeに65537を選択しました。
確かに,gcd(65537,5616180)=1の関係が成り立ちます。
- 次に,拡張Euclidアルゴリズム(第3章で触れますが
鍵生成アプレットを使う場合理解する必要はありません)を用いて秘密指数dを計算します。
つまり,e^-1=d mod φ(n) のdを計算して求めます。
d=3988493
となります。つまり,秘密鍵(d,n)は(3988493,5621977)となります。
- これで,公開鍵(e,n)と秘密鍵(d,n)が求まったので,
Aさんは公開鍵(65537,5621977)だけをBさんに知らせます。
公開鍵の正当性が保証されるような通信路であればどのような方法で知らせてもよく,
Eメールで送っても構いません。ただし,知らせてもよいのは公開鍵だけであり,
d,p,
qなどの値は絶対に知られてはいけません。
以上の作業は鍵生成アプレットを使うと数学的な知識なしに簡単に行えます。
Aさんから公開鍵を受け取ったBさんは,早速上述した暗号化の式(1)を使って,
重要文書M(内容は10000)を暗号化します。
C=10000^65537 mod 5621977 ∴C=4030596
Bさんはこの暗号文C=4030596をEメールに付けて,Aさんに送ります。
Bさんから送られた暗号文を受け取ったAさんは,早速上述した暗号化の式(2)を使って,
暗号文C(内容は4030596)を復号化します。
M=4030596^3988493 mod 5621977 ∴M=10000
以上のような暗号処理により,AさんはBさん以外の誰にも重要文書の元の内容を知られることなく,
無事にその内容Mを得ることができるのです。
暗号化および復号化はRSA暗号アプレットを使って実行してください。
RSA暗号の安全性の前提は,大きな数を素因数分解するのが難しいという仮定であり,
上述した暗号化の式(1)が一方向性である,
つまり攻撃者が暗号文を復号化することが計算量的に困難であるという期待に基づいています。
また,RSA暗号はこれまで多くの人々の間で使われてきましたが,
誰もその破り方を見つけられていないということによって信頼性を得ているわけです。
もし素因数分解を簡単に行うことができれば,RSAを破ることは可能です。
公開鍵(e,n)を知っていて,さらにもしnを因数分解してpとqを知ることができれば,
秘密指数dはそれらから簡単に求められます。
ただし,nを素因数分解することだけがRSAを破る唯一の方法かどうかは分かっていないのが現状です。
ところで,RSAの使い方を誤ると,秘密鍵を知らない者によって,
nを因数分解することなしに暗号文と公開鍵から平文を求められてしまう場合があります。
例えば,選挙で6人の候補者がいる場合に,
その中から一人を選んで彼の名前の文字列を暗号化して送ること(簡単な電子投票)を考えてみましょう。
その場合,送られた暗号データを盗聴した者(公開鍵(e,n)のみを知っている)は,
その暗号データが誰の名前を暗号化したものかが簡単に分かります。
というのは,6人の各候補者の名前をそれぞれ既知の公開鍵で暗号化してみて,
その中から盗聴した暗号データと一致するものを調べれば,
元の投票データがどの候補者の名前であるかが分かるからです。
この場合,盗聴した者は多くとも6通り試すだけで投票内容(平文)を知ることができるのです。
何故このような問題が起こるのかと言えば,RSA暗号の使い方が誤っているからなのです。
この問題は,投票内容である候補者名の前に大きな乱数を連結した上で暗号化することによって解決されます。
例えば乱数の大きさとして64ビットを取れば,投票された暗号データを盗聴した者は,
6通りではなく6*2^64通りの暗号化及び比較をしなくてはならなくなります(それは計算量的に不可能)。
目次 | 第1章 | 第2章 | 第3章 | 第4章
CyberSyndrome - The Proxy Search Engine