OpenPGP準拠ツールの互換性
COMM Internal Note 010    /     PGP-004

山根信二
<s-yamane@soft.iwate-pu.ac.jp>
岩手県立大学ソフトウェア情報学部
鈴木 裕信
<hironobu@h2np.net>
OpenPKSDプロジェクト 1

平成14年2月13日


目次

はじめに

本稿ではOpenPGPに準拠したツールとしてPGPとGnuPGをとりあげ, それらの相互運用性について報告する.

対象とするツールは,2001年に公開されたGnuPG 1.0.6 と PGP 6.5.8(およ び7.1)である. 両者は,1998年にRFC 2440[1]として公開された OpenPGPの仕様に準拠しているが,細かい点で違いがあり, また,同じツール同士でもバージョン間の互換性に問題がある. また,2002年2月現在 見直しが進められているRFC 2440の改定案[2]についても 言及する.

OpenPGPの相互接続性

問題点

OpenPGPの相互接続性の問題として,以下の問題が挙げられる. 以下に説明する.

日本語処理の問題

PGP/GnuPGおよび第三者がそれらに手を加えて配布している「日本語版」を使ったやりとりの 際に,日本語の文字コードの正規化が正しく行なわれない場合がある. この問題については別稿「OpenPGP準拠メーラについての調査」で メーラとの連携も含めて詳述している.

署名書式の新旧

OpenPGPではデータはパケットとよばれる構成単位でやりとりされる. OpenPGPパケットの中でも,署名データを格納する署名パケットには,V3(バージョン3)とV4(バージョン4)の二種類がある. OpenPGPでは,V3署名がMUST(必須)で, V4署名も受けつけるよう推奨している. この GnuPG はデフォルトで V4 の署名を生成するが V3 の署名も受けつ ける.これに対して,PGPでは6.5.8までV4に対応していなかった. これは2000年よりも前に配布されたPGPを利用する際に問題となる.

サポートしている暗号アルゴリズムの種類

PGPとGnuPGでは利用できるアルゴリズムが異なり, さらには同じPGP同士でも,バージョン間で互換性がない場合がある. OpenPGPが標準化されてからこの問題は改善されており, 2001年のバージョンではほぼ解消された. しかしながら,PGPでは旧バージョンとの相互接続性確保のために OpenPGPでは推奨されないアルゴリズムを使用可能であり,注意が必要である.

以下に,利用できる暗号アルゴリズムの詳しい比較を行なう.

OpenPGPの仕様,そしてPGP/GnuPG実装が,それぞれ採用している 公開鍵暗号/電子署名,共通鍵暗号,ハッシュ関数のアルゴリズムを 比較したのが,次の表1である. この比較について説明を行なう.


 
表 1: PGP と GnuPG のアルゴリズム対応表
公開鍵暗号アルゴリズム
Algorithm OpenPGP PGP 6.5.8 GnuPG 1.0.6
RSA YES YES YES
ElGamal YES (MUST) Yes (default) Yes (default)
DSA YES (MUST) Yes (default) Yes (default)
Elliptic Curve Reserved NO NO
ECDSA Reserved NO NO
共通鍵暗号アルゴリズム
Algorithm OpenPGP PGP 6.5.8 GnuPG 1.0.6
IDEA YES (SHOULD) YES Optional
Triple-DES YES (MUST) YES YES
CAST5 YES (SHOULD) YES (default) YES (default)
Blowfish YES NO YES
SAFER-SK128 YES NO Optional
RC2 NO YES NO
Twofish NO YES YES
AES (Rijndael) Reserved NO YES
DES/SK Reserved NO NO
ハッシュ関数
Algorithm OpenPGP PGP 6.5.8 GnuPG 1.0.6
MD2 YES YES NO
MD5 YES (SHOULD) YES YES
SHA-1 YES (MUST) YES (default) YES (dedault)
RIPE-MD/160 YES YES YES
TIGER/192 Reserved NO Optional
HMAC NO YES NO
HAVAL Reserved NO NO
 


公開鍵暗号の実装

公開鍵暗号について,PGP, GnuPG ともデフォルトでは暗号化にElGamal,電 子署名にDSAを採用している. OpenPGPの仕様[1]でもElGamalでの暗号化とDSAでの電子署名の 実装をMUST(必須)扱いしており,公開鍵暗号についてはデフォルトの設定であれ ば採用アルゴリズムの相互運用性の問題はない.

共通鍵暗号の実装

共通鍵暗号について, OpenPGPの仕様では Triple-DESの実装がMUST(必須)であり, CAST5およびIDEAの実装がそれに次ぐSHOULDの扱いとされている. しかし,GnuPGは特許問題のあるアルゴリズムは採用しない方針のため,IDEAを 標準では利用できない.

