PGP 鍵を用いたファイルの暗号化

PGP 鍵を使うためには、gpg コマンドをインストールする必要があります。
mac ならbrew, CentOS ならyum でインストールできます。

## 鍵の作成

`gpg --gen-key` コマンドでできます。
鍵の種類、有効期限、名前、メールアドレス、パスフレーズ、コメントを入力します。
以下はコメント、パスフレーズなしで作ってます。

```
%  gpg --gen-key                                                                                                                                                                     [~/.gnupg]
gpg (GnuPG) 1.4.20; Copyright (C) 2015 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.


ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
選択は?
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)3y
鍵は土 10/19 18:18:49 2019 PWTで期限切れとなります
これで正しいですか? (y/N) y


あなたの鍵を同定するためにユーザIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザIDを構成します:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"


本名: test test
電子メール・アドレス: test@test.com
コメント:
次のユーザIDを選択しました:
    "test test <test@test.com>"


名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
秘密鍵を保護するためにパスフレーズがいります。


パスフレーズを必要としないようですが、おそらくそれは良くない考えです!
続けますが、パスフレーズを設定することを検討ください。パスフレーズは、
このプログラムの"--edit-key"オプションでいつでも変更できます。


たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。

....+++++
..........+++++
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
..+++++
.........+++++
gpg: 鍵53526BEBを究極的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。


gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   2  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 2u
gpg: 次回の信用データベース検査は、2019-10-19です
pub   2048R/53526BEB 2016-10-19 [有効期限: 2019-10-19]
 フィンガー・プリント = 2BE0 810C 857F 7A90 987E  B200 C050 6108 5352 6BEB
uid                  test test <test@test.com>
sub   2048R/39F4BAD2 2016-10-19 [有効期限: 2019-10-19]

```

乱数生成の際何か言われてますが、実際の操作では読んでるうちに実行が終わり何もできなかったです。

## 鍵のエクスポート

次に、作った鍵をエクスポートします。
`gpg --armor --output <鍵名> --export "<作った鍵の登録者名>"`
で公開鍵、
`gpg --armor --output <鍵名> --export-secret-key "<作った鍵の登録者名>"`
で秘密鍵が作れます。

作った鍵は、`gpg --list-keys` や`gpg --list-secret-keys` コマンドで確認できます。

```
%  gpg --armor --output sample_pub.asc --export "test test"                                                                                                                          [~/.gnupg]
%  gpg --armor --output sample_sec.asc --export_secret-key "test test"

%  gpg --list-keys
pub   2048R/53526BEB 2016-10-19 [有効期限: 2019-10-19]
uid                  test test <test@test.com>
sub   2048R/39F4BAD2 2016-10-19 [有効期限: 2019-10-19]

%  gpg --list-secret-keys
sec   2048R/53526BEB 2016-10-19 [有効期限: 2019-10-19]
uid                  test test <test@test.com>
ssb   2048R/39F4BAD2 2016-10-19
```

できた鍵は、

```
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQENBFgHOpUBCADMfVBMfhmxpAkrEiVrYcHyOJZor7VKo2/h2c+lAIGZyX9GbG4B
ynbifULqYgaaNt4nZuJIHyT38OOCInCB57vUpKkBJOoYO6sqXHIEL6j83kQ4hCih

〜中略〜

z4fp06UQby5KcOARJbDuj3rp8WJ/A1eU7fgPLxXRsa4eGmjtTGxkIhfLvrsip/Z2
i1h2rNK+Ezc1oGRfumB9OJ+PFVx9F7YdF6SvarMWQrJJp0WV
=qQpR
-----END PGP PUBLIC KEY BLOCK-----
```

みたいになってます。


## ファイルの暗号化

上記で作った公開鍵で、ファイルの暗号化を行います。
（以下公開鍵を受け取った側の作業です。）

以下のコマンドでファイルの暗号化を行います。

`gpg --armor -r "<鍵の登録者名>" -e <暗号化したいファイル名>`

鍵に信用性がない場合、使うかどうか尋ねられます。
この状態でも暗号化できますが、`gpg --import` コマンドで鍵のインポートを行ってからやるべきかもしれません。

```
%  gpg --armor -r "test test" -e main.py                                                                                                                                                   [~/pgp]
gpg: 39F4BAD2: この鍵が本当に本人のものである、という兆候が、ありません


pub  2048R/39F4BAD2 2016-10-19 test test <test@test.com>
主鍵フィンガー・プリント: 2BE0 810C 857F 7A90 987E  B200 C050 6108 5352 6BEB
副鍵フィンガー・プリント: 5E0B 6C2F 59EE 16D6 A403  DE15 DF11 046A 39F4 BAD2


この鍵は、このユーザIDをなのる本人のものかどうか確信でき
ません。今から行うことを＊本当に＊理解していない場合には、
次の質問にはnoと答えてください。


それでもこの鍵を使いますか? (y/N) y
```

暗号化したファイルを見ると、

```

-----BEGIN PGP MESSAGE-----
Version: GnuPG v2.0.22 (GNU/Linux)

hQEMA98RBGo59LrSAQf9F8u0BptrkKHIipZi6uPKwh+O/CFB2etq28HmI0hA7Qtn
cJJdN6TKYfWhOoAhoPsB6xHNBddGwJd6AsN+zSdjJOsrs9CodqK+rRydXIicN6KQ
FhAYNzvr1H7g36q1D2evgtBpbubutrmuzJsXbQWFzwCa8IR0atqBywMtOaC/vrQo
UTW4OWLKWiXYMZaTbSf+4wbGggWLbh8VRZV5cNMx0e6e54bgsAxc30+RZFgH+m/B

〜中着〜

jzGwhGa26evaXLMY9yQLa6OdkBuVbzPfps8K/3B+Z/4Td7erKCnmxrUSVUWHxDnW
zI91ZXLi7YlOt9PIb6mRoxVN8aeJ0tqdLxtMFTMF+zfbZs+0L6xH5QpS+XsahVlz
EABkcik=
=7zFN
-----END PGP MESSAGE-----
```

のように、鍵と同じようになっています。


## ファイルの復号

暗号化に用いた公開鍵に対応する秘密鍵を持っている側の作業です。

複合は、`gpg -o <複合後のファイル名> --decrypt <暗号化されたファイル名>`
で行えます。

```
%  gpg -o main.py --decrypt main.py.asc                                                                                                                                              [~/.gnupg]
gpg: 2048-ビットRSA鍵, ID 39F4BAD2, 日付2016-10-19に暗号化されました
      "test test <test@test.com>"
```

これで、元のファイルに戻っています。

以上、使う機会があったので簡単にまとめてみました。