gpg で公開鍵を作ろう & gpg を使おう！！

# たのむからPGPの公開鍵をクレ！！
最近、MinIOのクレデンシャルをユーザに提供するため「PGPの公開鍵で暗号化して送りつける」ってことを実現してみたのでPGPの鍵を社内で送って欲しいのですが、みんな忙しいか鍵の作り方をわからないのか送ってくれない。だから作り方教えてあげるから、頼むからPGPの鍵をオクレ。
･･･と思ったので作り方を書いてみようと思います。

## PGPの公開鍵はgpgで作りましょう
さっそくgpgの使い方を･･･端折りながら書きます。gpgは普通Linuxに入っているとは思いますが、無ければ入れておいてください。

### 鍵を作る

鍵を作ります。鍵の作成は`gpg --full-generate-key --expert`で実施します。
```bash
$ gpg --full-generate-key --expert
gpg (GnuPG) 2.2.27; Copyright (C) 2021 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 '/home/evakichi/.gnupg' created
gpg: keybox '/home/evakichi/.gnupg/pubring.kbx' created
```

鍵は暗号化にも署名にもED25519を使うので`(9)`番を押します。
```bash
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
  (14) Existing key from card
Your selection? 9
```
で、25519を使いたいので`(1)`を選択します。
```bash
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
```

今回はExpireをしないと言うことで`0`を選択します。
```bash
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) 0
Key does not expire at all
```

これでOKならば`y`を押します。
```bash
Is this correct? (y/N) y

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

あとは、実名とメールアドレス、コメントを書いてOKなら`O`(オー)を押します。
```bash
Real name: Makoto ISHIHARA
Email address: evakichi@example.com
Comment: evakichism
You selected this USER-ID:
    "Makoto ISHIHARA (evakichism) <evakichi@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
```
そうすると、パスフレーズを入力します。

パスフレーズを入れます。パスフレーズはこんなものです。

https://qiita.com/evakichi/items/e5663f223da39602546c


```bash
            ┌──────────────────────────────────────────────────────┐
            │ Please enter the passphrase to                       │
            │ protect your new key                                 │
            │                                                      │
            │ Passphrase: ________________________________________ │
            │                                                      │
            │       <OK>                              <Cancel>     │
            └──────────────────────────────────────────────────────┘
```

2回入力するとめでたく鍵ができます。

```bash
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.
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: /home/evakichi/.gnupg/trustdb.gpg: trustdb created
gpg: key B97EBC352A9E65D7 marked as ultimately trusted
gpg: directory '/home/evakichi/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/evakichi/.gnupg/openpgp-revocs.d/7E8ED5D12344A20BBC2DDE23B97EBC352A9E65D7.rev'
public and secret key created and signed.

pub   ed25519 2024-09-30 [SC]
      7E8ED5D12344A20BBC2DDE23B97EBC352A9E65D7
uid                      Makoto ISHIHARA (evakichism) <evakichi@example.com>
sub   cv25519 2024-09-30 [E]
```
この
```bash
pub   ed25519 2024-09-30 [SC]
      7E8ED5D12344A20BBC2DDE23B97EBC352A9E65D7
```
の `7E8ED5D12344A20BBC2DDE23B97EBC352A9E65D7` は大事なユーザID(フィンガープリント)と呼ばれるものです。

### 鍵を人に渡す
自分の作った鍵は`--export`でファイル化したものを渡せばOKです。`-a`はアスキー(文字列)で出力`-o ファイル名`でファイルを書き出します。

```bash
$ gpg --export -a -o evakichi.key.asc 7E8ED5D12344A20BBC2DDE23B97EBC352A9E65D7
$ ls
evakichi.key.asc 
```
このファイルを送ればOKです。

### 鍵を人からもらう

鍵を人からもらったら自分の鍵束に入れましょう入れ方は　`--import`でOKです。
```bash
$ gpg --import evakichi.key.asc
gpg: key XXXXXXXXXXXXXXXX: public key "Makoto ISHIHARA (evakichi) <evakichi@xxxxxxxxxx.xxx>" imported
gpg: Total number processed: 1
gpg:               imported: 1
```

### 鍵を信頼しよう
鍵は登録したままでは不十分です。信頼するために鍵をEditします。
```bash
$ gpg --edit-key YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
gpg (GnuPG) 2.2.27; Copyright (C) 2021 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.


pub  rsa3072/XXXXXXXXXXXXXXXX
     created: 2024-06-07  expires: never       usage: SC
     trust: unknown       validity: unknown
