実践!SMTP

  1. 実習の前準備
  2. telnet を使用した SMTP 体験
  3. メール構造の確認作業
  4. GPG を使用した暗号化, 復号体験
  5. [付録] どこまでが信用できる情報か?

4 GPG を使用した暗号化, 復号体験

[4.1] GPG とは

GPG (GNU Privacy Guard) はフリーの暗号化ソフトです. 単にファイルを暗号化, 復号出来るだけでなく, ファイルに電子署名をつけることもできます.

ここからの実習は二人一組になって行ってもらいます(三人のところはうまくやってください...笑).

[4.2] 鍵ペアの生成

公開鍵と秘密鍵のペアを生成します. 以下は, アカウント名 hoge が鍵を生成する例です.

まず X を立ち上げます.

hoge$ startx


次に端末を立ち上げて鍵のペアを生成するためのコマンドを打ちます. 使うコマンドは gpg です.

hoge$ gpg --gen-key


鍵の設定に関して何項目か質問されるので, 本実習では以下のように設定しましょう.

      gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
      This is free software: you are free to change and redistribute it.
      There is NO WARRANTY, to the extent permitted by law.

      gpg: ディレクトリー「/home/hoge/.gnupg」ができました
      gpg: 新しい構成ファイル「/home/hoge/.gnupg/gpg.conf」ができました
      gpg: 警告: 「/home/hoge/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
      gpg: 鍵輪「/home/hoge/.gnupg/secring.gpg」ができました
      gpg: 鍵輪「/home/hoge/.gnupg/pubring.gpg」ができました
      ご希望の鍵の種類を選択してください:
      (1) RSA and RSA (default)
      (2) DSA and Elgamal
      (3) DSA (署名のみ)
      (4) RSA (署名のみ)
      選択は? 1 [鍵の種類を選択]

      RSA keys may be between 1024 and 4096 bits long.
      What keysize do you want? (2048) 2048 [鍵のサイズを選択]
      要求された鍵長は 2048 ビット
      鍵の有効期限を指定してください。
           0 = 鍵は無期限
           <n>  = 鍵は n 日間で満了
           <n>w = 鍵は n 週間で満了
           <n>m = 鍵は n か月間で満了
           <n>y = 鍵は n 年間で満了
      鍵の有効期限は? (0) 0 [鍵の有効期限を選択(0 は無制限)]
      Key does not expire at all
      これで正しいですか? (y/N) y [この設定でいいのか確認]

      あなたの鍵を同定するためにユーザーIDが必要です。
      このソフトは本名、 コメント、 電子メール・アドレスから
      次の書式でユーザーIDを構成します:
            "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

      本名: HOGE Hoge [フルネーム]
      電子メール・アドレス: hoge@eis.hokudai.ac.jp [メールアドレス]
      コメント: test [コメント]
      次のユーザーIDを選択しました:
       "HOGE Hoge (test) <hoge@eis.hokudai.ac.jp>" 

      名前(N), コメント(C), 電子メール(E)の変更、 または OK(O)か終了(Q)? O [鍵のID 情報に変更がなければO(ローマ字のオー)]
      秘密鍵を保護するためにパスフレーズがいります。

      パスフレーズを入力: (password)  [鍵を使う際に必要なパスワードの入力]
      パスフレーズを再入力: (password) [パスワードの確認]

      今から長い乱数を生成します。 キーボードを打つとか、 マウスを動かす 
      とか、 ディスクにアクセスするとかの他のことをすると、 乱数生成子で 
      乱雑さの大きないい乱数を生成しやすくなるので、 お勧めいたします。
      +++++  
      ....+++++
      今から長い乱数を生成します。 キーボードを打つとか、 マウスを動かす
      とか、 ディスクにアクセスするとかの他のことをすると、 乱数生成子で
      乱雑さの大きないい乱数を生成しやすくなるので、 お勧めいたします。
      +++++
      ....+++++
      gpg: /home/hoge/.gnupg/trustdb.gpg: 信用データベースができました 
      gpg: 最小の「ある程度の信用」3、 最小の「全面的信用」1、 PGP信用モデル
      gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
      pub   2048R/XXXXXXXX 2016-07-07                                     
                指紋 = XXXX XXXX XXXX XXXX XXXX  XXXX XXXX XXXX XXXX XXXX
      uid                  HOGE Hoge (test) <hoge@eis.hokudai.ac.jp>
      sub   2048R/XXXXXXXX 2016-07-07

