gpg コマンド

対称暗号(共通鍵暗号)方式でファイルの暗号化と復号

暗号化には-c,--symmetricオプションを指定します。そして暗号化したいファイルをパラメーターとして渡します。
暗号化のアルゴリズムはデフォルトでAES128になります。これを変えたい場合は--cipher-algoオプションを使います。

例えば周りに中身を隠したいsecrets.jsonファイルを暗号化するには以下のようなコマンドを実行します。

# cat password
# foo

cat password \
| gpg --passfrase-fd 0 --batch --yes --symmetric --cipher-algo AES256 secrets.json

いくつか追加のオプションが出てきました。

--passfrase-fd 0は、標準入力からパスフレーズを読み込む為のオプションです。passwordファイルにパスフレーズを記載して、そこからcatで標準入力へ渡します。

--passfrase-fd--batchと共に使う必要がありますが、[y/N]と聞かれるようなユーザーの入力待ちの状態にしてしまうとエラーになってしまうので、さらに--yesを追加して全てyesで通します。
[y/N]で聞かれるのは例えば、「ファイルを上書きしますか」などがあります。

ログに残っても大丈夫なら--passphrase $passphraseと直接パスフレーズを指定しても大丈夫です。

これがうまくいくとsecrets.json.pgpというファイルが作られます。

次にsecrets.json.pgpを復号してみます。(長いので 1 オプション毎改行します)

gpg \
  --passphrase="$LARGE_SECRET_PASSPHRASE" \
  --batch \
  --yes \
  --output secrets.json \
  --decrypt \
  secrets.json.gpg

--decryptは「復号」コマンドになります。復号する対象はパラメーターで渡します。--outputは復号した内容を写すファイルを指定できます。これを省略すると内容は標準出力されます。よって以下でも同じ事になります。

gpg \
  --passphrase="$LARGE_SECRET_PASSPHRASE" \
  --batch \
  --yes \
  --quiet \
  --decrypt \
  secrets.json.gpg > secrets.json

--output--quietになりました。デフォルトでは以下のようなログが出る為、リダイレクトで写す為に、それらを出ないようにします。

# gpg: AES256 encrypted data
# gpg: encrypted with 1 passphrase

キーペアを生成

--full-generate-keyオプションを使います。このオプションを指定するとインタラクティブに作成できます。例えば、GitHub アカウントに登録する GPG キーなら、鍵の種類を RSA and RSA、サイズを4096にする必要があります。

正常に作成できたら以下を実行します。

gpg --list-secret-keys --keyid-format LONG
# ...
# sec   rsa4096/CAE49ABA5B7E19AB 2020-04-19 [SC]
# ...

出力結果にsecから始まる行があるので探し、この例であればCAE49ABA5B7E19ABに当たる部分をコピーします。そして「コピーした内容」を次のコマンドに渡します。うまくいけば公開鍵が表示されます。

gpg --armor --export <コピーした内容>
# -----BEGIN PGP PUBLIC KEY BLOCK-----
# ...
# -----END PGP PUBLIC KEY BLOCK-----

キーのエクスポートとインポート

以下で鍵を取り出し、

gpg --export-secret-key -a > secretkey.asc

以下のように取り込みます。

gpg --batch --import secretkey.asc

sshできる別のsshマシンにエクスポートする場合これは一行で書けます。

gpg --export-secret-key -a | ssh $machine gpg --batch --import -