[ホーム]-> [GnuPG]-> [HowTo]
[Next][Previous]

GnuPG の使用法


暗号化と復号化

暗号化 (encryption)

例えば file という名前のファイルを暗号化しようと思った場合は

lucy~$ gpg -e -r user_id  file

とします。file.gpg という暗号化されたファイルができます。user_id の部分には、送る相手の鍵の USER ID を指定します。 これについては、USER ID の指定を参照して下さい。以下では その指定部分は user_id と書くことにしておきます。 また、-r user_id を省略すると、USER ID を尋ねてきます。

メールに埋め込む場合など、アスキー形式で送る場合には、

lucy~$ gpg -ea -r user_id  file

のようにオプションに a を追加してアスキー形式を指定します。 この場合のデフォルトの出力ファイルは file.asc です。

出力ファイルを変更するには o オプションを使います。これは他の場合でも同様。

lucy~$ gpg -ea -r user_id file -o output_file

複号化 (decryption)

暗号化する場合のオプション ed に変えるだけです。アスキー形式でも同様です。

lucy~$ gpg -d  file.gpg

結果は標準出力にでるので、複号したファイルを保存するには、

lucy~$ gpg -d  file.gpg > file
とリダイレクトするなどすればいいでしょう。

署名と検証

署名

lucy~$ gpg -s  file
lucy~$ gpg --sign file

file から署名つきメッセージを作成します。 上のようにタイプした後、メッセージに従ってパスフレーズを入力すれば、file.gpg という署名付きメッセージができます。(なお、こうしてできたファイル読むには

lucy~$ gpg -d  file.gpg

とします。)

ただし、これはバイナリファイルなので、メールで送るには不便です。そこで

lucy~$ gpg -sa file
lucy~$ gpg --sign  --armor file

とするとアスキー形式のファイルができます。ファイル名は file.asc になります。

しかし、テキストファイルに署名する場合は次のように本文はそのままの形で使うクリア署名を使うことが多いと思われます。

lucy~$ gpg --clearsign file

これにより、file.asc というファイルができます。この中身は元のテキストをそのまま含み、それにアスキー形式の署名を添付した形になっています。

さて、たとえクリア署名でも送信するファイルは元ファイルと同じではありませんし、署名は元ファイルと結合されています。 それでは不都合な場合のために、元ファイルは完全に残したまま署名は別ファイルとする分離署名が用意されています。これを生成するには、

lucy~$ gpg -b file
lucy~$ gpg --detach-sig  file

などとします。署名ファイルはデフォルトでは file.sig になります。もちろん次のようにしてアスキー形式にすることもできます。

lucy~$ gpg -ba  file

この場合の署名ファイルはデフォルトでは、file.asc というファイル名になります。

検証

署名を検証する時は、

lucy~$ gpg --verify file

とします。これは標準の形式でもアスキー形式でも同様です。分離署名の場合は、file とその署名 file.sig に対して

lucy~$ gpg --verify file.sig  file

とします(署名と元ファイルの順序に注意)。署名がアスキー形式でも同じです。


鍵の管理

鍵指紋 (key fingerprint)

相手がこちらの公開鍵を確かに本人のものだと確認できるように、普段からメールに自分の公開鍵の電子指紋を添付しておくといいです。 相手は公開鍵から生成される電子指紋と普段のメールに添付されている鍵指紋とを比べることで正しい鍵であることをチェックできます(→電子指紋 (digital fingerprint)、鍵指紋 (key fingerprint) 参照)。

lucy~$ gpg --fingerprint user_id

とすれば、標準出力に user_id で指定した鍵の電子指紋が出力されます。コピーアンドペーストするなり、リダイレクトするなりして保存しておきましょう。

書き出し (export), キーサーバーへの送信

次のようにすれば、user_id で指定した鍵をアスキー形式で取り出せます。

lucy~$ gpg -a --export  user_id

結果は標準出力に出されるので、コピーアンドペーストやリダイレクトで保存してから、ウェブページに貼り付けておくなりしましょう。

オプションの -a を指定しなければ、バイナリのままの鍵が出力されますが、この場合は適当にリダイレクトしないと画面が乱れちゃいます。例えば

lucy~$ gpg --export user_id  > keyfile

とかすると、keyfile に素の公開鍵が保存されます。

直接キーサーバーに鍵を登録するには、次のようにします。KEY_SERVER の部分はキーサーバーの URL に読み換えて下さい。

lucy~$ gpg --keyserver KEY_SERVER --send-keys

読み込み (import), キーサーバーからの受信

例えばウェブページなどで公開されている相手の公開鍵を自分の鍵束に登録するには、その鍵を一旦ファイルに落して(そのファイルを file とします)、次のようにします。鍵はアスキー形式でも素のままのものでもどちらでも構いません。