鍵を生成している間はマウスなどを動かしたり,ソフトを起動するなりしてOS に負荷をかけましょう. また, 違うターミナルを開いて, 以下のコマンド(ディスクアクセス)を数秒行うことで早く終わることもあります. 数秒待ったらCtrl キーとC で抜けましょう.

$ dd if=/dev/urandom of=/tmp/mass bs=1M count=16384

今生成した公開鍵が自分の所有する公開鍵リストに登録されていることを確認しましょう.

hoge$ gpg --list-key
-------------------------------------------------------------
pub   2048R/XXXXXXXX 2016-07-07
uid                  HOGE Hoge (test) <hoge@eis.hokudai.ac.jp>
sub   2048R/XXXXXXXX 2016-07-07

このとき, "2048R" は鍵の長さ(bit), 後半の文字列(XXXXXXXX)は鍵のID です. また,今生成した秘密鍵も自分の所有する秘密鍵リストに登録されていることを確認しましょう.

hoge$ gpg --list-secret-key
-------------------------------------------------------------
sec   2048R/XXXXXXXX 2016-07-07
uid                  HOGE Hoge (test) <hoge@eis.hokudai.ac.jp>
sub   2048R/XXXXXXXX 2016-07-07

これで公開鍵・秘密鍵の設定は終了です.ペアの受講生も同様にして 鍵を作成しましょう.以下では hoge さんの相方のアカウント名を hero として進めていきます.

hero$ gpg --gen-key
 "HERO Hero (test) <hero@eis.hokudai.ac.jp>"

[4.3] 鍵のエクスポート, インポート

お互いの公開鍵を登録します. 以下の例は hero さんが hoge さんの公開鍵を登録する手順です.

まず hoge さんが自分の公開鍵を hoge_pub-key.asc という名前のアスキー形式ファイルとしてエクスポートします.

hoge$ gpg -a --export hoge@eis.hokudai.ac.jp > hoge_pub-key.asc
--> -a は出力されるファイルをアスキー形式と指定するオプション

gpg は使用する鍵の ID の指定を鍵作成の際に登録したメールアドレスや, Key ID で行います. また, アスキー形式なので自分で鍵の中身を見ることもできます.

  hoge$ less hoge_pub-key.asc
  -----BEGIN PGP PUBLIC KEY BLOCK-----
  Version: GnuPG v1

  (中略)

  -----END PGP PUBLIC KEY BLOCK-----
  

次に hero さんが hoge_pub-key.asc をインポートします.

hero$ gpg --import /home/hoge/hoge_pub-key.asc

正しくインポートされたか確認.

hero$ gpg --list-keys
--------------------------------------
pub   2048R/YYYYYYYY 2016-07-07
uid                  HERO Hero (test) <hero@eis.hokudai.ac.jp>
ssd   2048R/YYYYYYYY
pub   2048R/XXXXXXXX 2016-07-07
uid                  HOGE Hoge (test) <hoge@eis.hokudai.ac.jp>
ssd   2048R/XXXXXXXX 2016-07-07

[4.4] ファイルの暗号化, 復号

それでは, いよいよファイルを暗号化, 復号する実習をしましょう. 以下の例では, hero さんが hoge さんの公開鍵で暗号化し, hoge さんが自分の秘密鍵で復号する例です.

まず, hero さんが暗号化するためのテキストファイルを作成します.

hero$ echo "hello World" > /home/hero/hello.txt

hello.txt を hoge さんの公開鍵で暗号化します.

hero$ gpg -a -r hoge@eis.hokudai.ac.jp -e /home/hero/hello.txt
---------------------------------------
gpg: XXXXXXXX: この鍵が本当に本人のものである、 という兆候が、 ありません

