対称暗号(共通鍵暗号)方式でファイルの暗号化と復号
暗号化には-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.ascsshできる別のsshマシンにエクスポートする場合これは一行で書けます。
gpg --export-secret-key -a | ssh $machine gpg --batch --import -