対称暗号(共通鍵暗号)方式でファイルの暗号化と復号
暗号化には-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 -