GNU Privacy Guard

提供: セキュリティ
2015年9月22日 (火) 19:03時点におけるDaemon (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

GNU Privacy Guard (GPG, GnuPG))とは、Pretty Good Privacy(PGP)の別の実装です。

読み方

GNU Privacy Guard
ぐにゅー ぷらいばしー がーど
GPG
じーぴーじー
GnuPG
ぐにゅーぴーじー

概要

GNU Privacy Guard (GPG, GnuPG))とは、Pretty Good Privacy(PGP)の別の実装です。

gpgは、以下のアルゴリズムをサポートしています。

公開鍵
RSA, ELG, DSA
暗号方式
IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
ハッシュ
MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮
無圧縮, ZIP, ZLIB, BZIP2

インストール

Linuxにデフォルトでインストールされています。

FreeBSDにインストールする場合

pkgコマンドでインストールする場合

sudo pkg install gnupg pinentry-curses

使い方

gpg コマンド

$ gpg --help
gpg (GnuPG) 2.0.14
libgcrypt 1.4.5
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 
Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
        CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
 
Syntax: gpg [options] [files]
sign, check, encrypt or decrypt
default operation depends on the input data
 
Commands:
 
 -s, --sign                 make a signature
     --clearsign            make a clear text signature
 -b, --detach-sign          make a detached signature
 -e, --encrypt              encrypt data
 -c, --symmetric            encryption only with symmetric cipher
 -d, --decrypt              decrypt data (default)
     --verify               verify a signature
 -k, --list-keys            list keys
     --list-sigs            list keys and signatures
     --check-sigs           list and check key signatures
     --fingerprint          list keys and fingerprints
 -K, --list-secret-keys     list secret keys
     --gen-key              generate a new key pair
     --delete-keys          remove keys from the public keyring
     --delete-secret-keys   remove keys from the secret keyring
     --sign-key             sign a key
     --lsign-key            sign a key locally
     --edit-key             sign or edit a key
     --gen-revoke           generate a revocation certificate
     --export               export keys
     --send-keys            export keys to a key server
     --recv-keys            import keys from a key server
     --search-keys          search for keys on a key server
     --refresh-keys         update all keys from a keyserver
     --import               import/merge keys
     --card-status          print the card status
     --card-edit            change data on a card
     --change-pin           change a card's PIN
     --update-trustdb       update the trust database
     --print-md             print message digests
     --server               run in server mode
 
Options:
 
 -a, --armor                create ascii armored output
 -r, --recipient USER-ID    encrypt for USER-ID
 -u, --local-user USER-ID   use USER-ID to sign or decrypt
 -z N                       set compress level to N (0 disables)
     --textmode             use canonical text mode
 -o, --output FILE          write output to FILE
 -v, --verbose              verbose
 -n, --dry-run              do not make any changes
 -i, --interactive          prompt before overwriting
     --openpgp              use strict OpenPGP behavior
 
(See the man page for a complete listing of all commands and options)
 
Examples:
 
 -se -r Bob [file]          sign and encrypt for user Bob
 --clearsign [file]         make a clear text signature
 --detach-sign [file]       make a detached signature
 --list-keys [names]        show keys
 --fingerprint [names]      show fingerprints
 
Please report bugs to <http://bugs.gnupg.org>.
gpg (GnuPG) 2.0.22
libgcrypt 1.5.3
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 
Home: ~/.gnupg
サポートしているアルゴリズム:
公開鍵: RSA, ELG, DSA, ?, ?
暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
      TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
ハッシュ: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮: 無圧縮, ZIP, ZLIB, BZIP2
 
形式: gpg [オプション] [ファイル]
署名、検査、暗号化や復号
デフォルトの操作は、入力データに依存
 
コマンド:
 
 -s, --sign                 署名を作成
     --clearsign            クリア・テクスト署名を作成
 -b, --detach-sign          分離署名を作成
 -e, --encrypt              データを暗号化
 -c, --symmetric            暗号化には共通鍵暗号方式のみを使用
 -d, --decrypt              データを復号 (デフォルト)
     --verify               署名を検証
 -k, --list-keys            鍵の一覧
     --list-sigs            鍵と署名の一覧
     --check-sigs           鍵署名の検査と一覧
     --fingerprint          鍵とフィンガー・プリントの一覧
 -K, --list-secret-keys     秘密鍵の一覧
     --gen-key              新しい鍵対を生成
     --gen-revoke           失効証明書を生成
     --delete-keys          公開鍵リングから鍵を削除
     --delete-secret-keys   秘密鍵リングから鍵を削除
     --sign-key             鍵に署名
     --lsign-key            鍵へ内部的に署名
     --edit-key             鍵への署名や編集
     --passwd               パスフレーズの変更
     --export               鍵をエクスポートする
     --send-keys            鍵サーバに鍵をエクスポートする
     --recv-keys            鍵サーバから鍵をインポートする
     --search-keys          鍵サーバの鍵を検索する
     --refresh-keys         鍵サーバから鍵を全部更新する
     --import               鍵のインポート/マージ
     --card-status          カード・ステイタスを表示
     --card-edit            カードのデータを変更
     --change-pin           カードのPINを変更
     --update-trustdb       信用データベースを更新
     --print-md             メッセージ・ダイジェストを表示
     --server               サーバ・モードで実行
 