lucy~$ gpg --import file

なお、特に鍵の輪の中に入ってない場合は、鍵指紋と照合するなのでして確認した後に署名しないと、実際の検証には使えないので、登録後はそれも忘れずに。

また、キーサーバーなどに登録されているものをそのまま読み込むには次のようにします。KEY_SERVER の部分はキーサーバーの URL に読み換えて下さい。

lucy~$ gpg --keyserver KEY_SERVER --recv-keys  user_id

編集

lucy~$ gpg --edit-key  user_id

とすると、対話的に鍵関係の編集、つまり、鍵を破棄したり、信用度を調整したり、という操作ができます。上のように起動すると、

Command>

というプロンプトがでます。これに対して help と打込むとコマンドとその説明がでます。日本語化してあると、

Command> help
quit       このメニューを終了
save       保存して終了
help       このヘルプを見る
fpr        指紋を見る
list       鍵とユーザ ID の一覧
uid        ユーザ ID N の選択
key        副鍵 N の選択
check      署名の一覧
sign       鍵へ署名
lsign      鍵に書き出し不可な署名
adduid     ユーザ ID の追加
deluid     ユーザ ID の消去
addkey     副鍵の追加
delkey     副鍵の削除
delsig     署名の削除
expire     有効期限の変更
toggle     秘密鍵と公開鍵一覧の切り替え
pref       優先順位の一覧

というメニューが表示されるはずです。USER ID を追加してから前のものを消せば、USER ID の変更も可能です。

鍵の信用度と鍵への署名

鍵指紋と信用の輪

ある公開鍵が当人のものかどうかの判断には一つには鍵指紋も有効です。ただこの場合は鍵指紋自体の信用が問題になるので、普段からメールをやり取りしてる相手でないと難しいことが多いでしょう。

そこで、鍵束の項でも説明したように、信用できる人が信用している鍵は信用するという「信用の輪」を利用する仕組も用意されています[1]。 具体的には、鍵には署名をつけることができ、信用できる人が署名している鍵は信用度をアップするという方式です。

鍵の有効性(公開鍵が当人のものかどうか)は次のようにランク付けされています。

鍵の有効性
有効性短縮形説明
unknownq情報が不十分
nonen無効
marginalm多分本物
fullf信用できる
errore計算に失敗
ultimateu究極的に信用(=自分の鍵)

一方、あなたの鍵束の中の鍵の持ち主に対しての信用のレベルは次の通りです。

鍵の持ち主への信用度
信用度短縮形説明
--未設定
unknownq未知
nonen信用しない
marginalmある程度信用する
fullf完全に信用する

どちらにおいても、短縮形は、gpg --edit-key などでの表示に使われます(下の実際の設定の所を参照)。

鍵の有効性を、鍵に付加された署名と署名した人の信用度から計算する方法は、デフォルトでは

なおかつ の時に、full とする、というものです。この3人とか5ステップというのはカスタマイズが可能です(→[2])。marginal の判定法は調べてません。また大抵の方は上の説明だけでは信用の輪の具体的形成方法について疑問点が残るはずですが、それは私もまだ分かってないためです。(おいおい)

具体的な操作

実際の信用度の設定は、gpg --edit-key user_id編集モードに入り、trust コマンドを用いて行います。同様に鍵への署名は sign コマンドです。実際には次のような感じです。 fuge さんが、foo bar (baz) さんの鍵に署名する場合を想定してます。

lucy~$ gpg --edit-key baz
gpg (GnuPG) 1.0.1; Copyright (C) 1999 Free Software Foundation, Inc.
(中略)
Command> trust
pub  1024D/E93A2C66  created: 2000-03-12 expires: never      trust: -/q
sub  1024g/56DB3E76  created: 2000-03-12 expires: never     
(1)  foo bar (baz) <foo@inage.or.jp>

公開鍵の右の方に trust: -/q と見えてますね。1番目が鍵の持ち主への信用度、二番目が鍵の有効性で、ともに短縮形 (信用度の短縮形/有効性の短縮形) で表示されています。 現在は信用度は未設定で、有効性は unknown ということです。

このユーザの信用度を他のユーザの鍵で検証して決めて下さい。
(パスポートを見せてもらったり、他から得た指紋と照合したり...)?
 1 = 未知
 2 = 信用しない
 3 = ある程度信用する
 4 = 完全に信用する
 s = より詳しい情報を見る
 m = メインメニューに戻る
あなたの決定は?

さて、ここでは 4 と答えてみます。

あなたの決定は? 4
                 
