光のエンジニア雑食記

光も闇も、あるんだよ

GnuPGことはじめ

mac の環境構築のついでに、gpg について改めて機能を触ってみた。

git commit の署名や、 ssh 公開鍵認証の鍵作成などを行うための構築備忘録的な面もあります。

最終的にこんな感じの gpg 鍵構成を作る流れ。Certify 機能を持つ primary key は無期限、Encryption, Sign 機能を持つ sub key は 2y, Authenticate 機能を持つ sub key は 7m の有効期限で設定を行っていく。

$ gpg --list-keys shizurin23@example.com
pub   ed25519 2020-01-28 [C]
      BCE777404F713FA952E815E480DADDFCEB0686F9
uid           [ultimate] Rin Shizuka <shizurin23@example.com>
sub   nistp521 2020-01-28 [A] [expires: 2022-01-27]
sub   ed25519 2020-01-28 [S] [expires: 2022-01-27]
sub   cv25519 2020-01-28 [E] [expires: 2022-01-27]

install

brew cask install gpg-suite
brew install gnupg pinentry-mac
brew link --overwrite gnupg

初期設定を行う。

# gpg鍵でsshするためのagentを有効にする
echo "use-agent" >> ~/.gnupg/gpg.conf
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf

bashrc や zshrc に、以下を追加

gpgconf --launch gpg-agent
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

gpg-agent の再起動を行う

gpgconf --kill gpg-agent
gpgconf --launch gpg-agent

すべての親となる primary key を作成する

primary key を作成する。 --expert をいれることで ECC が選択可能になる。

primary key の passphrase はよしなに設定しておく。

$ gpg --expert --full-gen-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

gpg: directory '/root/.gnupg' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
   (9) ECC and ECC
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (13) Existing key
Your selection? 11

Possible actions for a ECDSA/EdDSA key: Sign Certify Authenticate
Current allowed actions: Sign Certify

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? s

Possible actions for a ECDSA/EdDSA key: Sign Certify Authenticate
Current allowed actions: Certify

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? q
Please select which elliptic curve you want:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
Your selection? 1
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) o
invalid value
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Rin Shizuka
Email address: shizurin23@example.com
Comment:
You selected this USER-ID:
    "Rin Shizuka <shizurin23@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key BBCD12A8D98F6026 marked as ultimately trusted
gpg: directory '/root/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/BCE777404F713FA952E815E480DADDFCEB0686F9.rev'
public and secret key created and signed.

pub   ed25519 2020-01-28 [C]
      BCE777404F713FA952E815E480DADDFCEB0686F9
uid                      Rin Shizuka <shizurin23@example.com>

鍵が生成されていることを確認する

$ gpg --list-keys shizurin23@example.com
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   ed25519 2020-01-28 [C]
      BCE777404F713FA952E815E480DADDFCEB0686F9
uid           [ultimate] Rin Shizuka <shizurin23@example.com>

これで primary key の作成が完了。

Ahthenticate 機能を持った sub key を作成し、 sshで公開鍵認証を行う

ssh に使う鍵ペアは、 Authenticate 機能をもたせた sub key を作成することで可能。

「ecdsa-nistp-521 Authenticate の役割をもたせた鍵」を作成する。

  1. key edit モードにはいる
$ gpg --expert --edit-key BCE777404F713FA952E815E480DADDFCEB0686F9
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

Secret key is available.

sec  ed25519/80DADDFCEB0686F9
     created: 2020-01-28  expires: never       usage: C
     trust: ultimate      validity: ultimate
[ultimate] (1). Rin Shizuka <shizurin23@example.com>
  1. 作成する鍵の選択
gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 11
  1. ECDSA/EdDSA は Sign , Authenticate 機能が利用できる。 今回は ssh 認証に使いたいので、 Authenticate のみにする。
Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Sign

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? a

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Sign Authenticate

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? s

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Authenticate

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? q
  1. 鍵の形式を指定する