また,OpenPGPも見直しを受けている. RFC 2440のOpenPGPでは 共通鍵暗号AESはあくまでReserved(将来の利用のための予約)として位置づけら れているが, 2001年に出された改定案のインターネットドラフト[2]では, Triple-DESの実装がMUST扱いなのは変わらないが,AES-128およびCAST5がSHOULDに変わっている. そしていまのところPGP6.5.8はAESに対応していない. このような状況では,共通鍵暗号についてはデフォルトのCAST5を用いるのが 相互運用性の面で確実である.

ハッシュ関数の実装

OpenPGPではPGPの以前のバージョンとの相互接続のために MD5をハッシュ関数採用アルゴリズムの一つに加えている. しかしながら,SHA-1を必須とし,MD5の使用は推奨されていない. また,RIPE-MD/160を暗号学的に安全なアルゴリズムとして採用している.

PGP/GnuPGともにMD5の規定についてはOpenPGPに従っており, MD5は実装するもののSHA-1をデフォルトにしている. しかしながら, GnuPGではMD2は実装されておらず,秘密鍵のハッシュ処理に RIPE-MD/160を採用している. このことから,GnuPGはOpenPGPで推奨されている技術標準を 尊重しながらも,暗号学的により安全なアルゴリズムを 積極的に利用する方針であることがわかる.

本稿のまとめ

PGPとGnuPGはそれぞれOpenPGPという標準に準拠した実装であるが, 細部では異なる点がある.

最新版をデフォルトの状態で利用する限り,PGPとGnuPGそれぞれの利用アルゴリ ズムの相互接続性は確保される.しかしながら,PGPでしか使えない/GnuPGでし か使えないアルゴリズムを選択することも可能である. この採用アルゴリズムの相違は,過去のバージョンとの互換性や特許の問題によ るものである.

最新版に移行していない利用者も数多く存在する現時点では, PGP/GnuPGをコミュニケーションに用いる場合,単に技術標準に 定められた暗号アルゴリズムを使うというだけでなく, 相手の環境を考慮してアルゴリズムを選択することが重要である. したがって,デフォルト以外の設定でPGP/GnuPGを利用する際には 注意が必要とされる.

実際の設定での注意事項

PGP/GnuPGそれぞれのインストール時の設定や利用方法について, コマンドライン版を例に説明したものを 付録として添付する.

付録: コマンドライン版のインストール方法と使用上の注意点

インストール

パッケージの入手方法

