GPG入門 - ファイルの暗号化・復号と署名の基本

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

公開鍵でファイルを暗号化・復号するには?

結論: 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 も、メール本文などで使われる。

--verifyGood signature でも、その 公開鍵が本当に相手のものか は別問題。鍵の入手元(公式サイトのフィンガープリント等)を確認すること。検証はあくまで「その鍵で署名された」ことの保証。

まとめ:コマンド早見表

結論: パスワード方式は -c、公開鍵方式は -e -r、署名は -b。テキスト出力は -a、復号は -d を覚えれば日常操作はカバーできる。

目的 コマンド
パスワードで暗号化 gpg -c file
公開鍵で暗号化 gpg -e -r <ID> file
復号 gpg -d file.gpg
鍵ペアを作成 gpg --full-generate-key
公開鍵を書き出す gpg --export -a <ID>
公開鍵を取り込む gpg --import key.asc
分離署名を作成 gpg -b -a file
署名を検証 gpg --verify file.asc file