PGP

PGPって何?

今日、インターネットが普及して電子メールが当たり前のように使用されてます。しかし、電子メールは簡単に傍受や複製が出来ちゃいます。「はがき」みたいなものなのです。見ようと思えば、見れますよね。
例えば、 といった場合、困りますね。

そこで、プライバシーを守るべく作られたのが、PGP(Pretty Good Privacy)です。
そこで、メールを「封筒」に入れちゃえば読まれません。
PGPの場合、手紙に封をするのに使用するのが公開鍵暗号です。







● まえがき ●


 PGP(Pretty Good Privacy)は、アメリカの Philip R. Zimmermann によって作られ、インターネット上で無料で配布された暗号化プログラムです。
 PGP は公開鍵暗号(Public Key Cryptoraphy)という方式を用いて暗号化し、受け取った相手にしか元の文書を再構成して読めないようにすることができます。


 PGP では RSA というアルゴリズムを使用しています。 RSA には特許が成立しており、アメリカ国内においてRSA アルゴリズムを実装したソフトウェアを無料で配布するためには、RSA Data Security Inc. の RSAREF ライブラリを使用しなければなりません。
そして、アメリカでは暗号も武器だとみなされるのです。そのためアメリカ国外に RSAREF ライブラリを持ち出す事は出来ません。
しかし、RSA アルゴリズムに対する特許はアメリカ国内だけであり、アメリカ国外で開発されたRSA暗号化プログラムはアメリカ国外では自由に利用することができます。
そんな、RSAREF 互換ライブラリが MPILIB です。
PGP 国際版は RSAREF を MPILIB で置き換えたものであり、アメリカ国外では自由に利用することができます。
しかし逆に、PGP 国際版は RSAREF を使用していないため、アメリカ国内では使用できません。

 以上のように PGP は、アメリカ国内版と、国際版に別れていますが、結局、法律上の理由であって原理や動作結果に差はありません。

 ただし、そもそも、暗号の使用を制限、または禁止している国があるので、そのような国では注意が必要です。

国際版の PGP は、ノルウェーに住む Ståle Schumacher により開発、配布されています。現在、国際版 PGP は、国際的な開発チームにより、Internet 上のメーリングリストを通じて、保守・サポートが行われています。




● 公開鍵暗号 ●


公開鍵暗号とは、暗号化と復号化を別々の鍵で行う方法です。この、それぞれの鍵を「公開鍵」と「秘密鍵」といい、必ず対として作られます。あなたの「公開鍵」で暗号化された文書は、あなたの「秘密鍵」でしか復号化できないようになっています。

 「公開鍵」とは、文字どおり世間に公開するための鍵のことです。誰でも見ることができ、それが誰の鍵であるかわかるようになっています。公開の場は、「 PGP 公開鍵サーバ」や個人のWWW のページ等があげられます。(もちろん名刺に印刷したっていいし、チラシにして配ってもいいんです。)
公開鍵と呼ばれるのは、この鍵をセキュリティを低下させることなく 公開することが出来るからである。

 「秘密鍵」とは、これまた文字どおり秘密の鍵のことです。この鍵は自分以外の誰にも教えてはならない鍵です。

 例えば、私が東京営業所のN氏に新製品の情報を送るとします。
  • 私はまず、N氏の公開鍵を手に入れます。
  • 次に、N氏の公開鍵で新製品の情報を暗号化して送ります。
  • こうして出来たメッセージは、N氏の秘密鍵でしか復号化できないため、ライバル社のS氏がこのメッセージを手に入れても、N氏の秘密鍵が無い限り内容は読めません。
ここで肝心な事は、私がN氏の本当の鍵を手に入れるという事です。
詳しくは、公開鍵の保証で説明します。




● 電子署名 ●


電子署名の機能としては、
  • ファイルまたはメッセージが改竄されたかどうかわかる。
  • メッセージに署名した人物の名前を数学的に確認することができる。
があげられます。

実際には、MD5要約関数というものを使用してメッセージから128ビットの数を作り、 その数を秘密鍵で暗号化し、元のメッセージに付加します。
電子署名されたメッセージを受け取った人は、 署名した人の公開鍵で要約関数を復号、 その数と受け取ったメッセージのMD5コードを比較し、 一致して入れば「そのメッセージは改竄されていない。 」と判断します。