オプション:
 
 -a, --armor                ASCII形式の外装を作成
 -r, --recipient USER-ID    USER-ID用に暗号化
 -u, --local-user USER-ID   署名や復号にこのUSER-IDを使用
 -z N                       圧縮レベルをNに設定 (0は非圧縮)
     --textmode             正準テキスト・モードを使用
 -o, --output FILE          出力をFILEに書き出す
 -v, --verbose              冗長
 -n, --dry-run              無変更
 -i, --interactive          上書き前に確認
     --openpgp              厳密なOpenPGPの振舞を採用
 
(コマンドとオプション全部の一覧は、マニュアル・ページをご覧ください)
 
例:
 
 -se -r Bob [ファイル]      ユーザBobへ署名と暗号化
 --clearsign [ファイル]     クリア・テクスト署名を作成
 --detach-sign [ファイル]   分離署名を作成
 --list-keys [名前]         鍵を表示
 --fingerprint [名前]       フィンガー・プリントを表示
 
バグは <http://bugs.gnupg.org> までご報告ください。

鍵の作成

% gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 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 と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
あなたの選択は?
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
 は無期限です
これで正しいですか? (y/N) y
 
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。
 
本名: kaoru
電子メール・アドレス: foo@bar.com
コメント: test
次のユーザIDを選択しました:
    "kaoru (test) <foo@bar.com>"
 
名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o
秘密鍵を保護するためにパスフレーズがいります。
 
 
                ┌─────────────────────────────────────────────────┐
                │ このパスフレーズをもう一度入力してください      │
                │                                                 │
                │ パスフレーズ ___________________________________│
                │                                                 │
                │      <OK>                           <Cancel>    │
                └─────────────────────────────────────────────────┘
 
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動かす、
ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、
乱数生成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動かす、
ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生成器に
十分なエントロピーを供給する機会を与えることができます。 
 
gpg: /home/kaoru/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵EB939698を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。
gpg: 信用データベースの検査
gpg: 「ギリギリの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1
署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u pub   2048R/EB939698 2014-03-22
フィンガー・プリント = 2B77 8105 570A 1A16 3B6A  2969 1AFC 0BE7 EB93 9698 uid
kaoru (test) <foo@bar.com> sub   2048R/436B4C25 2014-03-22

鍵の確認

秘密鍵

gpg --list-secret-keys
$ gpg --list-secret-keys
/home/kaoru/.gnupg/secring.gpg
-------------------------------
sec   2048R/EB939698 2014-03-22
uid                  kaoru (test) <foo@bar.com>
ssb   2048R/436B4C25 2014-03-22

公開鍵

$ gpg --list-keys
/home/kaoru/.gnupg/pubring.gpg
-------------------------------
pub   2048R/EB939698 2014-03-22
uid                  kaoru (test) <foo@bar.com>
sub   2048R/436B4C25 2014-03-22

公開鍵のエクスポート

公開鍵をエクスポートします。

$ gpg -o ./kaoru.pub --export kaoru
$ ls kaoru.pub
kaoru.pub
$ file kaoru.pub
kaoru.pub: GPG key public ring

秘密鍵のエクスポート

秘密鍵(プライベート鍵)をエクスポートするときは、以下のコマンドで行います。

$ gpg -o file.secret --export-secret-key kaoru

秘密鍵のインポート

$ gpg --import file.secret

公開鍵のインポート

user で kaoru の公開鍵 kaoru.pub をインポートします。

