GnuPG の利用

オープンソースなどを公開する際に、改ざんされていないことを証明するために MD5, PGP 等によって署名するようになっています。MD5 によるハッシュのチェックでも良いのですが、より信頼のおける署名を利用することが当たり前となってきています。そのながで、ライセンス上問題のない OpenPGP を採用します。その OpenPGP の実装として GNU Privacy Guard (GnuPG) を利用します。

* パッケージの入手とインストール

GnuPG をコンパイルする際に、gettext の問題が生じた場合 --with-included-gettext を使用し、アセンブル時に問題が生じたら --disable-asm を使用してください。 再度、configure を実行するには、Makefile がきちんと作成されていれば make distclean そうでなければ、まず config.cache を削除して ./config.status --recheck を実行してください。また、GNU make (gmake) を使用するようにしてください。ここでは、Solaris 8 Intel 版をもとに説明します。

必要なモジュール

gnupg-1.2.3.tar.gz (http://www.gnupg.org/)

インストール手順 (スーパーユーザーで作業)

  # md5 gnupg-1.2.3.tar.gz
  MD5 (gnupg-1.2.3.tar.gz) = 46b990908019422535a08ce91b370ae7
  # gzip -dc gnupg-1.2.3.tar.gz | tar xf -
  # cd gnupg-1.2.3
  # MAKE=gmake ./configure --disable-asm
  # gmake
  # gmake check
  # gmake install
  # chmod 4755 /usr/local/bin/gpg

これらのインストールで /usr/local ディレクトリーにインストールされます。

 

* PGPキーの作成と管理

インストールが終わったら、一般ユーザーになり自分の PGP キーを作成します。国際化に対応しているので、日本語で設定しましょう。

【キーの作成】

  shin$ LANG=ja
  shin$ export LANG
  shin$ gpg --gen-key
  gpg (GnuPG) 1.2.3; Copyright (C) 2003 Free Software Foundation, Inc.
  This program comes with ABSOLUTELY NO WARRANTY.
  This is free software, and you are welcome to redistribute it
  under certain conditions. See the file COPYING for details.
 
  gpg: /home/shin/.gnupg: ディレクトリーができました
  gpg: 新しい構成ファイル`/home/shin/.gnupg/gpg.conf'ができました
  gpg: 警告: 「/home/shin/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
  gpg: 鍵輪「/home/shin/.gnupg/secring.gpg」ができました
  gpg: 鍵輪「/home/shin/.gnupg/pubring.gpg」ができました
  すきな鍵の種類を選択してください:
     (1) DSAとElGamal (既定)
     (2) DSA (署名のみ)
     (5) RSA (署名のみ)
  どれにしますか? 1
  DSA鍵対は1024ビットになります。
  新しいELG-E鍵対を生成します。
               最小の鍵長は  768 ビット
               既定の鍵長は 1024 ビット
           最大の推奨鍵長は 2048 ビット
  どの鍵長にしますか? (1024) 1024
  要求された鍵長は1024ビット
  鍵の有効期限を決めてください。
           0 = 無期限
        <n>  = 有効期限 n 日間
        <n>w = 有効期限 n 週間
        <n>m = 有効期限 n か月間
        <n>y = 有効期限 n 年間
  鍵の有効期間は? (0)0
  Keyは無期限です
  これでいいですか (y/n)? y
  あなたの鍵を同定するためにユーザーIDが必要です。
  このソフトは本名、コメント、電子メール・アドレスから
  次の書式でユーザーIDを構成します:
      "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
 
  本名: Shin Motomiya
  電子メール・アドレス: shin@example.com
  コメント: <Return>
  次のユーザーIDを選択しました:
      "Shin Motomiya <shin@example.com>"
 
  名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
  秘密鍵を保護するためにパスフレーズがいります。
 
  パスフレーズを入力: (パスフレーズ)
  パスフレーズを再入力: (パスフレーズ)
  今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
  とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
  乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。
  +++++++++++++++.+++++++++++++++++++++++++++++++++++.++++++++++..++++++++++.+++++
  +++++.++++++++++++++++++++..+++++++++++++++.+++++++++++++++.+++++........+++++
  今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
  とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
  乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。
  +++++++++++++++++++++++++++++++++++.++++++++++.+++++.++++++++++.++++++++++..++
  ++++++++++++++++++...+++++++++++++++++++++++++.++++++++++..+++++.............>..
  +++++.........................................................+++++^^^
  gpg: /home/shin/.gnupg/trustdb.gpg: 信用データベースができました
  公開鍵と秘密鍵を作り、署名しました。
  絶対的に信用した鍵として記録しました。
 
  pub  1024D/08721322 2003-09-17 Shin Motomiya <shin@example.com>
                  指紋 = A401 9652 0237 8BCA 9903  1DA8 E1A3 F7DC 0872 1322
  sub  1024g/8798C56D 2003-09-17
 
  shin$ 

【公開キー】

自分宛のファイルなどを暗号化してもらったり、自分の署名を相手に認識してもらうために、公開キーが必要になります。

  shin$ gpg -a --export shin > public_ket.txt
  shin$ more public_key.txt
  -----BEGIN PGP PUBLIC KEY BLOCK-----
  Version: GnuPG v1.2.3 (SunOS)
 
  mQGiBD9oHbURBAD/3b68iBkL9eOy/40yNeMeHh1pIilIro0JmQat+bktCBCCBHjd
  ICFNkQZDzWZZ1N35st7lGkqluSdjP+Ou8PoF6YNxxYwiPtRe3IXAXUcbK4UWMGaF
  OScAnrAnglqi5RDYOTyfMSLFbe5qhy5S0NXw4SR6NIyFRLEDGkZNuGbuQwCg6guK
  UpVYayJbXArRclsF1KEAVL0EAJjtKLmd1Pqdk+9VpjY3C1rVDaM0Ad2NFYPIN8ki
  fMbQUhO01kR9KjrpyFRhn8JHmLW4JO3+jQHlWtNyZNZTiEnt7Sz7LJ0dQ32FhFsy
  JitZbkHxjWxFCfnX6+6n4kihUdfiwfzcVFYcE0KIpFOi3SYhGC0AJI6B0P4kxefk
  LZfHA/sGji2ghRSyjcX/w7qTcffqF9m/zZrVqSZyNI6AGR+63QTQvgv6pKYS7kb3
  PQw39AJjFUztmQgLsqdcb5HnptHE77/6dFHOBgWWb07KkqxwOZM0kWPv4JmhwQtS
  LEz3p/o4nxaBFc1GR+8Jkux8nblWWhQOKVQZB/Ukp0aIsj1O8LQhU2hpbiBNb3Rv
  bWl5YSA8c2hpbkBmb29iYXIuY28uanA+iF4EExECAB4FAj9oHbUCGwMGCwkIBwMC
  AxUCAwMWAgECHgECF4AACgkQ4aP33AhyEyIpKACg0Xlkwmnj+g+f93RvCyxb5las
  JhQAn0OBpFAHNZO+ce1+4aJpYs8qMk02uQENBD9oHb8QBADo51Qt8odbhJ5fLkab
  E3Yb1Y5fhTho5ofWTEIa5Oycmr/+sq9lxTp06BLwND40jgX6ykYoMCMZY/5nyPf0
  O3UBjyCJ6JkcufIro46l9MapPex01CisU5jpXF1/5pXh41FFss0ggGj38Hr6iGJh
  4KJ7/jGMNG75MB0UGW5GTzbrzwADBQP/ZjH052E4Rqmn4m7tY/UqP+LP+B2nbbtN
  wI37HVXG6HqxFdY6AIEBtzVrihWbqxRdes9wuSaC5+6WJLXOGA3XouzolPv/+CTn
  XfsSigcs/9VdRp2L9g9C0GPhy41JVU01/Kj4H0qWMlkGSvES/qKPjcpBsz3eT9DT
  5wfUA3IvECaISQQYEQIACQUCP2gdvwIbDAAKCRDho/fcCHITIu0wAJwOq4NJGWCk
  4wxdH7wma5oeNAj+HgCeKkyxBTB51tb62P1Mqpe78B9ws2g=
  =SwCy
  -----END PGP PUBLIC KEY BLOCK-----
  shin$ 

できあがった公開キーを、メールや Web サイトなどで公開してください。

【フィンガープリント】

公開キーが本当に本人のものだと確認できるように、普段からメールに自分の公開キーのフィンガープリント(指紋)を添付しておくようにしましょう。

  shin$ gpg --fingerprint shin
  pub  1024D/08721322 2003-09-17 Shin Motomiya <shin@example.com>
                  指紋 = A401 9652 0237 8BCA 9903  1DA8 E1A3 F7DC 0872 1322
  sub  1024g/8798C56D 2003-09-17
 
  shin$ 

【キーの破棄するために失効証明を生成】

パスフレーズを忘れた、パスフレーズが知られたなどの場合、他の人に現在の公開鍵が使用できないことを通知するために証明を発行します。

  shin$ gpg --output revoke.asc --gen-revoke shin
 
  sec  1024D/08721322 2003-09-17   Shin Motomiya <shin@example.com>
 
  この署名にたいする失効証明書を作りますか? y
  失効の理由を選択してください:
    0 = 理由は指定されていません
    1 = 鍵がパクられました
    2 = 鍵がとりかわっています
    3 = 鍵はもう使われていません
    Q = キャンセル
  (ここではきっと1を選びます)
  あなたの決定は? 1
  予備の説明を入力。空行で終了:
  > <Return>
  失効理由: 鍵がパクられました
  (説明はありません)
  よろしいですか? y
 
  次のユーザーの秘密鍵のロックを解除するには
  パスフレーズがいります: "Shin Motomiya <shin@example.com>"
  1024ビットDSA鍵, ID 08721322作成日付は2003-09-17
 
  パスフレーズを入力: (パスフレーズ)
 
  ASCII包装出力を強制します。
  失効証明書を作成しました。
 
  見つからないような媒体に移動してください。もしワルがこの証明書へのア
  クセスを得ると、そいつがあなたの証明書を使えなくすることができます。
  媒体が読出し不能になった場合に備えて、この証明書を印刷して保管するの
  が賢明です。しかし、注意してください。あなたのマシンの印字システムは、
  だれでも見える場所にデータをおくことがあります!
  shin$ cat revoke.asc
  -----BEGIN PGP PUBLIC KEY BLOCK-----
  Version: GnuPG v1.2.3 (SunOS)
  Comment: A revocation certificate should follow
 
  iEkEIBECAAkFAj9pkAgCHQIACgkQ4aP33AhyEyLdqgCgl87oaIQrjUyVJ0cfhE+f
  avO6ZE8AnAm7l5p6M96I5auNCqFKdztrARzd
  =Sute
  -----END PGP PUBLIC KEY BLOCK-----
  shin$

【その他のキー管理】

その他、キーを管理するためのコマンドの一覧をあげておきます。

コマンドライン 説明
gpg --list-keys 登録されている公開鍵の一覧を表示
gpg --delete-secret-key <自分のID> 秘密鍵を削除
gpg --delete-key <ID> 指定した ID の公開鍵を削除
gpg --import < revcert.txt 破棄証明を取り込む

 

* 相手の公開キーの登録と署名

せっかくなので、gnupg-1.2.3.tar.gz が正しいファイルかどうか確かめてみます。まず、公開キーを入手して自分のキーリングに登録します。日本語のメッセージはどうも見にくいので、ここから英語のメッセージに変えます。(メッセージは自分の好みのものに設定してください。)

  shin$ LANG=C
  shin$ export LANG
  shin$ gpg --import gnupg-1.2.3/doc/samplekeys.asc
  gpg: key 57548DCD: public key "Werner Koch (gnupg sig) <dd9jn@gnu.org>" imported
  gpg: key 621CC013: public key "Werner Koch <wk@gnupg.org>" imported
  gpg: key 5B0358A2: public key "Werner Koch <wk@gnupg.org>" imported
  gpg: key B2D7795E: public key "Philip R. Zimmermann <prz@mit.edu>" imported
  gpg: key 99242560: public key "David M. Shaw <dshaw@jabberwocky.com>" imported
  gpg: Total number processed: 5
  gpg:               imported: 5  (RSA: 1)
  shin$ 

登録は終わりました。次に、この公開キーが信頼できるものとして署名しなくてはなりません。その際に、出力されるフィンガープリントを確認して正しければ署名します。

  shin$ gpg --lsign-key "Werner Koch (gnupg sig) <dd9jn@gnu.org>"
 
  pub  1024D/57548DCD  created: 1998-07-07 expires: 2003-12-30 trust: -/-
  (1). Werner Koch (gnupg sig) <dd9jn@gnu.org>
 
 
  pub  1024D/57548DCD  created: 1998-07-07 expires: 2003-12-30 trust: -/-
   Primary key fingerprint: 6BD9 050F D8FC 941B 4341  2DCC 68B7 AB89 5754 8DCD
 
       Werner Koch (gnupg sig) <dd9jn@gnu.org>
 
  This key is due to expire on 2003-12-30.
  Do you want your signature to expire at the same time? (Y/n) Y
  How carefully have you verified the key you are about to sign actually belongs
  to the person named above?  If you don't know what to answer, enter "0".
 
     (0) I will not answer. (default)
     (1) I have not checked at all.
     (2) I have done casual checking.
     (3) I have done very careful checking.
 
  Your selection? (enter '?' for more information): 0
  Are you really sure that you want to sign this key
  with your key: "Shin Motomiya <shin@example.com>" (08721322)
 
 The signature will be marked as non-exportable.
 
  Really sign?
 
  You need a passphrase to unlock the secret key for
  user: "Shin Motomiya <shin@example.com>"
  1024-bit DSA key, ID 08721322, created 2003-09-17
 
  Enter passphrase: (パスフレーズ)
  shin$ 

公開キーの署名が終わったら、実際に gnupg-1.2.3.tar.gz が正しいか確かめます。このほかに、署名ファイルである gnupg-1.2.3.tar.gz.sig を入手しなくてはなりません(gnupg-1.2.3.tar.gz をダウンロードできるところにおいてあります)。これらのファイルを、同一のディレクトリーにおいてチェックします。

  shin$ gpg --verify gnupg-1.2.3.tar.gz.sig
  gpg: Signature made Fri Aug 22 05:24:33 2003 JST using DSA key ID 57548DCD
gpg: Good signature from "Werner Koch (gnupg sig) <dd9jn@gnu.org>"
gpg: checking the trustdb
gpg: checking at depth 0 signed=2 ot(-/q/n/m/f/u)=0/0/0/0/0/1
gpg: checking at depth 1 signed=1 ot(-/q/n/m/f/u)=2/0/0/0/0/0
gpg: next trustdb check due at 2003-12-30 shin$

メッセージから、正しいファイルであることが確認できます。

このほかに、gpg コマンドでは キーの一覧を表示する --list-keys、キーを削除する --delete-key 等があります。詳細は gpg コマンドのマニュアルを参照してください。

 

* ファイルの暗号化・復号化

今度は、誰かに秘密のファイルを送る際に暗号化して送る手順を記述します。本来は、キーリングに登録されている送信相手の公開キーを使用して暗号化し、暗号化された内容を送信します。受け取った相手は、自分の秘密キーを使ってファイルを復号化します。

【オリジナルのファイル】

  shin$ cat secret.txt
  ここだけの話なんだけど、
  ○×って、□なんだって (>_<)

【送信相手の公開キーを呼び出して暗号化】

    -e  暗号化
    -a  ASCII形式
    -r  メールアドレスの公開キー
 
  shin$ gpg -ea -r hana@hogehoge.com secret.txt
  shin$ more secret.txt.asc
  -----BEGIN PGP MESSAGE-----
  Version: GnuPG v1.2.3 (SunOS)
 
  hQEOA/CS/8CHmMVtEAP+OnYkwOXYnOcLQIFJex060lUJPTy+ZCbG+EEorpux/ekD
  Jxz3HKE8DTwLcn7IjRW95yqVZtWachKGw2nuh/uyobtWH+UJwlW9VlGpu0X+YT+0
  OIWBx4OeJVFzfkghPHDEYBSMGIfdi6pNWf5kl/sBO//AIaJxkAF3M1B+poe/2CsE
  AMMr38pwHJQH7camzluqudjmdcI3bDWY1pbi5zGxKA+AkBcaPao0x0WbuF56kY0x
  wNFmUqy7So1yFxcpHYxIAQX+X6E/zLWB5+JcsemNu93NIvilUyKfLx6vy/RYaLUx
  DEbElnMKknsFe9hhzf/7fp1VPfgZ/kZ8ZHW+L3t7lQF10nMBy2OapKGA2uq+dAWv
  i3ODwoH2D1G39ORa2h5PWOfNgxix6Lm3rZEz7p6zK+XQUK3UAAdafjNaGNWtO1Cc
  dupkBpOrRacdoTmBU57dEMbgmmTj3bdvoFy3jqSy1q69SX5F1QiVX69PLJ6R1k+j
  qfuBF9p/
  =Irf9
  -----END PGP MESSAGE-----
  shin$ 

【暗号化されたファイルをもらった相手は、自分の秘密キーで復号化】

  hana$ gpg -d secret.txt.asc
 
  You need a passphrase to unlock the secret key for
  user: "Hana Koeda <hana@hogehoge.com>"
  1024-bit ELG-E key, ID 3D8576F6, created 2003-09-17 (main key ID 17CEE1C3)
 
  Enter passphrase: (パスフレーズ)
 
  gpg: encrypted with 1024-bit ELG-E key, ID 3D8576F6, created 2003-09-17
        "Hana Koeda <hana@hogehoge.com>"
  ここだけの話なんだけど、
  ○×って、□なんだって (>_<)
  hana$ 

 

* 署名と検証

ファイルの署名、署名の検証を行う方法を記述します。

【署名】

  shin$ gpg -s secret.txt
 
  You need a passphrase to unlock the secret key for
  user: "Shin Motomiya <shin@example.com>"
  1024-bit DSA key, ID 08721322, created 2003-09-17
 
  Enter passphrase: (パスフレーズ)
 
  shin$ gpg -d secret.txt.gpg
  ここだけの話なんだけど、
  ○×って、□なんだって (>_<)
  gpg: Signature made Thu Sep 18 19:59:21 2003 JST using DSA key ID 08721322
  gpg: Good signature from "Shin Motomiya <shin@example.com>"
  shin$ 

【検証】

  shin$ gpg --verify secret.txt.gpg
  gpg: Signature made Thu Sep 18 19:59:31 2003 JST using DSA key ID 08721322
  gpg: Good signature from "Shin Motomiya <shin@example.com>" 
  shin$ 

【テキストファイルへの署名】

  shin$ gpg --clearsign secret.txt
 
  You need a passphrase to unlock the secret key for
  user: "Shin Motomiya <shin@example.com>"
  1024-bit DSA key, ID 08721322, created 2003-09-17
 
  Enter passphrase: (パスフレーズ)
 
  shin$ cat secret.txt.asc
  -----BEGIN PGP SIGNED MESSAGE-----
  Hash: SHA1
 
  ここだけの話なんだけど、
  ○×って、□なんだって (>_<)
  -----BEGIN PGP SIGNATURE-----
  Version: GnuPG v1.2.3 (SunOS)
 
  iD8DBQE/aZAK4aP33AhyEyIRAuzcAKDZe2TaM0iGFjoQmkmx4GZH4EeM4gCfS95e
  nIyI3ejSeuJW7WURIynfXW4=
  =We1l
  -----END PGP SIGNATURE-----
  shin$ 

【署名ファイルを別途生成】

  shin$ gpg -b project.tar.gz
 
  You need a passphrase to unlock the secret key for
  user: "Shin Motomiya <shin@example.com>"
  1024-bit DSA key, ID 08721322, created 2003-09-17
 
  Enter passphrase: (パスフレーズ)
 
  shin$ ls
  project.tar.gz      project.tar.gz.sig
  shin$ 

これまではここの説明のため、署名と暗号化を別々に行っていましたが、署名と暗号化のオプションを一度に指定することで同時に行うことができます。