Please select which elliptic curve you want:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
Your selection? 5
  1. sub key の有効期限を設定する
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 2y
Key expires at Thu Jan 27 18:33:38 2022 UTC
Is this correct? (y/N) y
  1. これまでの設定が問題なければ作成を実行する
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec  ed25519/80DADDFCEB0686F9
     created: 2020-01-28  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  nistp521/4BC1F64437BE6BD5
     created: 2020-01-28  expires: 2022-01-27  usage: A
[ultimate] (1). Rin Shizuka <shizurin23@example.com>
  1. gpg モードを quit し、変更を保存する。
gpg> q
Save changes? (y/N) y

次に、 gpg の ssh-agent に、作成した Authenticate sub key を登録する。

登録には、Authenticate 鍵の keygrip が必要になるので確認する。

$ gpg --list-keys --with-keygrip shizurin23@example.com
pub   ed25519 2020-01-28 [C]
      BCE777404F713FA952E815E480DADDFCEB0686F9
      Keygrip = 276B3448CCAE96B33922DB5B75A7C2B92FFF2C83
uid           [ultimate] Rin Shizuka <shizurin23@example.com>
sub   nistp521 2020-01-28 [A] [expires: 2022-01-27]
      Keygrip = 947448229941BD2B46B5005DCA053516DE29A9C5

上記例だと、 [A] となっている鍵の keygrip AE16965BACE315E2C6676DDAEB77C2010688317C が対象。

これを、 ~/.gnupg/sshcontrol に追加する。複数鍵を登録する場合は改行で1行づつ。

echo 947448229941BD2B46B5005DCA053516DE29A9C5 >> ~/.gnupg/sshcontrol

SSH_AUTH_SOCK 先を gpg の sock に向ける

export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

ssh-add -L にて公開鍵が表示されれば OK となる。 github などにはここで表示される鍵を登録する。

$ ssh-add -L
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYT<snip> (none)

これで作業は完了。

Sign 機能を持った sub key を作成し、署名、検証を行う

gpg はファイルに対して署名を行うことができる。そのためには、 Sign 機能を持った key を作成する必要がある。

edit モードにはいる

$ gpg --expert --edit-key BCE777404F713FA952E815E480DADDFCEB0686F9
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

Secret key is available.

sec  ed25519/80DADDFCEB0686F9
     created: 2020-01-28  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  nistp521/4BC1F64437BE6BD5
     created: 2020-01-28  expires: 2022-01-27  usage: A
[ultimate] (1). Rin Shizuka <shizurin23@example.com>

今回は、 ed25519 で Sign 機能を持った sub key を作成する。

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 10
Please select which elliptic curve you want:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
Your selection? 1
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 2y
Key expires at Thu Jan 27 18:45:54 2022 UTC
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec  ed25519/80DADDFCEB0686F9
     created: 2020-01-28  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  nistp521/4BC1F64437BE6BD5
     created: 2020-01-28  expires: 2022-01-27  usage: A
ssb  ed25519/D7798612E7AD96C2
     created: 2020-01-28  expires: 2022-01-27  usage: S
[ultimate] (1). Rin Shizuka <shizurin23@example.com>

gpg> q
Save changes? (y/N) y

署名を行ってみる

署名するには、 --sign , —clearsign, --detach-sign の 3 種類のコマンドを用いる事ができる。

  • --sign は、 file.gpg というバイナリ形式のファイルを出力する。
    • —armor(-a) を付加すると、 file.asc として ASCII 形式で出力される。後述する —clearsign で出力される内容とは違い、ファイル内容は圧縮されているため閲覧できない。
  • --clearsign は、 file.asc という ASCII 形式のファイルを出力する。ファイルの中身は圧縮されないのでそのまま閲覧が可能。
  • --detach-sign(-b) は、 元ファイルとは別に、file.sig という署名情報のみが格納されたファイルを出力する。ファイルの中身を維持したまま署名したい場合はこちら。

—sign で署名する

