2. 実習

表記法: 以下の資料で、ターミナルでの操作を四角で囲って表す。タイプする文字列は 赤色 で表記する。その際、行末では改行(エンター/リターンキー)を入力する。資料作成者のコメントは 青色 で表記する

コマンド例
$  cal 
    April 2015
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

gpg による暗号化と署名

この演習では、暗号化と署名のソフトウェアとして gpg を使う。以下の点で「情報」で扱うのに相応しいと判断した。

共通鍵暗号

応用: 画像やPDFなども同様に暗号化して送ることが出来る。

公開鍵暗号

公開鍵暗号では、 公開鍵 秘密鍵 を使い分ける (教科書4.3節を参照)。

秘密鍵が盗まれると? .. 本人でなくても、本人宛の暗号文を読むことができる。本人でなくても、本人をなりすまして署名できる。

鍵ペア (秘密鍵, 公開鍵) の作成

まずは、秘密鍵と公開鍵のペアを各自で作成する。そのうち、公開鍵を友達に配ると、公開鍵暗号を使う準備が完了する。ステップごとに順次実習する。

鍵ペアの作成
$  gpg --gen-key 
ご希望の鍵の種類を選択してください:
(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 ビット
鍵の有効期限を指定してください。
       0 = 鍵は無期限
    <n>  = 鍵は n 日間で満了
    <n>w = 鍵は n 週間で満了
    <n>m = 鍵は n か月間で満了
    <n>y = 鍵は n 年間で満了
鍵の有効期間は? (0)  0 
Key does not expire at all
これで正しいですか? (y/N)  y 
 (ECCSでは、
  gpg: Segmentation fault caught ... exiting
  Segmentation fault: 11
 というエラーが発生する場合がある。そのときは鍵の有効期間として「10y」を入力すること)

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

本名:  Tanaka Taro  (自分の名前で置き換える) 
電子メール・アドレス:  tanaka@example.com  (自分のアドレスで置き換える) 
次のユーザー ID を選択しました:
    "Tanaka Taro <tanaka@example.com>"

名前 (N)、コメント (C)、電子メール (E) の変更、または OK(O) か終了 (Q)?  O 
秘密鍵を保護するためにパスフレーズがいります。
パスフレーズを入力:  (秘密の文字列を入力してエンター) 
パスフレーズを再入力:  (秘密の文字列を入力してエンター) 

今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きいいい乱数を生成しやすくなるので、お勧めいたします。
gpg: 鍵 BDF88D06 を絶対的に信用するように記録しました
公開鍵と秘密鍵を作成し、署名しました。

秘密鍵はファイルとして保存される。そこで、このファイルが流出した場合(たとえばハードディスクが盗まれた場合など)に備えて、秘密鍵を共通鍵暗号で暗号化して保存する仕組みが設けられている。その鍵が、パスフレーズである。

ここで入力するパスフレーズは、秘密鍵を用いる際に毎回聞かれる (ので忘れないようにする)。 作成時にパスフレーズは2回聞かれる (打ち間違いの防止のため)。

暗号化と復号 (自分相手)

準備: 共有鍵で暗号化した himitsu-xxxx.txt.asc を消しておく。
(消し方: Finder で表示して、ゴミ箱に移動する。HWB の 14.3 Finder を使ったファイル操作, 14.3.8 ファイルの削除 を参照)

まずは、自分自身で暗号化と復号を試してみよう。

復号
$  gpg -r (自分のメールアドレス) -ea himitsu-xxxx.txt 
 (今回はパスフレーズは聞かれない。自分の公開鍵が自動で用いられる。) 
 うまくいけば、 himitsu-xxxx.txt.asc ができている 
 注: (今までの操作で作成した) himitsu-xxxx.txt.asc がすでに存在していて消去していない場合、
   新しい内容で置き換えていないかを聞かれる。
$  cat himitsu-xxxx.txt.asc 
 (意味の取れないアルファベット列が表示される) 
$  gpg -d himitsu-xxxx.txt.asc 
 自分の秘密鍵のパスフレーズを聞かれるのでタイプする 
 (復号された平文が画面に表示される) 

友達の公開鍵の登録

公開鍵暗号で友達に暗号文を送るには、受信者の公開鍵を知っている必要がある (通常の用途では、事前に安全な方法で配っておく)。今回は電子メールを信用することにして、公開鍵を送りあってみよう。

暗号化と復号 (友達相手)

準備: 先ほど同様に、自分宛に暗号化した himitsu-xxxx.txt.asc を消しておく。

今度は友達相手に暗号文を送る

電子署名

なお、この演習では、暗号化と署名は別々の概念であることが分かりやすいよう、暗号化と署名を別々に説明した。必要であれば、暗号化と署名を同時に行うことができる。 その際は、$ gpg -r (宛先) -eas (ファイル名) などとする。

課題

以下のすべてを行う

困った時には

パスフレーズを忘れてしまった:
``gpg --delete-secret-key 自分のメールアドレス'' と''gpg --delete-key 自分のメールアドレス'')を順に行い(二重引用符の内側を「ターミナル」に入力)、秘密鍵と公開鍵を削除する。その後、鍵ペアを作り直す。
友達の公開鍵を登録できたことの確認方法:
gpg --list-keys として、(自分の名前とともに)友人の名前が表示されれば成功。
鍵の登録で何もメッセージが表示が表示されない:
gpg --import yyyy-pub.txtなどとした際に、yyyy-pub.txtに登録するべき鍵がない場合に起こる。たとえば、ファイル名の指定が誤っている(平文など)、すでに正常に登録した鍵をもう一度登録した、yyyy-pub.txtの中身が自分の公開鍵である(登録したいのは友達の公開鍵)、などの場合が考えられる。
暗号化の際に「この鍵が本当に本人のものである、という兆候がありません」と表示される:
gpg --lsign-keyを行っていないか、操作に失敗した状態で、友人の公開鍵を使おうとしていると思われる。
暗号化の際に「公開鍵が見つからない」旨のエラー:
宛先の公開鍵を入手できていないか、--importの手続きに失敗していると思われる。
暗号化の際に「himitsu.txt が見つからない」旨のエラー:
ファイル名の指定が誤っている。自分が暗号化したい平文のファイル名を指定する。