このようにして、「これは私が書いたものです。」ということが証明できるのです。





● 公開鍵の保証 ●


公開鍵を相手に渡したり、相手から公開鍵をもらうにはどのような方法があるでしょうか。
  • 直接会って渡す
  • 電話やFAXで伝える
  • 電子メールで送る
  • WWW のページに置いておく
等、いろいろな手段があるでしょう。もちろん、どんな方法を使ってもかまいません。 ただし、これらの方法であなたが手に入れた、あるいは相手が手に入れた鍵が、本物であるという保証は有りません。
誰かが鍵の本当の所有者になりすましているかもしれませんし、ネットワーク経由で手にいれたのならば、途中で改竄が加えられているかもしれません。


こんなことでは、安心して使える公開鍵を手にいれるには、相手に一度は直接会って顔を確認して鍵をもらわなければなりません。しかし、実際に会った相手としか安全な通信ができないなんて、ネットワークを使っている意味がありません。
そこで、直接会ってもらった公開鍵でなくても、送りたい相手の本当の公開鍵であることを証明する方法があります。電子署名を使えばいいのです。


「PGP で公開鍵に署名する」、というのは、「Lhaの実行ファイルをlzh形式で配布する」というのと同じような奇妙な感じがするかもしれません。たしかに、自分の秘密鍵で自分の公開鍵に署名しても、その署名を検証するにはその公開鍵が必要なのですからあまり意味のあることではありません。
そこで、誰か他の人に、あなたの公開鍵に署名してもらうのです。署名した人が十分に信用されている人なら、その人の署名が入ったあなたの公開鍵もほんとうにあなた自身のものだということが証明されたことになるでしょう。
要するに、「友達の友達は、みな友達だ」なのです。


手元にある公開鍵が改竄されていないことを知るためのもう一つの方法として、直接会わずに、本人に鍵が本物であることを証明してもらう方法があります。
それは、「キーの指紋」を使う方法です。
公開鍵自体はファイルとしてみれば小さなものですが、それを手で入力したり、電話で読み上げたりするのは、かなり大変です。
PGP では、公開鍵からその鍵の特徴を現す「キーの指紋」を作ることができます。
世界中に無数に存在する鍵の中には、同じ指紋を持つ鍵も存在するかもしれません。しかし、その確率はごく低いものです。この指紋は、実際には以下のような形をしています。


8D D5 99 18 AA 08 7E 6B 0C 10 D0 E8 78 DC 9D 3C

これは私の公開鍵の指紋です。
あなたが私の公開鍵を手に入れたとき、それが通信中や、WWW サーバ上で改竄されていたりしないことを確認するには、PGP を使って手に入れた公開鍵の指紋を出力して、私に電話してそれが正しいことを確認するか、あるいは上に書いた指紋と一致するかどうかを確認すれば十分です。(でも、WWW サーバ上で改竄されていたら、これもだめでしょうねぇ)


あとは、WWW のページ等に公開鍵を置いて、あとはメールメッセージの署名部分にキーの指紋を書いておく、という方法がよくとられます。(私もそうしています。)
個々のメッセージは改竄されることがあるかもしれませんが、あなたが発信した数多くのメッセージ全てが改竄されることはあまり無いだろう、ということです。




● 安全性 ●


まず、 PGP で暗号化されたメールが「第三者に内容を知られることがない」ということが、保証されています。
しかし、もし「秘密鍵」が誰かの手に渡ってしまったら・・・。
それだけではまだ復号化されることはないです。というのも、「秘密鍵」を使うためには暗号フレーズが必要だからです。3つ目の鍵とみたいなものです。

要するに、暗号フレーズを知らない限りフロッピーやコンピュータごと(「秘密鍵」はファイル化されています。それに対し暗号フレーズは必ず秘密鍵を使用するときに入力します)盗まれようが暗号文は復号化されることはないということです。

