おざなりな暗号とセキュリティーのページ

目次


暗号・プライバシー保護リンク

●標準的コミュニケーションツール「PGP」
 プラットホームの多さや知名度の面で標準と言っても良いツール。
 暗号の本来の目的を考えれば、互換性とか標準などという概念は、全くもって矛盾していると言える。しかし、秘密の保持ではなく、コミュニケーションの際のプライバシー保護という意味では、「誰もが使える強力な暗号」という概念が必要になる。その意味でPGPは最適のツールだろう。したがって私はPGPを秘密保持のためのツールではなく、あくまでもコミュニケーションのためのプライバシー保護ツールであると考える。
 PGPの概要や原理、入手、セットアップ、操作法などは、ここで下手な説明をするよりも、以下に示すページで読んでもらったほうが良いだろう。

●その他の暗号化・プライバシー保護ツール
 個人の秘密を守ることだけが目的の場合には、暗号の方式はおろか暗号を使っていることさえも知られていないほうが良いに決まっている。互換性などは不要な概念であり、自分だけが使えれば良いということになる。以下で紹介するツールの多くはプラットホーム依存だが、目的を考えれば、そのほうが好都合だと言える。

●なぜ「暗号」なのか?
 秘密とプライバシーは違う。また、暗号は、秘密を守る、プライバシーを守るばかりでなく、情報を共有するためにも役立てることができる。


実践・RSA公開鍵暗号/ディジタル署名の原理

 PGPなどを使用する際、誰もが疑問に思う「公開鍵」という概念を説明するプログラムをJavascriptでつくってみた。
 ここでは、例としてRSA公開鍵暗号/ディジタル署名を取り上げる。かなり簡易的な実装であり、一部は誤魔化しているが、どのような仕組みによるものなのかを理解することはできると思う。


鍵の生成

Step0 10以上100未満の素数は次のとおり。
11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97

Step1 任意の素数を入力すると、公開鍵(1)となるnと、以下の計算で必要になるλが計算される
 <n=p*q, λ=LCM(p-1,q-1) ただしLCMは最小公倍数>
素数p(任意)
素数q(任意)
公開鍵(1)n
(各素数-1)の最小公倍数λ

Step2 公開鍵(2)となるeは上の計算値λ以下で、λとは互いに素(1以外に約数がない数)。簡単にはλを割り切れない小さな素数を選べば良い(間違えないように)。そして秘密鍵dが得られる
 <ed=1 mod λ>
公開鍵(2)e(任意)
(各素数-1)の最小公倍数λ
秘密鍵d
eの確認用:
λ ÷ e 答(小数ならOK)

RSA暗号

Step1 平文mはn以下の整数(大きい数字を暗号化する場合には区切って使えば良い)、それぞれの公開鍵を入力
 <c=memod n>
平文m(任意)
公開鍵(2)e
公開鍵(1)n
暗号c

Step2 暗号文cと秘密鍵d、公開鍵(1)nを入力
 <m=cdmod n>
暗号c
秘密鍵d
公開鍵(1)n
平文m
 公開鍵nとeを公開しているわけなので、nからp,qがわかってしまった場合には秘密鍵dが計算できてしまう。だが、nが十分に大きいと素因数分解するのがたいへん困難なので、その難しさが暗号の強度になっている。


RSAディジタル署名

Step1 通信文m(m<n)に対する署名sの生成は、自分が持つ秘密鍵によって行い、mとsを送信する。
 なお、ハッシュ関数h(m)とは、この場合にはh(x)=h(y)である(x,y)を特定することが困難な関数である(代表的なものとしてSHAなどがある)。しかし、ここではハッシュ関数を使わず(だって面倒なんだもん)、簡単にごまかしてある。したがって計算の過程だけを参照し、数値は信用しないこと。
 <s=h(m)dmod n>
通信文m(任意)
秘密鍵d
公開鍵(1)n
署名s
参考:関数h(m)

Step2 通信文mからh(m)を求め、署名sおよび公開鍵(1)eによって計算される結果とを比較する。合っていればOK。
 <h(m)=semod n>
通信文m
署名s
公開鍵(2)e
公開鍵(1)n
計算結果
関数h(m)
 なぜ関数h(m)を使うのか。m=semod n によって適当なsからmを計算すれば、公開鍵eだけで何らかの通信文mに対する署名sが作れてしまうからである。h(m)を使うことで、適当なsからh(m)の値は求められるものの、h(m)の値からmを求めるのは困難なので、sに対応したmを作ることも困難ということになる。

■参考文献
(1)「現代暗号」、産業図書。


Enigma――驚異の電気・機械式暗号機

 Enigmaとは、ドイツで開発され、第二次世界大戦中に軍用として使われた暗号機械である。下のリンクで形を見ることができるが、タイプした文字が、対応する文字に置換されることによって暗号が作られる。一文字打つごとに複数のロータが回転して対応表が変わるので、たとえ同じ文字を続けて打っても違う文字が出力されるようになっている。ロータの設定は可変で、出力パターンを変えられるので、それだけ強度が増す。復号は、同じ設定のEnigmaに暗号文を入力することで行う。
 はっきり言って、これを考えた人は凄いと思わず感動してしまう(それに対抗した
アラン・チューリングの解読器(Bombe)も凄いが)。
 ここで紹介するにあたり、その動作を体験できるアプレットを下に示す。
 なお、このアプレットは、Virtual Enigmaよりコードをダウンロードしたものである。同ページではアプレットへのリンクが途切れており(実際にはここ)、また是非ともこの感動をすぐに体験していただきたいので、張り付けてしまうことにした。

使い方
(1)「Text Enterd」に適当な文字列を入力する
(2)「Text Output」に出力された暗号文を書きとめ、リセットする
(3)「Text Enterd」に暗号文を打ち込めば元の文が出力される
(4)「Trace Diagram」で暗号発生の様子が観察できるが、これはかなり感動する。特に一つのキーを押しっぱなしにしてみると各ロータの回転する様子が観察できて非常に興味深い。どのようにして長周期の乱数もどきを発生させているのかがわかる。


●Enigmaリンク
ご意見、ご希望、指摘等は大歓迎です→

戻る