実践!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.9; Copyright (C) 2008 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.

ご希望の鍵の種類を選択してください:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (2) DSA (署名のみ)
   (5) 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
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
秘密鍵を保護するためにパスフレーズがいります。

パスフレーズを入力: (password) 
パスフレーズを再入力: (password)

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



--> 鍵の種類を選択




-->鍵のサイズを選択










-->鍵の有効期限を選択
(0 は無期限) -->この設定でいいのか確認 -->鍵の持ち主の user ID 登録 -->実名 -->メールアドレス -->コメント -->鍵の ID -->鍵の ID 情報に変更がなければ O (ローマ字のオー) -->鍵を使う際に必要なパスワードの入力 -->パスワードの確認 -->鍵を生成している間は
マウスを動かしたり, 何かソフトを起動する
などして OS に負荷をかける. -->生成完了

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

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

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

hoge$ gpg --list-secret-key
-------------------------------------------------------------
sec   XXXXX/XXXXXXXX 2015-07-10
uid                  HOGE Hoge (test) <hoge@eis.hokudai.ac.jp>
ssb   XXXXX/XXXXXXXX 2015-07-10

これで公開鍵・秘密鍵の設定は終了です.ペアの受講生も同様にして 鍵を作成しましょう.以下では 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 の指定を鍵作成の際に登録したメールアドレスで行います.

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

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

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

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

    [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   XXXXX/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$ lv /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作成日付は2015-07-10 (主鍵ID XXXXXXXX)
    
    パスフレーズを入力:(先ほど入力したパスワード)
    gpg: 2048-ビットRSA鍵, ID XXXXXXXX, 日付2015-07-10に暗号化されました
           "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.asc を作成します.

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

    中身の確認をする.

    hero$ less check_digital_sign.asc 
    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1
    
    Check digital sign
    
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.1 (GNU/Linux)
    
    iD8DBQFDMO+NNMDDrHHPN+8RAhgEAJ4q8ydiqojZ7xOME5gzdQ5+Mg1fpgCfRTw4
    ymTOUqV8xHPDcUl072kyc6E=
    =zXPA
    -----END PGP SIGNATURE------
    

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

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

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

          gpg: 2005年09月21日 14時28分45秒 JSTにDSA鍵ID 71CF37EFで施された署名
          gpg: “Noriyuki Kitaura (foobar) ”からの正しい署名
    

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

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

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

    hoge$ gpg --verify check_digital_sign.asc
    

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

          gpg: 2005年09月21日 14時28分45秒 JSTにDSA鍵ID 71CF37EFで施された署名
          gpg: “Noriyuki Kitaura (foobar) ”からの 不正な 署名
    

    [4.6] 鍵の失効

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

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

    hero$ gpg --gen-revoke [公開鍵 のID] > expired_key.asc 
    

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

    hero$ gpg --import expired_key.asc 
    

    これで鍵が失効しました. 最後に, 失効済みの鍵自体を削除してしまいましょう.

    hero$ gpg --delete-secret-and-public-key [Key のID] 
    
    > 時間が余った人は [付録] へ


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