pub   2048R/XXXXXXXX 2015-07-10 HOGE Hoge (test) <hoge@eis.hokudai.ac.jp>
 主鍵の指紋: XXXX XXXX XXXX XXXX XXXX  XXXX XXXX XXXX XXXX XXXX
 副鍵の指紋: YYYY YYYY YYYY YYYY YYYY  YYYY YYYY YYYY YYYY YYYY

この鍵は、 このユーザーIDをなのる本人のものかどうか確信できません。 
今から行うことを * 本当に * 理解していない場合には、 
次の質問にはnoと答えてください。

それでもこの鍵を使いますか? (y/N) y

hello.txt.asc というファイルが作成されているはずなので, 本当に暗号化されているか 中身を見てみましょう!

hero$ less /home/hero/hello.txt.asc

無事に暗号化されていれば,あなたには読めなくなっているはずです.

次に hoge さんが hello.txt.asc を自分のホームディレクトリにコピーします.

hoge$ cp /home/hero/hello.txt.asc /home/hoge/

最後に hoge さんが hello.txt.asc を自身の秘密鍵で復号する.

hoge$ gpg hello.txt.asc
------------------------------------
次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります: "HOGE Hoge ( test ) "
2048ビットRSA鍵, ID XXXXXXXX作成日付は2016-07-07 (主鍵ID XXXXXXXX)

パスフレーズを入力:(先ほど入力したパスワード)
gpg: 2048-ビットRSA鍵, ID XXXXXXXX, 日付2016-07-07に暗号化されました
       "HOGE hoge ( test ) "

hello.txt が生成され, 中身がもとのものと一致すれば成功!

hoge$ cat /home/hoge/hello.txt

[4.5] 電子署名

通信経路の途中で改竄されていないかどうかを検証可能なように電子署名をつけることも出来ます.

まず, hero さんが電子署名を施すためのテキストファイルを作成します.

hero$ echo "Check digital sign" > check_digital_sign.txt 

次に, check_digital_sign.txt の内容をそのまま含みアスキー形式の署名を結合した check_digital_sign.txt.asc を作成します.

hero$ gpg --clearsign -s -a check_digital_sign.txt 

次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:"HOGE hoge (test)  "
2048ビットRSA鍵, ID EB9CBEDF作成日付は2016-07-07

パスフレーズを入力:[鍵ペアを作成した際につけたパスワードを入力]

中身の確認をする.

hero$ less check_digital_sign.txt.asc 

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Check digital sign
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJXfT4hAAoJEN4cvwvrnL7fW4sIAL/+wM8MuuET+BvW12O+b4Xb
zPjUmkmX3bPRUa585kvzanlwrnx0lCtqFt8gyEEfhHwtOyI5Ano0HlJJmmwv8s4f
Z7zt273YeEVtCShIYePiFMIhXX13bWFzd8YDEO1bZ1VSeoJvsC1fEh6x6omnKERI
BZPe5PdnweWpGMtlU3lgKxgPFB/mny8RWRHqgMK8/nJ/a3B00fZo7AzP/5WDTmo/
92islQes10BqF0E6GVETl9I6U9wjsrEDDisUvrPa3SV13n+Gfk4C5H7VLpya+vwB
WYz8/63mmJVykT1I5fUO7XU+4wgAJpi3GFFwdMut/ArGLJj9dCQGUU7thG6BUTA=
=3WkQ
-----END PGP SIGNATURE-----

hoge さんが署名の検証をします.

      hoge$ cp /home/hero/check_digital_sign.txt.asc /home/hoge/
      hoge$ gpg --verify check_digital_sign.txt.asc 

内容の改竄がない場合には, 以下のようなメッセージが表示されます.

      gpg: 2016年07月07日 02時21分37秒 JSTにRSA鍵ID EB9CBEDFで施された署名
      gpg: "HERO hero (test) <hero@eis.hokudai.ac.jp >"からの正しい署名

次に, 改竄されたファイルと電子署名の整合性の確認をします.まず, hoge さんがcheck_digital_sign.asc の中身を編集します.

