GPG入門 - ファイルの暗号化・復号と署名の基本
この記事で解決できること
gpgでファイルを 暗号化・復号 できるようになる- 公開鍵方式 と パスワード方式(共通鍵)の 使い分け が分かる
- 署名 でファイルの改ざん・なりすましを 検証 できる
結論(使い分けの型)
- 自分だけ / 相手に渡すパスワードで 守る →
gpg -c(パスワード方式) - 相手の公開鍵で 渡す →
gpg -e -r <相手のID>(公開鍵方式) - 改ざんされていないことを示す →
gpg -b(分離署名)
前提(対象環境)
- OS:Ubuntu / Debian 系(
apt install gnupg)。多くのディストリで標準同梱 - コマンド名は
gpg(GnuPG 2.x 系を想定)
GPG とは何か?
結論: GPG は GnuPG の実装で、公開鍵暗号と署名を扱う標準ツール。暗号化で「読めなくし」、署名で「改ざんを検出」する。
GPG(GnuPG, GNU Privacy Guard)は OpenPGP 標準(RFC 4880)を実装した暗号化ツール。やれることは大きく 2 つ。
- 暗号化 / 復号:第三者に中身を読ませない
- 署名 / 検証:誰が作り、改ざんされていないかを保証する
暗号化には 2 方式がある。公開鍵方式(相手の公開鍵で暗号化し、相手の秘密鍵でしか復号できない)と、パスワード方式(共通鍵 / 対称暗号。同じパスワードで暗号化・復号する)。鍵の準備が要らないパスワード方式から見ていく。
パスワードだけで暗号化するには?
結論: 鍵ペア不要で最も手軽なのが
gpg -c。入力したパスフレーズで暗号化し、同じパスフレーズで復号する対称暗号。
鍵の作成すら不要。-c(--symmetric)でパスフレーズを使った暗号化ができる。
$ gpg -c secret.txt
実行するとパスフレーズを聞かれ、secret.txt.gpg(バイナリ)が生成される。元ファイルは残るので、不要なら別途削除する。
復号は -d(--decrypt)。
$ gpg -d secret.txt.gpg
標準出力に中身が表示される。ファイルへ書き出すなら -o で出力先を指定する。
$ gpg -o secret.txt -d secret.txt.gpg
メールやチャットに貼れるテキスト形式が欲しいときは -a(--armor)を付ける。secret.txt.asc という ASCII 形式(Base64)になる。
$ gpg -c -a secret.txt
パスワード方式は パスフレーズを安全に相手へ渡せること が前提。チャットに暗号文とパスワードを並べて送るのは無意味。鍵交換が難しいなら次の公開鍵方式を使う。
公開鍵方式を使うには?
結論: まず鍵ペアを作る。
gpg --full-generate-keyで秘密鍵(自分用)と公開鍵(配布用)が生成される。
公開鍵方式では「暗号化に使う公開鍵」と「復号に使う秘密鍵」のペアを最初に作る。
$ gpg --full-generate-key
対話形式で鍵の種類・長さ・有効期限・名前・メールアドレスを聞かれる。迷ったら既定値(RSA、3072 bit 以上)で問題ない。最後にパスフレーズを設定する。これは 秘密鍵を保護するためのもの で、暗号化のパスワードとは役割が異なる。
作成済みの鍵は次で確認する。
$ gpg --list-keys # 公開鍵の一覧 $ gpg --list-secret-keys # 秘密鍵の一覧
出力に表示される長い 16 進の文字列が 鍵 ID / フィンガープリント。以降、相手を指定するときに使う。
公開鍵を相手に渡すには?
結論:
gpg --export -aで公開鍵をテキスト出力し相手へ渡す。受け取った側はgpg --importで取り込む。
暗号化してもらうには、自分の 公開鍵 を相手に渡す必要がある。--export に -a を付けてテキスト化する。
$ gpg --export -a "you@example.com" > my-pubkey.asc
相手はこのファイルを取り込む。
$ gpg --import my-pubkey.asc
秘密鍵(--export-secret-keys)は絶対に共有しない。 渡すのは常に公開鍵(--export)。秘密鍵が漏れると、暗号文をすべて復号され、なりすまし署名も可能になる。
公開鍵でファイルを暗号化・復号するには?
結論:
gpg -e -r <相手のID>で相手の公開鍵を使って暗号化する。復号できるのはその相手だけ。
相手の公開鍵を取り込んだら、-e(--encrypt)と -r(--recipient)で宛先を指定して暗号化する。
$ gpg -e -r "friend@example.com" report.pdf
report.pdf.gpg が生成される。これは friend@example.com の秘密鍵を持つ人だけ が復号できる。受け取った相手は次で復号する。
$ gpg -d report.pdf.gpg > report.pdf
自分でも後から中身を確認したい場合は、宛先に自分も追加しておく(-r は複数指定できる)。
$ gpg -e -r "friend@example.com" -r "you@example.com" report.pdf
テキストで渡したいときは -a を併用する。
$ gpg -e -a -r "friend@example.com" message.txt # message.txt.asc
署名で改ざんを検証するには?
結論: 中身を暗号化せず「本物であること」だけ示すなら署名。
gpg -bで本体と別の署名ファイルを作り、--verifyで検証する。
署名は暗号化とは別物。中身は読める ままで、「確かに本人が作った / 改ざんされていない」ことを保証する。配布ファイルの真正性確認によく使われる。
最も実務的なのが 分離署名(detached signature)。-b(--detach-sign)で本体とは別の署名ファイルを作る。
$ gpg -b -a release.tar.gz
release.tar.gz.asc(署名)が生成される。本体とこの署名を一緒に配布する。受け取った側は --verify で検証する。
$ gpg --verify release.tar.gz.asc release.tar.gz
Good signature と出れば、署名者の公開鍵で検証が成立し、ファイルは改ざんされていない。
署名と暗号化は併用できる。-s -e -r <相手> で「署名付き暗号化」になる。本文を読めるテキストに署名を埋め込む --clearsign も、メール本文などで使われる。
--verify が Good signature でも、その 公開鍵が本当に相手のものか は別問題。鍵の入手元(公式サイトのフィンガープリント等)を確認すること。検証はあくまで「その鍵で署名された」ことの保証。