PGPの公式サイト(http://www.pgpi.com, http://www.pgp.com)や GnuPGの公式サイト(http://www.gnupg.org)からリンク をたどり,最新のバージョンを入手するのが良いだろう.日本のミラーサイト (http://pgp.nic.ad.jp, http://pgp.iijlab.net, http://www.ring.gr.jp)も利用可能 である.

GPLライセンス下で自由に配布できる GnuPGに関しては,どのディストリビューションもインストールパッケージを 用意しているだろうから,入手できず困るといった問題はほとんどないと 思われる.また現在ではアメリカの暗号輸出規制が事実上撤廃されたのでPGP,あ るいはGnuPGを米国サイトから直接入手しても問題はない.

PGPバイナリインストール

2001年末の時点で,PGPはGUI版の7.0.3とコマンドライン版の6.5.8が最新版である. PGP 6.5.8は,Macintosh,Windows 98/NT/2000,AIX,Solaris,HP-UX,Linux, およびLinux rpm形式でバイナリが用意されている(ただし,Windows XPについてはサポートされていない. PGPの開発販売および無料版配布を行なってきたNAI社では, 2001年10月より PGP製品ラインはメンテナンスモード(開発停止)になっている, このため,バージョンアップされる見込みは立っていない).

ソースコードも公開されて いるが,UNIX上でコンパイルできるソースコードパッケージが用意されているわ けではないので,このアーカイブを入手するだけではコンパイルができないの で注意が必要である.

インストール例


% lynx ftp://ftp.pgpi.com/pub/pgp/6.5/6.5.8/PGPcmdln_6.5.8.Lnx_FW.tar.gz 
% tar zxf PGPcmdln_6.5.8.Lnx_FW.tar.gz
% tar zvxf PGPcmdln_6.5.8_Lnx_FW.tar.gz
pgp-6.5.8/
pgp-6.5.8/pgp
...
pgp-6.5.8/man/man1/pgp.1
% su
# cp pgp-6.5.8/pgp /usr/local/bin
# cp pgp-6.5.8/man/man1/pgp.1 /usr/local/man/man1

GnuPGのインストール

GnuPG 1.0.6は,他のGNUソフトウェアと同じく基本的にソースコードで公開され ており,バイナリが用意されているのはWindowsプラットフォームのためのみである. コンパイルは,メジャーなUNIXプラットフォームであれば問題なくコンパイル できるはずである.面倒ならば各ディストリビューションが用意しているバイ ナリーのインストールーパッケージを探してきてインストールしても問題はな い.

GnuPGをインストールするには/dev/randomか,存在しないない場合は代替とし てegd (Entropy Gathering Daemon)が必要である.GNU/LinuxやBSD系のディス トリビューションでは,デフォルトで/dev/randomが作成されているので問題 はないはずである.他のUNIXプラットフォーム,あるいは/dev/randomがない 場合はegdを別途インストールすることを勧める./dev/randomやegdがなくと も動かないことはないがシステムからエントルピーを取得しようとする際に時 間がかかるため,処理効率が非常に悪い.

インストール例


% lynx http://pgp.nic.ad.jp/resources/gcrypt/gnupg/gnupg-1.0.6.tar.gz
% tar zxf gnupg-1.0.6.tar.gz
% cd gnupg-1.0.6
% ./configure ; make
% su 
# make install

利用方法: GnuPGを例にして

ここではGnuPGを例に利用方法について説明する. GnuPGはシステムメッセージの多言語がすすめられており, 日本語でのメッセージ表示も可能である. (くわしくはパッケージに含まれているABOUT-NLSを参照のこと.)

日本語ヘルプコマンド

まず利用する前にインストール後,-helpオプションを使ってgpgの簡単なヘル プを見てみよう. GnuPGを日本語環境で使用すると, ヘルプの冒頭でバージョン1.0.4と表示されるが, -versionオプションで表示されるのが正しいバージョンである.


% gpg -help
gpg (GnuPG) 1.0.4
Copyright (C) 2000 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.

Home: ~/.gnupg
サポートしているアルゴリズム:
Cipher: 3DES, CAST5, BLOWFISH, RIJNDAEL, RIJNDAEL192, RIJNDAEL256, TWOFISH
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA, ELG
Hash: MD5, SHA1, RIPEMD160

書式: gpg [options] [files]
署名,検証,暗号化,または 復号
デフォルトの動作は入力データに依存

コマンド:
 
 -s, --sign [file]                署名を作成
     --clearsign [file]           クリア署名を作成
 -b, --detach-sign                分離署名を作成
 -e, --encrypt                    データを暗号化
 -c, --symmetric                  暗号化には対称暗号法のみを使用
     --store                      保存のみ
 -d, --decrypt                    データを復号 (デフォルト)
     --verify                     署名を検証
     --list-keys                  鍵の一覧
     --list-sigs                  鍵と署名の一覧
     --check-sigs                 鍵の署名を検証
     --fingerprint                鍵と指紋の一覧
     --list-secret-keys           秘密鍵の一覧
     --gen-key                    新しい鍵ペアを作成
     --delete-key                 公開鍵リングから鍵を削除
     --delete-secret-key          秘密鍵リングから鍵を削除
     --sign-key                   鍵に署名
     --lsign-key                  ローカルにて鍵に署名
     --edit-key                   鍵への署名または編集
     --gen-revoke                 破棄証明書を作成
     --export                     鍵を書き出す
     --send-keys                  鍵サーバに鍵を登録
     --recv-keys                  鍵サーバーから鍵を読み込む
     --import                     鍵の読み込み/マージ
     --list-packets               パケット列のみの一覧
     --export-ownertrust          所有者を信用した値を書き出す
     --import-ownertrust          所有者を信用した値を読み込む
     --update-trustdb             信用データベースを更新
     --check-trustdb [NAMES]      信用データベースをチェック
     --fix-trustdb                壊れた信用データベースを修復
     --dearmor                    ファイルまたは標準入力の装甲除去
     --enarmor                    ファイルまたは標準入力の装甲化
     --print-md algo [files]      メッセージ要約を出力

オプション:
 
 -a, --armor                      アスキー形式の装甲を生成
 -r, --recipient NAME             NAME 用に暗号化
     --default-recipient NAME     デフォルトの受信者として NAME を用いる
     --default-recipient-self     デフォルトの受信者としてデフォルトの鍵を用いる
 -u, --local-user                 署名や復号に この user-id を用いる
 -z N                             圧縮レベルを N に設定する (0 は非圧縮)
     --textmode                   標準テキストモードを用いる
 -o, --output                     出力ファイルとして用いる
 -v, --verbose                    冗長
 -q, --quiet                      やや静か
     --no-tty                     端末を使用しない
     --force-v3-sigs              強制的に v3 署名する
     --force-mdc                  暗号化には常に MDC を使用
 -n, --dry-run                    全ての変更を用いない
     --batch                      バッチモード: 問い合わせを行わない
     --yes                        全ての質問に yes と見なす
     --no                         全ての質問に no と見なす
     --keyring                    鍵リングの一覧に この鍵を加える
     --secret-keyring             一覧に この秘密鍵リングを加える
     --default-key NAME           デフォルトの秘密鍵として NAME を用いる
     --keyserver HOST             鍵の検索に この鍵サーバを用いる
     --charset NAME               端末の文字コードを NAME に設定する
     --options                    ファイルからオプションを読み込む
     --status-fd FD               この FD に状態を書き出す
     --trusted-key KEYID          ulimately trust this key
     --load-extension FILE        拡張モジュール FILE を読みこむ
     --rfc1991                    RFC1991 に記述されたモードを用いる
     --openpgp                    全てのパケットと暗号と署名のオプションを OpenPGP の振舞に設定
     --s2k-mode N                 パスフレーズモード N を用いる
     --s2k-digest-algo NAME       パスフレーズにメッセージ要約アルゴリズム NAME を用いる
     --s2k-cipher-algo NAME       パスフレーズに暗号アルゴリズム NAME を用いる
     --cipher-algo NAME           暗号アルゴリズム NAME を用いる
     --digest-algo NAME           メッセージ要約アルゴリズム NAME を用いる
     --compress-algo NAME         圧縮アルゴリズム NAME を用いる
     --throw-keyid                暗号パケットの鍵 ID フィールドを送出する
 -N, --notation-data NAME=VALUE   この注釈データを用いる

(See the man page for a complete listing of all commands and options)

例:

 -se -r Bob [file]          ユーザ Bob への署名と暗号化
 --clearsign [file]         クリア署名を生成
 --detach-sign [file]       分離署名を生成
 --list-keys [names]        鍵を表示
 --fingerprint [names]      指紋を表示

バグを見つけたら <gnupg-bugs@gnu.org> までレポートを送って下さい.

以上がGnuPGのヘルプメッセージである. コマンドライン版GnuPGはこのヘルプメッセージを適宜呼び出しながら操作することができる. GnuPGの全てのオプションを覚える必要はないが,GnuPGに何をさせるかを 理解しておかなければ,ヘルプを読んでもどのオプションを使っていいのか わからない.

次に,理解のための手引きを述べる.

理解のポイント

汎用のデータ暗号化ツール一般に言えることだが,利用に 当たって理解するポイントは以下の5つである.
  1. 鍵ペアの生成
  2. 鍵管理
  3. 公開鍵による暗号化/復号化
  4. 共通鍵暗号による暗号化/復号化
  5. 電子署名による署名/検証
以下では,順に実際の画面表示を示しながら説明する.

鍵ペアの生成

公開鍵暗号を使うには,公開鍵とそれに対応する秘密鍵をペアで用意する. さらにOpenPGPでは暗号化(生成および解読)に使う鍵ペアと,電子署名(の生成お よび検証)に使う鍵ペアは別に扱っている. つまり暗号化のための鍵ペアと電子署名に使う鍵ペアの2つを生成し, 用意している.

デフォルトのGnuPG 1.0.6では,暗号化と電子署名に使えるアルゴリズム組合 せは表2の通りである.

 
表 2: 暗号化と電子署名のアルゴリズムの組み合わせ例
暗号化 電子署名
RSA RSA
ElGamal ElGamal
RSA DSA
ElGamal DSA
ElGamal RSA
RSA ElGamal
 


ちなみにヘルプのPubkey: の所で示される``-E''は暗号化 アルゴリズムとしての利用,``-S''は電子署名アルゴリズムとしての利用という 意味である.GnuPGでは鍵生成の時にRSA鍵を作る選択肢は用意されていない.

コラム: これは技術的な問題でも実装のためでもなく過去に存在したRSAパテントの問 題である.また今後もRSAの鍵生成をサポートする予定はない.PGPはRSAの鍵 生成用意してはいるが筆者からは利用を推奨しない.方向性としてはPGP, GnuPGの両陣営ともRSAを使わない方向に向かっている.

まず一番最初に,自分の鍵(公開鍵ペア)がなければ始まらないので,鍵を生成 する.そのまえに,鍵ペアを納めるディレクトリが必要である.デフォルトで ある~/.gnupgを生成する.このディレクトリを作成後,``-gen-key''オプショ ンを用い鍵を生成する.

なおgpgを実行すると「gpg: 警告: 安全でないメモリーを使用しています!」 というメッセージが毎回出力される環境がある.これは第三者がgpg実行時に 使用する記憶領域を参照できるということを意味しているが,これは利用して いるOSに依存するためアプリケーションであるgpg側では回避できない.

実行ログ

以下に鍵生成の作業画面を示す.

--


% mkdir ~/.gnupg
% chmod 700 ~/.gnupg
% gpg --gen-key
gpg (GnuPG) 1.0.6; Copyright (C) 2001 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: 警告: 安全でないメモリーを使用しています!
gpg: /home/hironobu/.gnupg/secring.gpg: 鍵リングを作成しました
gpg: /home/hironobu/.gnupg/pubring.gpg: 鍵リングを作成しました
鍵の種類を選択して下さい:
   (1) DSA と ElGamal (デフォルト)
   (2) DSA (署名のみ)
   (4) ElGamal (署名と暗号化)
どれを選びますか?				<--(1) Enterを入力
入力(1)について: 公開鍵を使っての暗号化と署名に利用するアルゴリズム方式の選択である.電 子署名にDSA,暗号化にElGamalという組合せがデフォルトである.電子署名の 利用のみしか使わないという場合はDSAのみという選択ができる.ElGamalを電 子署名,暗号化の両方に使うこともできるが,暗号学的には安全性な どの差はない.これはDSAもElGamalも同じく離散対数問題の困難性を利用して いるためである.

DSA 鍵ペアは 1024 ビットになります
新しい ELG-E 鍵ペアの生成について
             最小の鍵サイズは is  768 ビット
          デフォルトの鍵サイズは 1024 ビット
                最大の鍵サイズは 2048 ビット
どの鍵サイズを選択しますか? (1024)		<--(2) Enterを入力
入力(2)について: 鍵長の指定である.786ビット以上であれば任意の鍵長を指定できる.今後5年 間のコンピュータ技術を勘案してもデフォルトの1024ビットで十分に安全であ る.2048ビットまではユーザに取ってリーズナブルな選択である.それより 2048ビットより大きな値を指定することも可能だが,ユーザに対して警告メッ セージがでる (それでも続けると親切にも,かつ,なかなか興味深いアドバイスをしてく れる.これはTEMPEST攻撃のことを示唆している.TEMPESTのことを知りたけれ ば米国の国家安全保安局のウェブサイト (http://www.nsa.gov/isso/bao/tep.htm )に一般向け情報があるので,いったい どのようなことを意味するのか参考にすると良いだろう.)

要求された鍵サイズは 1024 ビット
鍵の期限を決めて下さい
         0 = 無期限
      <n>  = 有効期限 n 日
      <n>w = 有効期限 n 週間
      <n>m = 有効期限 n 月
      <n>y = 有効期限 n 年
鍵の有効性は? (0)				<--(3) Enterを入力
入力(3)について: 鍵の有効期限である.デフォルトは無期限に有効である.技術的には 鍵の長さと有効期限に対する明確なクライテリアは存在していない.

鍵は無期限です
これで良いですか (y/n)? y			<--(4) y を入力
入力(4)について: 確認を求めるので``y''を入力する.

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

本名: Hironobu SUZUKI	<--(5) Hironobu SUZUKIを入力
入力 (5),(6),(7),(8)について: GnuPGは本名,注釈,電子メールアドレスの入力という形で,入力を求めるが OpenPGPのユーザIDの定義は任意の文字列である.名前や電子メールをいれて いるのは慣用的なものである.注釈,電子メールアドレスの入力は省略できる. OpenPGPで定義されている利用文字コードはUTF-8であるが,経験上,ユーザに はアスキーコードの範囲での入力を推奨する.

電子メールアドレス: mail@hironobu-suzuki.com	
			<--(6) mail@hironobu-suzuki.comを入力
注釈: HIRONOBU HOME NETWORK PROJECT
			<--(7) HIRONOBU HOME NETWORK PROJECTを入力
次のユーザ ID を設定しました:  "Hironobu SUZUKI (HIRONOBU HOME NETWORK
	PROJECT) <mail@hironobu-suzuki.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O 	<--(8) Oを入力
秘密鍵を保護するためにパスフレーズが必要です.
パスフレーズを入力:  <-- (9) 任意のパスフレーズ
パスフレーズを再入力: <-- (9) 任意のパスフレーズ
入力(9)について: パスフレーズの入力であるがGnuPGは辞書によるパスワードチェックなどは一 切行っていない.従ってユーザが弱い文字列を指定することが可能である.ユー ザがパスフレーズとして入力できる文字列の長さに制限はない.

その後,鍵のペアが生成される.その時に乱数が利用されるが,この乱 数生成に必要なエントルピーが足りない場合,「十分な長さの乱数が得られま せん.エントロピーを増加させるようにOS の設定を変更してください.(300 bytes 以上の周期が必要です)」というメッセージが出る./dev/randomで利用 しているシステムではエントルピーをハードウェアデバイスの割込みの発生に 求めている.そこでエントルピーを与えたければたとえばマウスを動かしたり, キーボード入力をしたり,コンパイルなどをしてディスクをアクセスすると良 い.この原理についての詳しい説明はRFC 1750[3]を参照のこと.

今から長い乱数を生成します.キーボードを打つとか,マウスを動かすとか,
ディスクにアクセスするなどの他の行動を同時に行うと,乱数生成装置にて
乱雑さの大きな良い乱数を生成しやすくなりますので,お勧めします.
+++++.+++++++++++++++..+++++.+++++.++++++++++.++++++++++.
...
十分な長さの乱数が得られません.エントロピーを増加させるように
OS の設定を変更してください.(300 bytes 以上の周期が必要です)
今から長い乱数を生成します.キーボードを打つとか,マウスを動かすとか,
ディスクにアクセスするなどの他の行動を同時に行うと,乱数生成装置にて
乱雑さの大きな良い乱数を生成しやすくなりますので,お勧めします.
++++++++++..++++++++++++++++++++.++++++++++++++++++++.+++++++++++++
...
公開鍵と秘密鍵が作成され,署名されました.
--

以上が対話インタフェースを用いたGnuPGの鍵生成である. PGP(製品版および無料配付版)の鍵生成も暗号アルゴリズムの選択肢が異なる以外はほぼ 同じ手続きにしたがって行なわれる.

鍵管理

暗号鍵の生成の続いて,暗号鍵の管理について説明する. 鍵管理の作業は細かく分類すると4つある.
  1. 秘密鍵,公開鍵,信用データベースファイルの管理
  2. 自分の公開鍵の公開
  3. 他人の公開鍵の取り込み
  4. 他人の公開鍵の確認

以下,順に説明を加える.

秘密鍵ファイル,公開鍵ファイルの管理

鍵管理に関係するファイルは~/.gnupgディレクトリの中の以下の3つ である.

pubring.gpg
公開鍵ファイル
secring.gpg
秘密鍵ファイル
trustdb.gpg
信用データベースファイル

secring.gpgとtrustdb.gpgは先に設定したパスフレーズで暗号化されている. secring.gpgファイル(あるいはその中の秘密鍵)を消失させてしまうと2度 と暗号化したファイルを戻せなくなる,あるいは既に公開している公開鍵の正 当な所有者である証明ができなくなるというような,取り返しがつかないこと になるので鍵ペアを作成した際は必ずsecring.gpgをフロッピーなりに保存す ることを強く勧める.不注意によるファイル削除,あるいはディスククラッシュ によるファイルの喪失,はたまた鍵ペアを削除した後,まだ必要であったこと に気がつくなど,数々の事故が絶えない.

保持している公開鍵をリストアップしたいときは``-list-keys [userid]''オプ ションを使う.useridが指定されていない場合は,すべての公開鍵が表示され る.useridの指定には鍵IDと,ユーザIDの2つが利用可能である.

リストアップの操作方法は次の通りである.

全部をリストする場合

% gpg --list-key
gpg: 警告: 安全でないメモリーを使用しています!
/home/hironobu/.gnupg/pubring.gpg
---------------------------------
pub  1024D/1B4BF40A 2000-11-08 Hironobu SUZUKI (HIRONOBU HOME NETWORK PROJECT)\
<mail@hironobu-suzuki.com> 
sub  1024g/8F1E11B1 2000-11-08

ユーザIDを指定する場合

% gpg --list-key mail@hironobu-suzuki.com

鍵IDを指定する場合

% gpg --list-key 1B4BF40A

公開鍵の削除は``-delete-key userid''で削除できる.(-delete-keyだけでは, 自分の公開鍵を直接削除できないが)自分の鍵を削除する時は, 十分の上にも 十分な考慮をした後に削除することを勧める.

自分の公開鍵の公開

さて,自分の公開鍵を相手に利用してもらうためには,特定の相手に送る, Webページなどで公開する,あるいはPGP公開鍵サーバへ登録するなどがある.

相手に送る,あるいはWebページなどに用意する場合は,公開鍵ファイルから 公開すべき鍵を取り出す必要がある.

公開鍵をファイルに取り出す方法は次の通りである.


% gpg --output filename --export userid

ファイルfilenameにはuseridというユーザIDで登録されている公開鍵がバイナ リー形式で格納される.アスキー形式として格納したい場合は``-armor''を加 える.``-armor''オプションは,どの出力際も適用可能である.あとはファイ ルfilenameを公開すれば良い.

インターネットに接続できる状態のマシンからはpgp公開鍵サーバに登録する ことが可能である.ただしpgp公開鍵サーバに登録するということは全世界に 公開鍵を公開するということと同時に1度登録すると,鍵の更新は可能であっ てもデータベースから削除は出来ないということを理解し,熟慮した後に行う べきである.

世界中に分散しているpgp公開鍵サーバはお互い登録された公開鍵を同期させ ているのでどこに登録しても問題はないが,日本国内のユーザならば pgp.nic.ad.jpを使うのが便利だろう.pgp.nic.ad.jpはアジア地域の中心的な pgp公開鍵サーバである.

鍵サーバへの登録方法は次の通りである.


% gpg --keyserver pgp.nic.ad.jp --send-keys userid

他人の公開鍵の取り込み

ファイルで公開鍵を入手した場合は``-import''オプションを使う.標準入力か らの入力も可能である.またインターネット経由でpgp公開鍵サーバから取り 出すこともできる.この時は鍵IDを指定する必要がある.

取り込みの方法は次の通りである.


% gpg --import file

% gpg --keyserver pgp.nic.ad.jp --recv-keys 02912C53

他人の公開鍵の確認

入手した公開鍵はまだ,本当に相手の持ち物であるかどうかをチェックできて いない状態にある.この公開鍵を暗号化などに,そのままの状態で使おうとす ると警告が出る.この公開鍵に対してユーザの手によって電子署名を行う必要 がある.自分で利用する範囲での信頼なので``-lsign-key''オプションを使い, 署名を行う.``-sign-key''も公開鍵への署名であるが,これは第三者に公開す る公開鍵への署名を意味している.

入手した公開鍵が正しいものかどうかを確かめる方法だが,最終的にはその公 開鍵の所有者に直接尋ねて確認するしかない.この時「あなたの``この''鍵は, 本当にあなたのものか?」と確認するために公開鍵の持つフィンガープリント (指紋)を使う. ``-fingerprint userid''オプションを使う.

こう理想的には面接し本人と確認した上で公開鍵が正しいかどうか確認するこ とがいいのだが,そんなわけにはいかないので,名刺にフィンガープリントを 刷ったり,自分の持つWebページに表示したりすることが多い.筆者が知って いるもっともユニークな例は新聞広告にあった連絡先E-mailアドレスの下に小 さくフィンガープリントが載っていたものである.

フィンガープリントの表示方法は次の通りである.


% gpg --fingerprint mail@hironobu-suzuki.com
gpg: 警告: 安全でないメモリーを使用しています!
pub  1024D/1B4BF40A 2000-11-08 Hironobu SUZUKI (HIRONOBU HOME NETWORK PROJECT) \
<mail@hironobu-suzuki.com>
    Key fingerprint = 6F67 FB3F C4FC ED88 9CC1  4690 6806 80A6 1B4B F40A
sub  1024g/8F1E11B1 2000-11-08

もう1つの方法は「自分の信頼している人が相手の公開鍵に対し所有者と確認 した上で電子署名をしているので,この公開鍵はなりすましされたものではな い」という仮定をおいた上で信用する」というWeb of Trustというpgp独特の 認証がある.短く言えば「友達の友達は友達である」というわけである.ただ し,公開鍵にたくさんの署名があったとしても,その公開鍵が本当に信頼でき るかどうかはまた別の話である.本質的には信頼できる者が署名しているかど うかが問題であって数の多い少ないの問題ではない.

公開鍵による暗号化/復号化

暗号化/復号化は簡単である.相手のユーザIDを指定して暗号化すれば良いだ けである.ファイルを指定した場合,ファイル拡張子が.gpgであるファイルが 作成される.ファイルを用いず標準入力,標準出力が可能である.バイナリ形 式ではなくアスキー形式で出力したい場合は-armorオプションを指定する.

復号化も簡単である.もし暗号化されたファイルが.gpgの拡張子を持っている なら,そのファイル名を指定すれば良い.その時,例えばfoo.gpgという名前 ならば,復号化されたファイル名はfooと拡張子を除いたファイル名になる.

暗号化の操作方法は以下の通りである.


% gpg --encrypt --recipient userid  --output outputfile inputfile

復号化の操作方法は以下の通りである.


% gpg foo.pgp

共通鍵暗号による暗号化/復号化

公開鍵を使わずに,共通鍵暗号だけで暗号化/復号化するには``-symmetric''を 使う.実行するとパスフレーズの入力を求めるので任意のパスフレーズを入力 する.暗号化されたデータは同じパスフレーズ以外では復号化することはでき ない.このパスフレーズを共通鍵ファイルを使う時のパスフレーズだと勘違い するユーザがいるので(自分で使うときも,相手に暗号化したデータを渡す時 も)注意を要する.

暗号化の操作方法は以下の通りである.


% gpg  --symmetric foo

復号化の操作方法は以下の通りである.


% gpg foo.pgp

電子署名による署名/検証

データに電子署名を行うには``-sign''オプションを指定する.電子署名を行う ためには,秘密鍵ファイル内に暗号化され格納されている秘密鍵を必要とする. そのためgpgは秘密鍵を使うためのパスフレーズの入力をユーザに求める.

複数の(電子署名に使う)秘密鍵を持っている時などに,どの秘密鍵を使うか指 定するには``-local-user''で利用するユーザIDを指定する.

秘密鍵を指定した電子署名の操作方法は以下の通りである.


% gpg --local-user userid --sign file

応用

複数の相手を指定する

自分の署名をつけ たデータを相手の公開鍵で暗号化しメールで送るような場合,次のようになる.

mail@hironobu-suzuki.comの電子署名をつけてhironobu@h2np.netの公開鍵で 暗号化しメールで送る場合.


% gpg --armor --local-user mail@hironobu-suzuki.com  --sign --encrypt
 --recipient hironobu@h2np.net | mail -s 'GNUPG ENCRYPTED MESSAGE' hironobu@h2np.net

さらに,相手を複数同時に指定することができる. これは,一つの公開鍵暗号ファイルを複数の人間がそれぞれの秘密鍵を使って 解読できることを意味する.

この仕組みは,以下のようにして実現される. PGP/GnuPGはまず共通鍵暗号でセッション鍵をつくってファイルを暗号化する. そして,相手の公開鍵でセッション鍵を暗号化して暗号化されたファイルに添付 する.(セッション鍵は使い捨てなので,毎回異なるファイルが生成される.) このようにして 共通鍵暗号と公開鍵暗号を組み合わせていることから,PGP/GnuPGは ハイブリッド暗号とも呼ばれる.

アルゴリズムの変更

gpgが用いているデフォルトの共通鍵暗号アルゴリズムはCAST5だが,これを twofishに変更する場合は``-cipher-algo''で指定する.ただしデフォルトの CAST5であっても現状では安全かつ,十分に処理が速いので,一般ユーザが他 の暗号アルゴリズムに積極的に変更する意味はない.このようなアルゴリズム の変更は安全性よりもむしろユーザ間での互換性を損なう危険があることを知っ ておくべきだろう.


% gpg --cipher-algo twofish --encrypt --recipient hironobu@h2np.net foo

備考

キーサインパーティー

キーサインパーティーと呼ばれる公開鍵の認証方法がある. これには, みんなでどこかに集まって 全員が顔を見合わせながら相互に認証する方法,あるいは1人または少数の認 証担当者がいて,その者が本人確認し署名を行うという2つの手法がある.

前者はOpenPGPのメッシュ型認証パスを活用しており, お互いを知り親睦を深めるという効果も期待できるが,非常に効率が悪いので, 人数の規模が小さい場合に限られる.

オープンソース開発者の間では,サインパーティーの手引き も配布されている(GnuPG Keysigning Party HOWTO, http://www.cryptnet.net/fdp/crypto/gpg-party.html). たとえば,IETFの年4回の大会においても,夜のセッションでサインパーティーが開かれるのが恒例になっている. こうした開発者コミュニティでは,PGPサインパーティーは一定の 機能を果たしていると言える. また,キーサインパーティーの開催予告をインターネット上で公開する サイトも存在する (http://www.herrons.com/kb2nsx/keysign.html)

組織内の利用としては,後者の方法が一般的である.具体的には, セキュリティ担当者に事前に公開鍵とフィンガープリントを送り, 面接の後に担当者が公開鍵に電子署名を施すといった方法である. たとえばペンシルヴァニア大学では,セキュリティ担当者による署名申請手続きの ガイドラインを公開している (http://www.upenn.edu/computing/security-privacy/keyparty.html).

参考文献

1
Jon Callas, Lutz Donnerhacke, Hal Finney, and Rodney Thayer.
OpenPGP Message Format.
Request For Comments, November 1998.
RFC 2440 (Category: Standards Track) replaces RFC 1991, ``PGP Message Exchange Formats''.

2
Jon Callas, Lutz Donnerhacke, Hal Finney, and Rodney Thayer.
OpenPGP Message Format.
Internet Draft, August 2001.
draft-ietf-openpgp-rfc2440bis-03.txt. Revision of RFC 2440[1]. http://www.ietf.org/internet-drafts/draft-ietf-openpgp-rfc2440bis-03.t xt.

3
D. Eastlake, S. Crocker, and J. Schiller.
Randomness recommendations for security.
Request For Comments, December 1994.
RFC 1750. (Status: Informational).
(オンライン情報の最終アクセス日は2001年12月29日である.)

Copyright2002 Shinji Yamane and Hironobu Suzuki.

本ドキュメントは、GNU Free Documentation License 1.1(GNU フリー文書 利用許諾契約書)の条件下で自由に利用可能である。 詳しくは,http://www.gnu.org/copyleft/fdl.html にて入手可能である.


 

YAMANE Shinji
平成14年2月13日