encryption

「アイシテルのサイン」から素数の活用まで暗号化で秘密を共有しよう

暗号化とは、文書などのデータを見ても特別な知識なしでは読めないように変換する表記法である。URLが「https://」で始まるWebページなどでこの技術は使われている。ここでは、VBScriptというプログラミング言語を使って、実際に暗号化を行うプログラムを作り、暗号化に対する理解を深める。

1 暗号化とは

暗号化とは、あるデータを見ても特別な知識なしでは読めないように変換する表記法である。暗号化の対象となるデータには、文書や画像など様々な形式のものがある。しかし、コンピュータはあらゆるデータを数値で表すので、データの形式が違っても暗号化の手法は基本的に同じである。ここでは、暗号化の対象を文書データだけとする。

文書データは、様々な文字から構成されている。個々の文字には「文字コード」と呼ばれる数値が割り当てられている。コード(code)とは日本語で符号と訳される。暗号化の「号」は、符号の「号」を意味している。文字コード体系には、ASCII、JIS、シフトJIS、EUC、Unicodeなどがある(2進数によって広がるデジタルデータ表現の基礎知識5選参照)。

暗号化されていない状態の文書データを平文(ひらぶん)と呼ぶ。ネットワークに平文のままで送信すると、データを誰かに盗まれて悪用されてしまう恐れがあるため、暗号化して暗号文にするのである。

暗号化には様々な手法があるが、基本は平文を構成する個々の文字の文字コードを他の数値に変換してしまうことである。暗号化された文書データは、逆変換することで元に戻せる。暗号文を平文に戻すこと(暗号解読)を復号化という。

 

2 文字コードをずらす

暗号化の実際の例として、文字データを構成する個々の文字の文字コードを3つずつずらす(文字コードに3を加える)という手法の暗号化を取り上げる。

hirabun = InputBox(“平文を入力してください”)
angobun = “”
For i = 1 To Len(hirabun)
moji = Mid(hirabun, i, 1)
angobun = angobun & Chr(Asc(moji) + 3)
Next
MsgBox angobun

このプログラムをAngo1.vbsのように拡張子を.vbsとしたテクスト・ファイルとして作成し、適当なフォルダに保存する。Ango1.vbsのアイコンをダブルクリックすればプログラムを実行できる。最初に表示されるウィンドウに暗号化したい文書データ(平文)を入力し[OK]ボタンをクリックする。例えば「kaihooo」と入力すると、「ndlkrrr」と表示される。それぞれの文字の文字コードが3つずつずれていることがわかる。

文字コードを3つずらして暗号化したため、逆方向に3つずらせば復号化できる。文字コードから3を引く(- 3)ことで可能となる。

3を加えることで暗号化し、3を引くことで復号化した。この3のように、暗号化や複合化に使われる数値のことを「鍵」という。3という鍵をデータの送信者と受信者だけの秘密にしておくことで、その二者以外の人には暗号文を復号化することはできない。

次は、個々の文字コードを鍵とXOR演算(eXclusive OR、排他的論理和)することで変換する。

k = InputBox(“鍵を入力してください。”)
kagi = CInt(k)
bun1 = InputBox(“平文または暗号文を入力してください。”)
bun2 = “”
For i = 1 To Len(bun1)
moji = Mid(bun1, i, 1)
bun2 = bun2 & Chr(Asc(moji) Xor kagi)
Next
MsgBox bun2

鍵の値も指定できるようにする。XOR演算の特徴は、暗号化した暗号文を同じXOR演算で復号化できることである。つまり、1つのプログラムが暗号化と復号化の両方に使えるのだ。

XOR演算は、データを2進数で表したときに、1に対応する桁を反転する(0を1に、1を0にする)ものである。反転して暗号化するため、もう一度反転すれば復号化できる。

 

3 鍵の桁数が多いほど解読が困難になる

インターネットでは、暗号化されたデータが盗まれるのを防ぐことができない。そこで、たとえデータが盗まれても解読が困難なようにしておくことが重要である。そのためには、鍵を1桁でなく複数桁にすればよい。

1桁の鍵では0~9の10通りの試行で解読されてしまうが、3桁の鍵なら000~999の1000通りになる。さらに桁数を増やして10桁の鍵にしたら、10の10乗=100億通りの試行が必要になる。これなら、仮に1秒間に100万回の試行が可能なコンピュータを使ったとしても、暗号の解読に100億÷100万回/秒=10000秒≒2.78時間かかる。さらに鍵を1桁増やすごとに、解読にかかる時間は10倍されていく。16桁の鍵にすれば2.78時間×1000000≒317年となり、解読は時間的に不可能だと言える。

 

4 インターネットでの利用に向く公開鍵暗号方式

