GPG でファイルを暗号化, 復号化, 署名, 検証する方法


GPG でファイルを暗号化して復号化する方法, 署名して検証する方法, もしくは暗号化と署名を一緒にして復号化と検証を一緒にする方法を説明します.

暗号化はある情報を自身を含む特定の人もしくは人たちにしか見れないようにし, 復号化は暗号化された情報を解読し, 署名は情報が不正に改変されていないということ及び情報の差出人を証明するため, 検証は署名された情報が確かに改変されていないということ及び情報の差出人は誰なのかを確認するために使われます.

今回は GPG の公開鍵と秘密鍵の鍵ペアが必要になるのでまだ生成されていなくて, どのように生成したらいいかお知りになりたい方は “新しい GPG 鍵ペアを生成する手順” を参考にしていただければと思います.

暗号化と検証は公開鍵が必要になり, 自身の公開鍵を使う場合はあらかじめ自分自身によって署名されているので問題ないのですが, 他人の公開鍵を使う場合, あらかじめ本人のものであると保証できる公開鍵をインポートして署名しなくてはいけませんので, どのようにすればいいのかお知りになりたい方は “GPG で公開鍵を他者と交換して署名する手順” を参考にしていただければと思います.

説明で使用する GPG のバージョンは 2.2.6 なります.

暗号化

ファイルを暗号化する場合, そのファイルの受取人の公開鍵を使って暗号化し, その受取人しか復号化することができないようにします.

受取人は他者に加えて, 自身も指定することができます.

暗号化する場合, --encrypt or -e に暗号化する対象のファイルを指定し, --recipient or -r に受取人の公開鍵を指定する情報 (メールアドレスなど) を指定します.

自分しか復号化できないように暗号化する場合, --recipient には自身の公開鍵を指定する情報を指定します.

gpg --encrypt --recipient your_name@example.com file

反対に特定の人しか復号化できないように暗号化する場合, --recipient にはその人の公開鍵を指定する情報を指定します. その場合いくら暗号化したのが自分だとしてもその人しか復号化することができなくなりますので注意が必要であるのと同時に GPG の公開鍵暗号の堅牢さを証明するものでもあります.

gpg --encrypt --recipient their_name@example.com file

もし自分も相手も復号化できるように暗号化する場合, 2 つの --recipient オプションにそれぞれ自分と相手の公開鍵を指定する情報を指定します.

gpg --encrypt --recipient your_name@example.com --recipient their_name@example.com file

暗号化が完了すると file.gpg というバイナリー形式で暗号化されたファイルが生成されます.

--armor or -a オプションを付け加えると file.asc という ASCII 形式で暗号化されたファイルが生成されます.

gpg --encrypt --armor --recipient recipient@example.com file

--output or -o オプションを付け加えると, 暗号化されて生成されるファイル名を任意のものに指定することできます.

gpg --output renamed_file.gpg --encrypt --recipient recipient@example.com file

復号化

暗号化されたファイルを復号化する場合, 暗号化に使われた公開鍵と対の秘密鍵を持っている受取人しか復号化することができません.

復号化する場合, gpg コマンドの第一引数に暗号化されたファイルを指定します. 復号化が完了すると .gpg もしくは .asc 拡張子が除かれて復号化された暗号化される前の file が生成されます.

バイナリー形式の場合

gpg file.gpg

ASCII 形式の場合

gpg file.asc

もし暗号化される前の元のファイルが暗号化されたファイルと一緒のディレクトリに存在している状態で上記コマンドを使って復号化を試みた場合, その暗号化される前のファイルを上書きするかどうか y or n で聞かれます.

少し冗長になる復号化するもう一つのコマンドとして --decrypt or -d を使うこともできます. ただそのコマンドを使って復号化する場合, --output オプションに復号化されて生成されるファイル名を指定しなくてはいけません. --output オプションを指定しないと復号化されたファイルの内容が STDOUT に流れてターミナルに出力結果として表示されます.

バイナリー形式の場合

gpg --output file --decrypt file.gpg

ASCII 形式の場合

gpg --output file --decrypt file.asc

署名

署名は自身の秘密鍵を使って, ファイルに対して差出人は自身であること, 不正に改変されていないことを証明する情報をファイル自体に付加したり, もしくはファイルとは別に切り離して作成します.

署名する方法は --sign, --clearsign, --detach-sign の三種類のコマンドがあります.

--sign or -s で署名すると, 署名対象のファイルは署名される前に圧縮されます. そしてバイナリー形式の file.gpg というファイルが生成されます.

gpg --sign file

--armor オプションを付加して ASCII 形式の file.asc という署名されたファイルを生成することもできます.

gpg --sign --armor file

--clearsign で署名すると, 署名対象のファイルは --sign と違い圧縮されずに署名されます. そして file.asc という ASCII 形式のファイルが生成されます. なので署名されてもファイルの内容を確認することができるのでインターネットの掲示板に投稿するときなどに使われます.

gpg --clearsign file