% gpg --import kaoru.pub
gpg: directory `/home/user/.gnupg' created
gpg: new configuration file `/home/user/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/user/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/user/.gnupg/secring.gpg' created
gpg: keyring `/home/user/.gnupg/pubring.gpg' created
gpg: /home/user/.gnupg/trustdb.gpg: trustdb created
gpg: key EB939698: public key "kaoru (test) <foo@bar.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

データの暗号化

テスト用のファイルを用意します。

% echo 'clear text' > test.txt

使用する鍵を指定して実行します。 ユーザー userが kaoru の鍵を用いて、test.txtを暗号化します。test.txt.gpgというファイルが作成されます。

user@a1:~/tmp % gpg -e -r kaoru test.txt
gpg: 436B4C25: There is no assurance this key belongs to the named user
 
pub  2048R/436B4C25 2014-03-22 kaoru (test) <foo@bar.com>
 Primary key fingerprint: 2B77 8105 570A 1A16 3B6A  2969 1AFC 0BE7 EB93 9698
      Subkey fingerprint: 7C0E 6415 97E8 747F D5B8  F394 F2C3 6406 436B 4C25
 
It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.
 
Use this key anyway? (y/N) y
user@a1:~/tmp % ls -l
total 12
-rw-r--r--  1 user  user  1178 Mar 22 19:18 kaoru.pub
-rw-r--r--  1 user  user    11 Mar 22 19:21 test.txt
-rw-r--r--  1 user  user   351 Mar 22 19:22 test.txt.gpg
user@a1:~/tmp % file test.txt.gpg
test.txt.gpg: data

データの復号化

復号化するときに、パスフレーズの入力画面が表示されます。 復号したデータの出力ファイルを -o オプションで指定します。出力ファイルを指定しない場合は、標準出力に表示されます。

$ gpg -r kaoru -d -o test.txt test.txt.gpg
 
ここで、パスフレーズの入力のダイアログが表示されます。
 
gpg: 2048-ビットRSA鍵, ID 436B4C25, 日付2014-03-22に暗号化されました
      "kaoru (test) <foo@bar.com>"
$ ls -l
total 12
-rw-r--r--  1 kaoru  user  1178  322 19:14 kaoru.pub
-rw-r--r--  1 kaoru  user    11  322 19:25 test.txt
-rw-r--r--  1 kaoru  user   351  322 19:24 test.txt.gpg
$ cat test.txt
clear text

鍵の削除

公開鍵秘密鍵の削除方法は、以下の通りです。

$ gpg --delete-keys keyname
$ gpg --delete-secret-keys keyname

GnuPGを使ったデジタル署名ファイルの作り方

ファイルのデジタル署名の作成

ドキュメントのデジタル署名を作成するには、--signオプションを使用します。

% echo foobar > foo.txt
% gpg --sign foo.txt

実行例は以下の通りです。

$ gpg --sign foo.txt
 
次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"kaoru (test) <foo@bar.com>"
2048ビットRSA鍵, ID 87ACBAF5作成日付は2014-04-28
 
$ file foo.txt.gpg
foo.txt.gpg: data
$ ls -l foo.txt.gpg foo.txt
-rw-r--r--  1 kaoru  user    7  428 19:24 foo.txt
-rw-r--r--  1 kaoru  user  331  428 23:28 foo.txt.gpg
$ strings *.gpg
foo.txtS^e
foobar
e>S]
n#bb
f@?/
c>-\/9^
3G m

デジタル署名の検証

署名されたドキュメントの署名を検証するには、--verifyオプションを使用します。

% gpg --verify foo.txt.gpg

実行例は以下の通りです。

$ gpg --verify foo.txt.gpg
gpg: 月  4/28 23:28:15 2014 JSTにRSA鍵ID 87ACBAF5で施された署名
gpg: "kaoru (test) <foo@bar.com>"からの正しい署名

署名されたファイルからのドキュメントの取り出し方法

署名されたファイルからオリジナルドキュメントを取り出すには、--decryptオプションを使用します。--outputオプションで、実際のファイルの内容を出力するファイルを指定できます。

$ gpg --output foo.txt --decrypt foo.txt.gpg

実行例は以下の通りです。

$ gpg --output foo.txt --decrypt foo.txt.gpg
gpg: 月  4/28 23:19:45 2014 JSTにRSA鍵ID 87ACBAF5で施された署名
gpg: "kaoru (test) <foo@bar.com>"からの正しい署名
$ ls -l foo.txt
-rw-r--r--  1 kaworu  user  7  428 23:34 foo.txt
$ cat foo.txt
foobar

クリアテキストの署名の作成

--signオプションで作成したファイルは、バイナリ形式でした。 E-mail などで送るようなときに、ASCII形式の署名を作成する場合には、--clearsignなオプションを使用します。

$ gpg --output foo.sig --clearsign foo.txt

実行例は以下の通りです。

$ gpg --output foo.sig --clearsign foo.txt
 
次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"kaoru (test) <foo@bar.com>"
2048ビットRSA鍵, ID 87ACBAF5作成日付は2014-04-28
 
$ ls -l foo.sig
-rw-r--r--  1 kaworu  user  542  428 23:42 foo.sig
$ file foo.sig
foo.sig: ASCII text
$ cat foo.sig
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
 
foobar
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (FreeBSD)
 
iQEcBAEBAgAGBQJTXmjHAAoJEADlMoqHrLr1E0wH/2nFPppjvIOMs4R63xzaP/El
P6LOnvLzuartV/KU1Zdn5Ul+DW5sE4966CXBi6CZHLMSb5hF9Vx7hXDy6W5rQlp4
goP3YJ5b32ANGi2bVpFonN3N54z5GklXn7hqMxulM7hDWlvLu663Z/LhbVY+OFTS
YXUHDay+ihscxmuqK1QyBpFVxUf2Jb64gV+4OE0OdTUB6tCn03280ZSVoylqCzJR
YWxBfYDJZVxwjHllf12nbBlOhHTFNcZfhdTD9RD7W4k+sajoKiTIPkm0ULrqKd6E
okZ0Z++h6O3vS4ROiyw1V79chRDsGxj9/IIkZ7WGpCdzSdA3nX2/nKKLrgcWN9o=
=jiDy
-----END PGP SIGNATURE-----

分離署名を作成する方法

デジタル署名をオリジナルファイルとは、分離された署名ファイルとして作成する場合には、 --detach-sign オプションを使用し、新しいファイルを作成できます。

foo.txt.asc というファイルが作成されます。

$ gpg --armor --detach-sig foo.txt
 
次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"kaoru (test) <foo@bar.com>"
2048ビットRSA鍵, ID 87ACBAF5作成日付は2014-04-28
 
$ ls -ls foo.txt.asc
4 -rw-r--r--  1 kaworu  user  488  428 23:46 foo.txt.asc
$ file foo.txt.asc
foo.txt.asc: PGP signature
$ cat foo.txt.asc
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (FreeBSD)
 
iQEcBAABAgAGBQJTXmnNAAoJEADlMoqHrLr1JQ0H/0Txxqb6+lBbyAk5qozFymud
dJNF5k7ZZVzW7tM53VkNMK3kbV2KSUAbvoPpkaeg0aqO7qeUE4VPDC1j2qQmjBhH
Z8cukXAmRyn2XEeHC07rQaQmosT7ChNQ9A2J7zsWtfbGtuKJpUFWEazkBLOsN7ul
f453dHRLhLQ/TBg6MnVjHVa7nfA7wJVer/dv8SE5mwlia+nH0VwocKYGct/yKzM0
aaAxoRPYTIkQrJ1ZLh81JfNtck1iYce06aeSIRAdID4BMWZCeadp4bkcZo6LhAqf
GlvCBpMLEeI+m2y4CEDoK6ixIRCq7fAjtDk+gA1caoItD+HS4499UmWH145Xv9o=
=zDvO
-----END PGP SIGNATURE-----

分離署名を検証する方法

$ gpg --verify foo.txt.asc foo.txt

実行例は以下の通りです。

$ gpg --verify foo.txt.asc foo.txt
gpg: 月  4/28 23:46:37 2014 JSTにRSA鍵ID 87ACBAF5で施された署名
gpg: "kaoru (test) <foo@bar.com>"からの正しい署名

ドキュメントの暗号化と署名

暗号化と復号は、以下の通りです。

% gpg --sign --encrypt -r kaoru foo.txt
% gpg --sign --decrypt -r kaoru foo.txt.gpg

FAQ

can't connect to the PIN entry module

pinentry-curses を入れてない場合、以下のエラーで gpg --gen-key が終了します。

gpg-agent[40930]: can't connect to the PIN entry module: IPCの接続コールに失敗しました
gpg-agent[40930]: command get_passphrase failed: PIN 入力がありません
gpg: エージェントに問題: PIN 入力がありません
gpg: 鍵の生成が取り消されました。
[1]    40913 exit 2     gpg --gen-key

英語で表示される場合は、以下のエラーメッセージになります。

You need a Passphrase to protect your secret key.
 
can't connect to `/home/user/.gnupg/S.gpg-agent': No such file or directory
gpg-agent[3363]: directory `/home/user/.gnupg/private-keys-v1.d' created
gpg-agent[3363]: command get_passphrase failed: Operation cancelled
gpg: cancelled by user
gpg: Key generation canceled.

can't connect to .gnupg/S.gpg-agent: No such file or directory

can't connect to `/home/user/.gnupg/S.gpg-agent': No such file or directory

手動で、gpg-agentを起動します。

gpg-agent --daemon --enable-ssh-support --write-env-file "${HOME}/.gnupg/agent.info"

.bashrc で設定する場合は、以下の通りです。

if [ -f "${HOME}/.gnupg/agent.info" ]; then
        . "${HOME}/.gnupg/agent.info"
        export GPG_AGENT_INFO
        export SSH_AUTH_SOCK
        export SSH_AGENT_PID
fi
 
GPG_TTY=$(tty)
export GPG_TTY

gpg problem with the agent No pinentry

関連項目




スポンサーリンク