でもこの暗号フレーズまでも知られたらもうおしまいです。ですから、ありふれた言葉を暗号フレーズにしたり、短い暗号フレーズにすることは、暗号フレーズ自体がばれてしまう可能性が高くなるため危険です。名前や生年月日など、自分から連装される物は暗号フレーズに選ばない方がいいと思われます。




● 漢字コードの問題 ●


日本語のメッセージを扱う場合、漢字コードに注意する必要があります。
日本でよく使われている漢字コードには、「JIS(ISO-2022-JP)」、「シフトJIS」、「EUC」が有ります。
同じ文章でも漢字コードが違えば、 MD5コードは変わってきます。
つまり、署名するときの漢字コードと、認証するときの漢字コードが同一でないと意味がありません。

特に、DOS や Windows で使用する漢字コードはシフトJIS コードですが、インターネットでは JIS コードと定められています。そこで、一般的な DOS や Windows のメールソフトではシフトJIS コードで入力されたテキストデータを JIS コードに変換してから送信するようになっています。
同様に、UNIX用のメールソフトでは、EUCコードで入力されたテキストデータを JIS コードに変換します

そこで、インターネットのメールでは JIS コードに対して署名すべきなのです。

さて、そこで又一つ問題が出てきます。
日本語のメールを送信する場合、一般にはメールソフトが送信する瞬間にシフトJIS(またはEUC)から JIS コードへ変換して送信します。
ここで、PGPで暗号化するときのことを考えます。 メールソフトがPGPに対応していない場合、 JIS コードで書かれたメール本文に対して暗号化を行うチャンスがありません。そこで、nkfなどを用いてメール本文を JIS コードに変換し、これに対してPGPで署名します。この暗号データをメールソフトにコピーして送信する必要があります。
この面倒を避ける方法は3つです。
  1. PGP対応メールソフトを使う。
  2. PGP 5.5.3iと、日本語化ファイルを使う。
  3. PGPフロントエンドツールの GOMA 等を使う。
    (10/5現在、Goma 1.01はIE 4.0をインストールすると動かなくなります。) (Goma V1.02 beta1で対応済 11/6確認)
  4. 我慢して前述の手順で運用する。
当然のことながら、PGP対応メールソフトを使用するのがいちばん便利です。


PGP 5.5.3i には「Eudora」、「Outlook/Exchange(受信トレイ)」用のプラグインが、標準で入っています。
また、「Outlook Express」用プラグインも有ります。
ただし、これらのプラグインは、SJISに署名しています。
ネットワーク アソシエイツ株式会社の「PGP personal edition Ver. 5.5.3j」 でも同様にSJISに署名してしまいます。
JISに署名するバージョンとしては、クニリサーチインターナショナルが「PGP 5.5.3i日本語版」を現在βテスト中です。配布方法、配布時期につきましては現在検討中だそうです。

PGP 2.6.3ia 対応メールソフトには以下のものが有ります。

Becky!PGPの出力を埋め込むTomonori Norimatsu氏作 シェアウェア \4,000-
私はこれを使ってます。 (^^;
AL-MailPGPの出力を埋め込む中村匡志氏作 シェアウェア \2,000-
AddMenuというプラグインを通してPGPを扱います。ただし、そままだとシフトJISで暗号化や署名をしてしまいますので、ちょっとだけ設定を変更する必要があります。
WinbiffPGPの出力を埋め込むオレンジソフト シェアウェア \3,000-。
Gomaを利用する。
akira32GoldRFC2015準拠黒木 茂氏作 シェアウェア \4,500-。
Becky!とは実装方法が違うので、PGP署名メールについての相互認証はできないようです。
akira32Goldで暗号化したものをBecky!で復号化はできますが、逆は失敗します。
電信八号RFC2015準拠石岡 隆光氏作 フリーウェア
山田 智史氏作の電信八号拡張メニューPGP暗号化を追加してPGPを扱います。
EdMaxPGPの出力を埋め込む宮崎年之氏作 シェアウェア \3,500-
このメーラは現在(Ver1.24)シフトJISで暗号化や署名をしてしまいます。
Ver1.27にて修正されました。
他にも対応メーラがあるようでしたらお知らせ下さい。

mkoma@mx.biwa.ne.jp

インストール (2.6.3ia)   インストール (5.5.3i)

PGPホーム