$ date |tee sign-test.txt
Tue Jan 28 18:46:50 UTC 2020
$ gpg --sign sign-test.txt
$ ls sign-test*
sign-test.txt  sign-test.txt.gpg
$ file sign-test.txt.gpg
sign-test.txt.gpg: data

ASCII 形式で --sign で署名する

$ gpg -a --sign sign-test.txt
$ cat sign-test.txt.asc
-----BEGIN PGP MESSAGE-----

owGbwMvMwCF2vbJN6PnaaYcY1xgk8RZnpufplqQWl+iVVJTEGTRuCylNVfBKzFMw
slAwtLAyMbMyNVAIDXFWMDIwMuDqKGVhEONgkBVTZNE/HdTDtoHRZYKMjgnMRFYm
kAkMXJwCMJHWZYwM/wK2JTbt4+decmDtce6dGzpZXt96OKFVLOdz/4eEbtnb6xkZ
FnqcWJs8+b7V+XncfqVC/tyPriXFXKmdt0ijzWvj95+RbAA=
=V3mK
-----END PGP MESSAGE-----

--clearsign で署名する

$ gpg --clearsign sign-test.txt
File 'sign-test.txt.asc' exists. Overwrite? (y/N) y
$  cat sign-test.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Tue Jan 28 18:46:50 UTC 2020
-----BEGIN PGP SIGNATURE-----

iHUEARYIAB0WIQQvy1KMBrABRJAcLDTXeYYS562WwgUCXjCBxwAKCRDXeYYS562W
wl9yAQDTgsNAJeYwcz+ic/q27nV10cy/Fc60Tkj6lSt9Q/7YWgD/cHfrb/sxHtks
wusK0q34tRdSP6opeELce392h6Dytw8=
=EMcs
-----END PGP SIGNATURE-----

--detach-sign で署名する

$ gpg --detach-sign sign-test.txt
$ ls sign-test*
sign-test.txt  sign-test.txt.asc  sign-test.txt.gpg  sign-test.txt.sig
$ file  sign-test.txt.sig
sign-test.txt.sig: data

署名されたファイルを検証する

検証をするには、 --verify コマンドを用いる。

署名では様々な形式でファイル出力が行えたが、 検証はどの形式のファイルでも上記コマンドで行える。

$ gpg --verify sign-test.txt.gpg
gpg: Signature made Tue Jan 28 18:46:57 2020 UTC
gpg:                using EDDSA key 2FCB528C06B00144901C2C34D7798612E7AD96C2
gpg: Good signature from "Rin Shizuka <shizurin23@example.com>" [ultimate]
$ gpg --verify sign-test.txt.asc
gpg: Signature made Tue Jan 28 18:47:35 2020 UTC
gpg:                using EDDSA key 2FCB528C06B00144901C2C34D7798612E7AD96C2
gpg: Good signature from "Rin Shizuka <shizurin23@example.com>" [ultimate]
gpg: WARNING: not a detached signature; file 'sign-test.txt' was NOT verified!
$  gpg --verify sign-test.txt.sig
gpg: assuming signed data in 'sign-test.txt'
gpg: Signature made Tue Jan 28 18:47:50 2020 UTC
gpg:                using EDDSA key 2FCB528C06B00144901C2C34D7798612E7AD96C2
gpg: Good signature from "Rin Shizuka <shizurin23@example.com>" [ultimate]

git commit に 署名する

上記セクションで行った署名は、git 側で sign の設定を行えば、 git commit でも行える。

署名に使う subkey の primary key の id を取得する。

$ gpg --list-keys shizurin23@example.com
pub   ed25519 2020-01-28 [C]
      BCE777404F713FA952E815E480DADDFCEB0686F9
uid           [ultimate] Rin Shizuka <shizurin23@example.com>
sub   nistp521 2020-01-28 [A] [expires: 2022-01-27]
sub   ed25519 2020-01-28 [S] [expires: 2022-01-27]

上記例では BCE777404F713FA952E815E480DADDFCEB0686F9 を設定する。

