GnuPG チートシート
[履歴] [最終更新] (2020/02/14 00:24:04)

概要

ファイルやメールの暗号化を行うための PGP (Pretty Good Privacy) の別実装である GNU Privacy Guard (GnuPG, GPG) について基本的なコマンドを記載します。通信の暗号化を行う SSL/TLS と区別します。例えば Thunderbird では GnuPG を利用するための Enigmail というアドオンが存在します。2020 年の夏には、GnuPG とは別の PGP 実装である OpenPGP が標準サポートされる予定です。

鍵の作成

GPG のインストール

apt update && apt install -y gpg

秘密鍵と公開鍵のペアを作成、秘密鍵にパスワードを設定

gpg --gen-key

Real name: myname
Email address: myname@gmail.com

公開鍵と秘密鍵のペアは二つ作成されます。参考 Using OpenPGP subkeys in Debian development

pubsec に対して、それぞれ subssb (Secret SuBkey) が subkey です。

公開鍵の一覧

gpg --list-keys --with-subkey-fingerprints

/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2020-02-12 [SC] [expires: 2022-02-11]
      6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A
uid           [ultimate] myname <myname@gmail.com>
sub   rsa3072 2020-02-12 [E] [expires: 2022-02-11]
      56DD07F4E89478108AC8F9BA8E29C0A8270D3619

秘密鍵の一覧

gpg --list-secret-keys --with-subkey-fingerprints

/root/.gnupg/pubring.kbx
------------------------
sec   rsa3072 2020-02-12 [SC] [expires: 2022-02-11]
      6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A
uid           [ultimate] myname <myname@gmail.com>
ssb   rsa3072 2020-02-12 [E] [expires: 2022-02-11]
      56DD07F4E89478108AC8F9BA8E29C0A8270D3619

6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A56DD07F4E89478108AC8F9BA8E29C0A8270D3619公開鍵のハッシュです。Key ID ともよばれます。鍵のペアを識別するためには Key ID または uid myname <myname@gmail.com> を利用します。

gpg --fingerprint 6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A
gpg --fingerprint 56DD07F4E89478108AC8F9BA8E29C0A8270D3619
gpg --fingerprint "myname <myname@gmail.com>"

出力はすべて同じです。

pub   rsa3072 2020-02-12 [SC] [expires: 2022-02-11]
      6B99 11CA 3B1A 3357 D7C1  8FC0 9FD0 2D27 A10C E40A
uid           [ultimate] myname <myname@gmail.com>
sub   rsa3072 2020-02-12 [E] [expires: 2022-02-11]

公開鍵をインターネットに公開

ファイルをやり取りする相手に、何らかの方法で自分の公開鍵を渡す必要があります。ただし、PGP の枠組みにおいて SSL/TLS の認証局に相当するものは存在していないため、第三者に自分の公開鍵を署名してもらう必要はありません。利便性のため公開鍵を共有するための Web サービスがいくつか存在します。よく利用されるものの一つが keyserver.ubuntu.com です。

以下のコマンドでアップロードできます。

gpg --keyserver keyserver.ubuntu.com --send-key 6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A

しばらくすると公開されます

Uploaded Image

別の PC で公開鍵をダウンロードするためには以下のようにします。

gpg --keyserver keyserver.ubuntu.com --recv-keys 6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A

gpg: directory '/root/.gnupg' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 9FD02D27A10CE40A: public key "myname <myname@gmail.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

公開鍵は pub と sub の両方がダウンロードされています。

root@6eb0420fdcfb:/# gpg --list-keys --with-subkey-fingerprints
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2020-02-12 [SC] [expires: 2022-02-11]
      6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A
uid           [ unknown] myname <myname@gmail.com>
sub   rsa3072 2020-02-12 [E] [expires: 2022-02-11]
      56DD07F4E89478108AC8F9BA8E29C0A8270D3619

秘密鍵は keyserver にアップロードされておらず、ダウンロードもされていません。

root@6eb0420fdcfb:/# gpg --list-secret-keys
root@6eb0420fdcfb:/#

鍵のファイル出力

公開鍵と秘密鍵はファイル出力して共有することもできます。秘密鍵をバックアップして別の PC に保存する際にも利用します。-a で ascii 出力できます。

公開鍵 (subkey を含む)

gpg -a --export 6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A > pub.txt
gpg --import pub.txt

秘密鍵と公開鍵 (subkey を含む)

gpg -a --export-secret-key 6B9911CA3B1A3357D7C18FC09FD02D27A10CE40A > sec.txt
gpg --import sec.txt

暗号化、復号

通信相手の公開鍵を import しておき、それを用いて暗号化します。今回は簡単のため、受信する uid に自分を指定しています。

echo hello > hello.txt
gpg --recipient myname@gmail.com --encrypt hello.txt

受信したユーザは自分の秘密鍵で復号します。

gpg --decrypt hello.txt.gpg

gpg: encrypted with 3072-bit RSA key, ID 8E29C0A8270D3619, created 2020-02-12
      "myname <myname@gmail.com>"
hello

実際には更に送信者の秘密鍵で署名し、受信したユーザは送信者の公開鍵で署名を検証します。

関連ページ