hoge$ cp check_digital_sign.txt.asc check_digital_sign.txt.asc_backup 
hoge$ vi check_digital_sign.txt.asc 
"Check digital sign" を "Falsify digital sign" などに変えてみる.

改竄したファイルの署名の検証を行います.

hoge$ gpg --verify check_digital_sign.txt.asc

内容の改竄がある場合には, 以下のようなメッセージが表示されます.

      gpg: 2016年07月07日 02時21分37秒 JSTにRSA鍵ID EB9CBEDFで施された署名
      gpg: "HERO hero (test) <hero@eis.hokudai.ac.jp >"からの 不正な署名

実際に電子メールで暗号化やデジタル署名を行う際には, メーラや暗号化ソフトによって方法が異なりますので, ここでは詳細は割愛します. OS:Windows で, メーラ:Thunderbird の場合の暗号化, 電子署名の方法についてはここを参照してみてください. その他については自分で調べてみてください.

[4.6] 鍵の失効

もし自分の秘密鍵を失くしてしまったり, 盗まれたり, 安全上の問題から変更が必要となったときは, 鍵を失効させましょう. まず, 鍵の失効証明書を作成します. 自分用の鍵のペア(秘密鍵と公開鍵)を作成したときには必ず失効証明書を作成して, 紙にプリントアウトするなりCD-ROM などの書き換え不可なメディアに保存して,必要とされる時までオンラインにならない場所に 保管しましょう. 今回はここまではしませんが, 自分が公開鍵を用いて通信をし, 鍵を失効する必要がある場合には, 滞りなく この作業ができるようにしておきましょう.

まずheroさんが 鍵の失効証明書を作成します.

hero$ gpg --gen-revoke hero@eis.hokudai.ac.jp > expired_key.asc 

sec  2048R/XXXXXXXX 2016-07-07  HERO hero (test) < hero@eis.hokudai.ac.jp >

この鍵にたいする失効証明書を作成しますか? (y/N) y
失効の理由を選択してください:
0 = 理由は指定されていません
1 = 鍵がパクられました
2 = 鍵がとりかわっています
3 = 鍵はもう不用です
Q = キャンセル
(ここではたぶん1を選びます)
あなたの決定は?  3 
予備の説明を入力。空行で終了:
> [Enter]
失効理由: 鍵はもう不用です
よろしいですか? (y/N) y

次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります: "HERO hero ( test ) "
2048ビットRSA鍵, ID XXXXXXXX作成日付は2016-07-07

パスフレーズを入力:[鍵ペアを作成した際につけたパスワードを入力]

ASCII包装出力を強制します。
失効証明書を作成しました。

見つからないような媒体に移動してください。もしワルがこの証明書への
アクセスを得ると、そいつはあなたの鍵を使えなくすることができます。
媒体が読出し不能になった場合に備えて、この証明書を印刷して保管するの
が賢明です。しかし、ご注意ください。あなたのマシンの印字システムは、
だれでも見える場所にデータをおくことがあります!

ここで, 出来た鍵の失効証明書を読み込みます.

hero$ gpg --import expired_key.asc 

鍵が失効したかを確認しましょう.

hero$ gpg --list-keys 
pub   2048R/XXXXXXXX 2016-07-07 [失効: 2016-07-07]
uid                  HERO hero (test) < hero@eis.hokudai.ac.jp >

また,失効済みの鍵自体を削除してしまいましょう.

hero$ gpg --delete-secret-and-public-key [公開鍵のID]  
gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


sec  2048R/XXXXXXXX 2016-07-07 HERO hero (test) <hero@eis.hokudai.ac.jp>

	この鍵を鍵輪から削除しますか? (y/N) y
	これは秘密鍵です! 本当に削除しますか? (y/N) y

pub  2048R/XXXXXXXX 2016-07-07 HERO hero (test) <hero@eis.hokudai.ac.jp>

	  この鍵を鍵輪から削除しますか? (y/N) y

最後に失効証明書を削除してしまいましょう(普通は大切に保管しておく必要がある).

hero$ rm  expired_key.asc 
> 時間が余った人は [付録] へ


最終更新日: 2016/07/06 三上 峻 2016年度用に更新 Copyright © 2000-2016 inex