テスト用に、以下のように、git config の設定をしておく。

git init
git config --local --add user.name "Rin Shizuka"
git config --local --add user.email "shizurin23@example.com"
git config --local --add gpg.program gpg
git config --local --add commit.gpgsign true
git config --local --add user.signingkey BCE777404F713FA952E815E480DADDFCEB0686F9
echo "hello GPG" > README.md
git add README.md
git commit -S -m "Add README.md"

git commit 時に、passphrase が求められるので入力して、問題なければコミットが完了する。

$ git log --show-signature
commit d717c5508c21213bed10a89d0775e35f3e5a71b4 (HEAD -> master)
gpg: Signature made Tue Jan 28 18:51:33 2020 UTC
gpg:                using EDDSA key 2FCB528C06B00144901C2C34D7798612E7AD96C2
gpg: Good signature from "Rin Shizuka <shizurin23@example.com>" [ultimate]
Author: Rin Shizuka <shizurin23@example.com>
Date:   Tue Jan 28 18:51:33 2020 +0000

    Add README.md

GitHub 上に、 作成した GPG Public key を登録する

gpg の Public key は primary key, sub key まとめて一つの Public key となる。

鍵構成を保持するため、鍵が更新されたら Public key の更新が必要になる。

$ gpg --export --armor shizurin23@example.com
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEXjCA1BYJKwYBBAHaRw8BAQdAhthaF6aNT+C4lFx7cyTwL7Qh8JQpE0m8TLie
Eq6ocTm0JFJpbiBTaGl6dWthIDxzaGl6dXJpbjIzQGV4YW1wbGUuY29tPoiQBBMW
CAA4FiEEvOd3QE9xP6lS6BXkgNrd/OsGhvkFAl4wgNQCGwEFCwkIBwIGFQoJCAsC
BBYCAwECHgECF4AACgkQgNrd/OsGhvnp3AD8CKvlA4RbIHrGnwsgn5h0kZO6Ph9C
f/bq/D2EdX42gJkBAI+1Cv9LYZC5sYaB16ttWr7a6ovlIMw1s8s/SXXbgD8PuJME
XjCBEhMFK4EEACMEIwQAlE7aRKgHzVcLM4sNgAeOBHd4tCGfguQspXVzWz21K0W6
FLdEuA4oXo2VoQ8j1d447uIJi6UhDH9UJt5m3/eDfbsAfP0NxWw7V7LNpnoIqiIM
KBQLMJS0iJ5EcpNLqkSLz+mDV/f0sgcY4wqulsE88+uc81bBYyfDyLdsTvgfxaU5
1A+IfgQYFggAJhYhBLznd0BPcT+pUugV5IDa3fzrBob5BQJeMIESAhsgBQkDwmcA
AAoJEIDa3fzrBob5vAYA/2KvjRA3QON0KPUs/2xrAfzvlvX+QTswVUams2Mpu7L7
AQC60bUeIrQP+UoYKdJCq1iYSkaysje8K4Bt5+GY6RAiCLgzBF4wgV0WCSsGAQQB
2kcPAQEHQJe6w55CGzx+LYvt5lr5QQsEdXj3xyM1jETws5RbYi0aiPUEGBYIACYW
IQS853dAT3E/qVLoFeSA2t386waG+QUCXjCBXQIbAgUJA8JnAACBCRCA2t386waG
+XYgBBkWCAAdFiEEL8tSjAawAUSQHCw013mGEuetlsIFAl4wgV0ACgkQ13mGEuet
lsJFPQEAvUlI73UqCkd2Kp0a8gh72P8cbVHRBZh7XZpAoaYbu44A/1ZW8gI6iVPo
VT961dr1Vx2FFdG3V24wh4msvBdORoAP9KABAME9MkmcNe8D4C+dhu9a9UGcb/oc
ivqmB8UfY//j8Kk8AQDWDpFA3K/ngA01cgHsdTeL+/WPCjk9fw/XWN8/RRmVAg==
=8AGY
-----END PGP PUBLIC KEY BLOCK-----

