Back

GPG(GnuPG)による暗号化・復号化

PGPの実装版であるGPGの簡単な使い方をまとめました。

Terraformを用いたIAMユーザー作成でPGPが必要だったため、PGPに関して簡単に使い方をまとめます。

PGP

PGP: Pretty Good Privacyたいへんよいプライバシー

公開鍵暗号方式を使った暗号・署名の仕組みです。SSL/TLSと違い、鍵を利用者の責任で管理します。
メッセージまたはファイルは、セッション鍵と呼ばれる乱数の値を鍵として、対称暗号により暗号化され、そのセッション鍵は受信者の公開鍵で暗号化されます。

PGPによる暗号化/復号化の流れ(Wikidediaより)
PGPによる暗号化/復号化の流れ(Wikidediaより)

PGPが使用できるツールとして以下が挙げられます。

  • GPG (GNU Private Guard)
  • OpenPGP

ここではGPGを使用して試してみます。

GPG

GNU Privacy Guard (GnuPG, GPG) とは、Pretty Good Privacy (PGP) の別実装として、GPLに基づいた暗号化ソフトです。(Wikipedia

Windowsにおいては標準で入っていませんがGit Bashが入っていれば使用できます。今回はGit Bashを使用します。

GPGのコマンドチートシート

操作 Command
生成 gpg --list-keys
一覧 gpg --list-keys
gpg --list-secret-keys
鍵ファイル出力 gpg -o <KEY_FILE> --export <NAME>
gpg -o <KEY_FILE> --export-secret-key <NAME>
鍵削除 gpg --delete-key <NAME>
gpg --delete-secret-key <NAME>
暗号・復号化 gpg -r <NAME> --encrypt
gpg -r <NAME> --decrypt

暗号化・復号化に関して、標準入力からデータを入力し、暗号化されたデータはバイナリ形式になります。

GPGによる暗号・復号化

マスターキーペアの作成

マスターキーを作成します。
今回はkey_nameという名前でキーを作成します。

$ gpg --gen-key

gpg (GnuPG) 2.2.27-unknown; 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.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

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

Real name: key_name
Email address: key_name@sample.com
You selected this USER-ID:
    "key_name <key_name@sample.com>"

Change (N)ame, (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.
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: /c/Users/owner/.gnupg/trustdb.gpg: trustdb created
gpg: key E8A377E6CA4FB2CF marked as ultimately trusted
gpg: directory '/c/Users/owner/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/c/Users/owner/.gnupg/openpgp-revocs.d/A66F1ECEA33996BAAC43D1B2E8A377E6CA4FB2CF.rev'
public and secret key created and signed.

pub   rsa3072 2021-08-25 [SC] [expires: 2023-08-25]
      A66F1ECEA33996BAAC43D1B2E8A377E6CA4FB2CF
uid                      key_name <key_name@sample.com>
sub   rsa3072 2021-08-25 [E] [expires: 2023-08-25]

途中でパスコードの入力を求められますが、ここでは設定しないで進みました。
作成を実行する、キーが生成されます。リストコマンドで確認するとたしかにキーが作られたことを確認できます。

$ gpg --list-keys
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
gpg: next trustdb check due at 2023-08-25
/c/Users/owner/.gnupg/pubring.kbx
--------------------------------
pub   rsa3072 2021-08-25 [SC] [expires: 2023-08-25]
      A66F1ECEA33996BAAC43D1B2E8A377E6CA4FB2CF
uid           [ultimate] key_name <key_name@sample.com>
sub   rsa3072 2021-08-25 [E] [expires: 2023-08-25]

文字列の暗号化

作成したキーを利用して文字列を暗号化してみます。
今回はパイプで値を渡します。暗号化したものはバイナリ形式なのでbase64で文字列に起こします。

$ echo "I'm yuu999" | gpg -r key_name --encrypt | base64 -w0 > test.txt

$ cat test.txt
hQGMAw2tITT1c66FAQv+IYixhS9cCSpp7vPToHF6upSRposWv5CulHYSzXpChmcgkjxnoURYJ6Rx4fv26+KAZ/uozuGsLlmY8lDYYjlCRZ9z7aAbmJRqMlfk6AjpUf6sjJPzB8S7Ac1/0P6Yl+LzggAtYuajxMX8IH2vmlrpBB5LdOb/MZXxKc5RB+nk7ZztywXXOIRN7RLE/DjC5KQD5D+ZtRKuWH4I106U+W1yQqCqBEg4CvIW95R3JvN1/i0a5eJk/vWugWfHwzpX6Sn6Vd7QkebhhKmh3gxFoA9SwqTCJSsgVinapoAMbwF5x4kFvFk+IOqXxxxxxxxxxxxxxxxxxasdsadkfgm/gTPnSW4g9fuWcMYIvUQJ2lUxsbwdxfgWG7CcFenaPyQMpmlcL18sIuhkFr/ZAP35nmHAk9Sxz34A8AyFSYy65c3+wx4tpM71gAWwbCM/RXiko8mgUCw63cQxBOjzv7dYtpQYYrP33wCxWv2+nVzKRqKHM9/NyD99MUBNuyCAPRa0lcB0mylvscEOsjz0niYSCYyoYACDvfIjt4EnhQnq7xq+LXIjGzsA7Xv7g34kF8wj4SYLVROyyZXdDTee+xN77m+cE8PKghcKCwa0NLpYCHqiwRJIkIVcZg=

文字列が暗号化されました。

文字列の復号化

さきほど暗号化したファイルを復号化します。

$ cat test.txt | base64 -d | gpg -r key_name --decrypt
gpg: encrypted with 3072-bit RSA key, ID 0DAD2134F573AE85, created 2021-08-25
      "key_name <key_name@sample.com>"
I'm yuu999

最初に入力した文字列を復元できました。

まとめ

PGPによる暗号化について簡単にまとめ、GPGにて実際に暗号化・復号化を試してみました。
使用方法は整理できたので、Terraformで利用したいと思います。

参考

comments powered by Disqus
yuu999
Built with Hugo
Theme Stack designed by Jimmy