pub  1024D/E93A2C66  created: 2000-03-12 expires: never      trust: f/q
sub  1024g/56DB3E76  created: 2000-03-12 expires: never     
(1)  foo bar (baz) <foo@inage.or.jp>

では次に署名もしちゃいましょう。

Command> sign
             
pub  1024D/E93A2C66  created: 2000-03-12 expires: never      trust: f/q
             Fingerprint: B07D 7899 0F60 7C7A 9D70  E60E F2DD 0386 E93A 2C66
     foo bar (baz) <foo@inage.or.jp>
本当に この鍵にあなたの鍵で署名して良いですか: "fuge (hoga) <fuge@inage.or.jp>"
本当に署名しますか? yes
                       
次のユーザのロックを解除するにはパスフレーズが必要です
ユーザ: "fuge (hoga) <fuge@inage.or.jp>"
1024 ビット DSA 鍵, ID BFF38FC0 が作成されました 2000-03-20
パスフレーズを入力: ←パスフレーズを入力

ここで、check してみると、


Command> check
uid  foo bar (baz) <foo@inage.or.jp>
sig!       E93A2C66 2000-03-12   [自己署名]
sig!       BFF38FC0 2000-04-01   fuge (hoga) <fuge@inage.or.jp>

となって確かに署名がついてることが分かります。(始めの [自己署名] というのは、鍵の生成時に自動的に付けられる本人の署名です。) 最後に save して終わりです。この後、もう一度編集モードに入れば、trust: の所が f/f に変わっていることも確かめられるはずです。


USER ID の指定

USER ID の指定方法にはいくつか方法があります。

lucy~$ gpg --list-keys

とやると、例えば

pub  1024D/F5AF82C4 2000-01-01  foo bar (baz) <foo@inage.or.jp>
sub  1024g/C557BF56 2000-01-01

と表示される一組の鍵の場合で説明することにします。上が公開鍵、下が秘密鍵です。

Key ID での指定

上では F5AF82C4 という数字が(公開)鍵の KEY ID ですが、これで指定することができます。

Mail address

メールアドレスやその一部を指定する方法があります。いくつか列挙します。

=foo bar (baz) <foo@inage.or.jp>

先頭の = は、完全一致を表します。続けて USER ID の正確なメールアドレスを記します。実際には、

lucy~$ gpg --fingerprint '=foo bar (baz) <foo@inage.or.jp>'

のように引用符で囲わないと shell に正しく渡せないので注意しましょう。

先頭の = をつけない場合は、例えば
<foo@inage.or.jp>
とか、
baz
とかでも指定できます。複数にマッチする場合の動作は gpg のオプションによって違うようです。例えば --fingerprint では全てを列挙します。
+foo baz bar
+ に続けていくつかの USER ID に含まれてる語を並べるやり方があります。並べられた語を一つでも含むものが選択されます。順序は関係ありません。 ただし、それぞれの語は正確に一致している必要があります。 例えば +foo でなく +fo とすると駄目です。

鍵指紋での指定

鍵指紋でも指定できます。この場合は間の空白は削って数字とアルファベットをずらずら並べたものをそのまま指定します。次のような感じです。
lucy~$ gpg --fingerprint D88A25D2A5DAF2B42F88F0FECAB6628DF5AF63C4
pub  1024D/F5AF82C4 2000-01-01  foo bar (baz) <foo@inage.or.jp>
     Key fingerprint = D88A 25D2 A5DA F2B4 2F88  F0FE CAB6 628D F5AF 63C4
sub  1024g/C557BF56 2000-01-01

その他

この他に local ID を使う方法もありますが、これは余程の理由がある場合でない限り使わない方がよいので、ここでは説明しません。

アスキー形式

アスキー形式というのは一言で言うと英数字だけからなるテキスト形式ということです、というのは流石に不正確 (というか、自分でもあまりにあんまりな説明だと思う) ですが、正確な定義が分かる人は説明しなくても分かるような気もするので、これだけにしておきます。

最近では MIME 形式で画像なんかをメールに貼付して送ることができるようになっていますが、これも実際にはアスキーにエンコードして送ってるわけで、鍵とか署名をアスキー形式にできれば、いろいろ都合が良い場面も多いことは想像がつくと思います。 メールやウェブページにも直接目に見える形で貼り付けることができますし。

ということで、gpg では暗号化や署名の時などに -a オプションを使うことでアスキー形式を出力できるようになっています。


脚注

[1] もちろんこの場合の信用できるというのは、人柄とかではなく、不用意にあやしげな鍵に署名したりしないということです。

[2] 例えば、
lucy~$ gpg --marginals-needed 2 --max-cert-depth 3 --edit-key
などとすればいいはずです。試してませんが。
[ホーム]-> [GnuPG]-> [HowTo]
[Next][Previous]