これまで説明してきた暗号化手法は「共通鍵暗号方式」もしくは「秘密鍵暗号方式」と呼ばれる(ネットワークを安全に利用するための情報セキュリティ基礎知識5選参照)。この暗号化手法の特徴は、暗号化と復号化で同じ値の鍵を使うことである。したがって、鍵の値を送信者と受信者だけの秘密にしておかなければならない。鍵の桁数が多ければ解読を困難にできるが、事前に送信者から受信者に鍵の値を知らせる手段を考えなければならない。つまり、この手法はインターネットに適していない。そのため、暗号化の鍵と復号化の鍵を異なる値にするという「公開鍵暗号方式」が考え出された。

公開鍵暗号方式とは、暗号化の鍵は公開鍵として世界中に知らせ、復号化の鍵は秘密鍵として自分だけの秘密にするものである。だれでも公開鍵を使って暗号化できるが、それを復号化できるのは自分だけなのである。

公開鍵暗号方式を実現するには、いくつかのアルゴリズムがある。ここでは、現在インターネットで広く使われているRSAと呼ばれるアルゴリズムを紹介する。RSAとは、考案者であるRonald Rivest、Adi Shamir、Leonard Adlemanの頭文字を並べた名称である。RSAは、2000年9月20日まで米RSA Securityの独占ライセンスとなっていた。

RSAの仕組みは、「1」と「その数」以外で割り切れない素数を用いた暗号である(図1)。RSA暗号は、「2つの違う素数を掛けた数」と「何乗するかの数」の2つを公開鍵として使用する。Aさんがこの公開鍵を使用して暗号化した文書を受け取ったBさんは、自分の秘密鍵(何乗するかの数)を使って平文に戻す。この時、Bさんの秘密鍵、それから2つの素数は他人に知られてはいけない。そのため、RSA暗号は、2つの素数さえ分からなければ安全なものとなる。またRSA暗号の安全性は素因数分解の難しさ、言うなれば「絶対破られない」のではなく、「鍵を解くまでにかかる膨大な時間」で担保される。

図1.RSA暗号の仕組み

 

5 データの送信者を証明する電子署名

電子署名(ディジタル署名)とは、公開鍵暗号方式を応用したもので、ハンコやサインと同じ証明をネットワークで送信される文書データで実現するものである。以下のような手順で行う。手順の中に出てくるメッセージ・ダイジェストとは、平文を構成するすべての文字コードを使って、何らかの計算式で算出された値のことである。

 

文書データを送る側

  1. 平文を作る
  2. 平文の内容からメッセージ・ダイジェストを作る
  3. メッセージ・ダイジェストを秘密鍵で暗号化する
  4. 平文の末尾に3.を付加して送る

文書データを受け取る側

  1. メッセージ・ダイジェストを公開鍵で復号化する
  2. 平文の部分からメッセージ・ダイジェストを求める
  3. 1.と2.で求めた値が同じならOKである

 

電子署名の特徴は、暗号化に秘密鍵を使い、復号化に公開鍵を使っていることである。これらの秘密鍵と公開鍵は、送信者の鍵である。

メッセージ・ダイジェストは、すべての文字コードを足した結果の下位2桁としている。ただし、実際の電子署名で使われるのは「MD5(Message Digest5)」と呼ばれる複雑な計算式で得られるメッセージ・ダイジェストである。MD5は、平文の内容がわずかでも異なれば、異なるメッセージ・ダイジェストが得られるように工夫されている。

電子署名の要件は2つあり、ハンコやサインに求められることと同じである。(1)送信者が文書データの内容を承認していること。(2)その文書データを送信したのが、確かに送信者本人であることである。送信者は、文書データを構成するすべての文字コードからメッセージ・ダイジェストを作成した((1)の要件)。受信者が求め直したメッセージ・ダイジェストの値と暗号化されたメッセージ・ダイジェストの値が一致したなら、文書データは途中で改ざんされることなく送られ、確かに送信者本人が送信したものであることを意味する((2)の要件)。送信者の秘密鍵で暗号化されたからこそ、送信者の公開鍵で復号化できるからである。

 

最後に

実際に作ってみる。これは本当に理解が進む。暗号化も自分で作り、それが実際に作動すると、素直に感動する。イメージが定着するとともに、これを作成した人への尊敬の念も出てくる。「ある程度短く、何度も再利用でき、受信者に通信で渡せ、かつ第三者による暗号解読が困難」という条件をすべて満たした公開鍵暗号方式を考案した技術者たちに、著者とともに心からの敬意を表したい。

アイシテルのサイン」から素数の活用まで、暗号化はおもしろい。

次回は、XMLについてまとめる。

コンピュータはなぜ動くのか~知っておきたいハードウエア&ソフトウエアの基礎知識~


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>