--detach-sign or -b で署名する場合, 署名情報は署名対象のファイルに取り込まれず別々に切り離されて file.sig と言うファイルが生成されます. プログラミングのソースコードなどファイル内容を保持したまま署名したい場合に使われます.

gpg --detach-sign file

--armor オプションを付加して ASCII 形式の file.asc という署名情報を生成することもできます.

gpg --detach-sign --armor file

検証

検証とは署名に使われた秘密鍵と対になっている公開鍵を使って, 署名されたファイルの差出人が確かに本人であること, ファイルの内容が不正に改変されていないことを確かめる行為です.

署名の検証は --verify コマンドで行えます.

--verify コマンドで署名が正しいと判別された場合, 出力結果に Good signature と表示され, 署名が正しくないと判別された場合 BAD signature と表示されます.

--sign で署名されたファイルを検証する場合, 次のようになります.

gpg --verify file.gpg

--clearsign で署名されたファイルを検証する場合, 次のようになります.

gpg --verify file.asc

--detach-sign で署名されたファイルを検証する場合, 第一引数に署名情報の file.sig を指定し, 第二引数以降に署名に使われたファイルを指定します.

gpg --verify file.sig file

署名された filefile.sig と同じディレクトリにある場合, file の指定を省略できます.

gpg --verify file.sig

このように署名されたファイルを検証する場合 --verify コマンドで行うことができますが, --verify コマンドはあくまで検証のみです.

署名を検証してかつ署名される前の元のメッセージを復元する場合, 復号化の時のように gpg コマンドの第一引数にそのファイルを指定します. 同じように --decrypt コマンドを使うこともできます. 完了すると .gpg もしくは .asc 拡張子が取り除かれた file が生成されます.

なので --sign もしくは --clearsign で署名されたファイルが対象になります. --detach-sign で署名された場合, 署名情報が署名対象のファイルと切り離されて生成されるので gpg--decrypt コマンドを使う必要がありません.

--sign で署名された場合

gpg file.gpg

もしくは

gpg --output file --decrypt file.gpg

--clearsign で署名された場合

gpg file.asc

もしくは

gpg --output file --decrypt file.asc

暗号化と署名, 復号化と検証

暗号化と署名は同時に行うことができます.

誰かがファイルをあなた宛に暗号化した場合, 確かにその暗号化されたファイルはあなたしか復号化できないですが, 特定の誰かではなく, あなたの公開鍵を所持している人であれば誰でもあなたに暗号化したファイルを何らかの媒体を通じて送ることができます.

あなたが受け取った暗号化されたファイルの差出人があなたの知り合いであればいいですが, あなたの知り合いになりすました人物と言う可能性もあります.

なのでファイルを相手と安全にやり取りする場合, 暗号化に加えて署名をする必要があります.

暗号化に加えて署名されたバイナリー形式のファイル file.gpg を生成する場合, 次のようになります.

gpg --encrypt --sign --recipient your_name@example.com file

暗号化に加えて署名された ASCII 形式のファイル file.asc を生成する場合, 次のようになります.

gpg --encrypt --sign --armor --recipient your_name@example.com file

暗号化に加えて署名されたファイルの復号化と検証を同時に行う場合, 復号化の時と同じように gpg の第一引数に対象のファイルを指定します. 同じように --decrypt も使えます. 完了すると同じように .gpg もしくは .asc 拡張子が取り除かれた file が生成されます.

バイナリー形式の場合

gpg file.gpg

もしくは

gpg --output file --decrypt file.gpg

ASCII 形式の場合

gpg file.asc

もしくは

gpg --output file --decrypt file.asc

まとめ

暗号化には公開鍵が使われ, 復号化には秘密鍵が使われます.

署名には秘密鍵が使われ, 検証には公開鍵が使われます.

自身の公開鍵を使って暗号化, 検証する場合, 自身の公開鍵は自身の署名があらかじめされているので問題ないですが, 他人の公開鍵を使って暗号化, 検証する場合, その公開鍵が確かに本人のものであると保証できて署名されていなくてはいけません.

署名は署名でも鍵に対する署名とファイルに対する署名の二種類の署名があり, ややこしいので注意が必要です.

暗号化と復号化, 署名と検証は GPG の根幹をなす操作であり, 知っていると機密情報を意図しない人物に見られるのを防ぎ, 意図する人物との間で安全にやり取りすることができるようになります.

相手とやり取りする情報は機密情報に限らず, どんな情報でも暗号化と署名をした上でやり取りをすると, 攻撃者にとってはどの情報が重要な情報なのかわからなくなり, 存在するかしないかわからない機密情報を手に入れるために全てのやり取りに対して復号化を試みなくてはいけなくなり大変な労力になるので有効です.

GPG は相手と安全に情報をやり取りすると言う用途に加えて, 相手とやり取りする意図のない自身の機密情報を暗号化して, 必要な時に復号化すると言う用途としても使えます.

情報セキュリティーの重要性はこれから増えていくと思いますので, 情報セキュリティー上の脅威に対抗するための一つの手段として GPG による情報の暗号化, 署名は有効です.