sub  rsa3072/XXXXXXXXXXXXXXXX
     created: 2024-06-07  expires: never       usage: E
[ unknown] (1). Makoto ISHIHARA (evakichi) <evakichi@xxxxxxxxxx.xxx>

```
この`YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY`は先ほど重要と申し上げたユーザID(フィンガープリント)です。

早速`trust`コマンドを使って信用度を上げたり下げたりします。

```bash
gpg> trust
pub  rsa3072/XXXXXXXXXXXXXXXX
     created: 2024-06-07  expires: never       usage: SC
     trust: unknown       validity: unknown
sub  rsa3072/XXXXXXXXXXXXXXXX
     created: 2024-06-07  expires: never       usage: E
[ unknown] (1). Makoto ISHIHARA (evakichi) <evakichi@xxxxxxxxxx.xxx>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu
```

その人の情報が信用に足るのか、パスポートなどを見せてもらって、フィンガープリントをチェックしてください。と書いてあります。信用に足る場合は`5`を押しましょう。

```bash
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

pub  rsa3072/XXXXXXXXXXXXXXXX
     created: 2024-06-07  expires: never       usage: SC
     trust: unknown       validity: unknown
sub  rsa3072/XXXXXXXXXXXXXXXX
     created: 2024-06-07  expires: never       usage: E
[ unknown] (1). Makoto ISHIHARA (evakichi) <evakichi@xxxxxxxxxx.xxx>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg>quit
```
`quit`を入力して終了です。

### 暗号化&署名
いよいよデータの暗号化をします。暗号化は`-e`オプションです。出力がわかりやすいように`-a` 署名(本当に私が書いた暗号文かを示すための方法)をする為に`-s`を設定します。`-r ユーザID`でユーザIDさんに向けてのデータの暗号化と言うことを示します。こんな風に
```bash
$ echo 'test' > test.txt
$ gpg -e -s -r 7E8ED5D12344A20BBC2DDE23B97EBC352A9E65D7 -a test.txt
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
```
パスフレーズの入力を指示されますのであなたの鍵(秘密鍵)のパスフレーズを入力します。
そうするとtest.txtの暗号化された文(test.txt.asc)がテキスト文字列で出力されます。こんな感じ。
```
$ cat test.txt.asc
-----BEGIN PGP MESSAGE-----

hF4D9Wh9A21IDGQSAQdALr30fuF1zsSpi7IpnlhCLyL3s3nr4yW24WtHlNbQ3VIw
fFhf3ZdUbn/vuXzxJSx0PKnuA0Us+yBRlz2OE9iPLnfLiETUTNnxegI20PKb7dyk
0sADAdjofjBnrB0vzHvWr+FZCZfe4R40F8yxTbX/D+osZ29i2iZmrpcjAcn6Xvj9
1F976+C9Vqzs6FbEW+MI+SIPVVBFi9bQ9ypC/oiYB2DBAO62v1l0MAWuRLONixWn
xHRrJN1BqeWe91/RjLZxDnJuhb9mPhwbq3j/bBfJvTtKlUT+HSdxouChIE2CXYIr
RRs/Ymr345bwPC2xjBkwHt7wIPyUffbn7QqPqVTykbRV4E8+zxARJpouP4L2X1gl
P2g84bvo
=s+PI
-----END PGP MESSAGE-----
```
これを相手に送れば良いのです。

### 復号&検証
復号と署名の検証は`-d`オプションで行います。しかし、`-d`オプションはデフォルトなので何もオプションは要りません。

```
$ gpg -o test.txt test.txt.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
gpg: encrypted with 255-bit ECDH key, ID F5687D036D480C64, created 2024-09-30
      "Makoto ISHIHARA (evakichism) <evakichi@example.com>"
gpg: Signature made Mon Sep 30 21:39:22 2024 JST
gpg:                using EDDSA key 7E8ED5D12344A20BBC2DDE23B97EBC352A9E65D7
gpg: Good signature from "Makoto ISHIHARA (evakichism) <evakichi@example.com>" [ultimate]
```
復号には自分の秘密鍵、署名の検証には相手の公開鍵を使います。パスフレーズを聞かれると思いますのできちんと入力してください。

するとめでたく。
```bash
$ cat test.txt
test
```
と出ます。こうなればOKです。

## おわりに
PGPは昔、パスワードマネージャが無い時代にはその代わりも果たしていました、今はあまり使われていないけどそれでも利用価値はあると思いますので是非使ってみてください。