上記 Public key を GitHub 上に登録する。

https://github.endpoint/settings/keys より登録する。

Encryption 機能を持った sub key を作成し、ファイルの暗号化、復号化を行う

ファイルの暗号化、復号化を行うための sub key を作成する。

(Encryption 機能を持った key が存在しない場合、以下のようなエラーになる。)

$ gpg -e -r shizurin23@example.com README.md
gpg: error retrieving 'shizurin23@example.com' via Local: Unusable public key
gpg: error retrieving 'shizurin23@example.com' via WKD: No data
gpg: shizurin23@example.com: skipped: No data
gpg: README.md: encryption failed: No data

まず edit mode

$ gpg --expert --edit-key BCE777404F713FA952E815E480DADDFCEB0686F9
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

Secret key is available.

sec  ed25519/80DADDFCEB0686F9
     created: 2020-01-28  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  nistp521/4BC1F64437BE6BD5
     created: 2020-01-28  expires: 2022-01-27  usage: A
ssb  ed25519/D7798612E7AD96C2
     created: 2020-01-28  expires: 2022-01-27  usage: S
[ultimate] (1). Rin Shizuka <shizurin23@example.com>

gpg>

今回は、 cv25519、 expire 2y で sub key を作成する。

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 12
Please select which elliptic curve you want:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
Your selection? 1
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 2y
Key expires at Thu Jan 27 18:53:34 2022 UTC
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec  ed25519/80DADDFCEB0686F9
     created: 2020-01-28  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  nistp521/4BC1F64437BE6BD5
     created: 2020-01-28  expires: 2022-01-27  usage: A
ssb  ed25519/D7798612E7AD96C2
     created: 2020-01-28  expires: 2022-01-27  usage: S
ssb  cv25519/2764E6162F7EE1C0
     created: 2020-01-28  expires: 2022-01-27  usage: E
[ultimate] (1). Rin Shizuka <shizurin23@example.com>

gpg> q
Save changes? (y/N) y

作成自体は終了。

暗号化と復号化を試してみる

ここでは、暗号化したファイルのやり取りについては触れず、単純に暗号化、復号化のみに着目する。

暗号化する場合、 gpg —encrypt(-e) で暗号化を行う。 復号化できる相手を指定するのは —recipient(-r) オプションが必要。自分自身を指定すると自分だけが復号化できる。

出力される .gpg ファイルはバイナリとなっている。ASCII 形式で暗号化されたファイルを出力したい場合は、 --armor(-a) を指定する。

以下例は、 自分のみ復号化できる暗号化されたファイルの作成。

ダミーデータを作成し、暗号化を行う。 -a を設定していないので、 バイナリで出力される。

$ date | tee test.txt
Tue Jan 28 18:54:39 UTC 2020
$ gpg -e -r shizurin23@example.com test.txt
$ rm -f test.txt
$ ls test*
test.txt.gpg
$ file test.txt.gpg
test.txt.gpg: data

暗号化されたファイルを復号化する。 復号化は、 gpg コマンドの第一引数に暗号化されたファイルを指定する。問題なく復号化が完了した場合、 .gpg.asc 拡張子が除かれたファイル名で出力される。

$ gpg test.txt.gpg
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
gpg: encrypted with 256-bit ECDH key, ID 2764E6162F7EE1C0, created 2020-01-28
      "Rin Shizuka <shizurin23@example.com>"
$ ls test*
test.txt  test.txt.gpg
$ cat test.txt
Tue Jan 28 18:54:39 UTC 2020

さいごに

git commit の Sign や ssh の Authenticate などで軽く gpg は使っていましたが、「そもそも Sign はどういうことができるのか」「パッケージマネージャー等でどのように署名が使われているのか」など深く知ることができたと思います。 また、Encryption は初めて触りましたが、比較的容易に暗号化・復号化が行えて、よいなーとなりました。