はじめに
この実験では、GPG(GNU Privacy Guard)を使用して、Linux 環境でファイルを暗号化および復号するための必須スキルを習得します。まず、GPG のセキュリティモデルの基盤となる、自分自身の公開鍵と秘密鍵のペア(キーペア)を生成することから始めます。鍵の生成後は、自分宛てにファイルを暗号化し、秘密鍵とパスフレーズを使用してそれを復号するという、コアとなる操作を練習します。
これらの基本を習得した後は、他者と安全に情報を交換する方法を探索します。これには、共有のために自分の公開鍵をエクスポートする方法や、他のユーザーの公開鍵をインポートする方法が含まれます。また、公開鍵の正当性を確認するために署名する方法や、秘密鍵のバックアップ、鍵が漏洩した場合に備えた失効証明書の作成といった、極めて重要な鍵のメンテナンス作業についても学びます。
gpg --gen-key による GPG キーペアの生成
このステップでは、個人の GPG(GNU Privacy Guard)キーペアを生成します。GPG キーペアは、公開鍵と秘密鍵という、互いに関連する 2 つの異なる鍵で構成されます。公開鍵は他人に共有して、自分宛てのファイルを暗号化してもらうために使用します。一方、秘密鍵は厳重に保管しなければなりません。なぜなら、公開鍵で暗号化されたファイルを復号できるのは、対応する秘密鍵だけだからです。
まず、GPG の機能を提供する gnupg パッケージがシステムにインストールされていることを確認しましょう。
sudo apt-get update && sudo apt-get install -y gnupg
これでキーペアを生成する準備が整いました。gpg --gen-key コマンドを実行すると、対話形式で生成プロセスが進みます。
ターミナルで以下のコマンドを実行してください。
gpg --gen-key
このコマンドは簡略化されたキー生成を使用する旨のメッセージが表示されます。より高度なオプションが必要な場合は gpg --full-generate-key を使用できますが、この実験ではデフォルトの設定で十分です。
以下の情報の入力を求められます。
- Real name:
labexと入力します。 - Email address:
labex@example.comと入力します。 - Confirm User ID: 入力内容を確認します。
Change (N)ame, (E)mail, or (O)kay/(Q)uit?と表示されたら、Oを入力してEnterを押します。
システムは自動的に以下の安全なデフォルト設定を使用します。
- 鍵の種類:RSA および RSA (デフォルト)
- 鍵のサイズ:3072 ビット (安全なデフォルト)
- 有効期限:2 年間 (セキュリティのための自動期限切れ)
注意: 以前のバージョンとは異なり、最新の GPG では --gen-key を使用した際にパスフレーズの入力を求められない場合があります。セキュリティを強化するために鍵にパスフレーズを追加したい場合は、後で以下のコマンドを使用して設定できます。
gpg --edit-key labex
その後、GPG のプロンプトで passwd と入力してパスフレーズを設定し、save と入力して終了します。
システムがキーペアの生成を開始します。このプロセスにはランダムなデータ(エントロピー)が必要なため、完了まで少し時間がかかる場合があります。
完了すると、以下のような確認メッセージが表示されます。
gpg: key <KEY_ID> marked as ultimately trusted
gpg: revocation certificate stored as '/home/labex/.gnupg/openpgp-revocs.d/<FINGERPRINT>.rev'
public and secret key created and signed.
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
鍵が生成されたので、内容を確認してみましょう。新しい公開鍵を表示するには、以下を実行します。
gpg --list-keys
出力には、作成した鍵を含むキーリング内のすべての公開鍵が表示されます。
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
秘密鍵を表示するには、以下を実行します。
gpg --list-secret-keys
出力は似ていますが、公開鍵(pub)ではなく秘密鍵(sec)であることを示しています。
/home/labex/.gnupg/pubring.kbx
------------------------------
sec rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
ssb rsa3072 2025-07-01 [E] [expires: 2027-07-01]
これで、GPG キーペアの作成と確認が正常に完了しました。
gpg -e と gpg --decrypt によるローカルファイルの暗号化と復号
このステップでは、生成した GPG キーペアを使用して、ファイルの暗号化と復号を行います。これは GPG の最も基本的なユースケースであり、データの機密性を保護することができます。暗号化によって読み取り可能なデータが読み取り不可能な形式に変換され、正しい秘密鍵を持つ者だけが元の形式に戻す(復号する)ことができます。
まず、作業用の簡単なテキストファイルを作成しましょう。すべての操作は現在のディレクトリ ~/project で行います。
echo "This is a secret message for the lab." > mytestfile.txt
次に、自分の公開鍵を使用してこのファイルを暗号化します。暗号化には gpg -e コマンドを使用します。また、-r フラグを使用して暗号化メッセージの受信者を指定する必要があります。ここでは自分の GPG 鍵に関連付けられた名前(labex)を指定します。
gpg -e -r labex mytestfile.txt
GPG は公開鍵を使用してファイルを暗号化します。暗号化は秘密ではない公開鍵で行われるため、パスフレーズの入力は求められません。
コマンドが完了したら、ls コマンドで新しく作成された暗号化ファイルを確認します。
ls
出力に、元のファイルと並んで mytestfile.txt.gpg が表示されるはずです。
mytestfile.txt mytestfile.txt.gpg
mytestfile.txt.gpg ファイルには暗号化されたデータが含まれています。この内容を表示しようとしても、読み取り不可能なバイナリデータが表示されるだけです。
では、このファイルを復号してみましょう。復号には gpg --decrypt コマンドを使用します。復号の際、GPG はあなたの秘密鍵を使用します。
ここでは --output フラグを使用して、復号された内容を保存する新しいファイル mytestfile.txt.decrypted を指定します。これにより、元のファイルを上書きすることを防ぎ、どのファイルがどれであるかを明確にします。
gpg --output mytestfile.txt.decrypted --decrypt mytestfile.txt.gpg
鍵にパスフレーズが設定されている場合は、入力を求められます。キー生成時にパスフレーズを設定しなかった場合は、自動的に復号が進みます。以下のような出力が表示されるはずです。
gpg: encrypted with 3072-bit RSA key, ID <KEY_ID>, created 2025-07-01
"labex <labex@example.com>"
復号が完了したら、新しいファイルの内容を表示して、元のメッセージと一致することを確認します。
cat mytestfile.txt.decrypted
出力は、最初に作成したテキストと同じになるはずです。
This is a secret message for the lab.
これで、自分宛てにファイルを暗号化し、GPG キーペアを使用してそれを復号することに成功しました。
gpg --export と gpg --import による公開鍵の交換
このステップでは、他者と公開鍵を交換する方法を学びます。誰かのためにファイルを暗号化するには、その人の公開鍵が必要です。同様に、誰かがあなたに暗号化ファイルを送りたい場合、その人はあなたの公開鍵を必要とします。このプロセスでは、自分の公開鍵をファイルに書き出す(エクスポート)ことと、他者から受け取った公開鍵を自分の GPG キーリングに取り込む(インポート)ことが行われます。
まず、自分の公開鍵をエクスポートしましょう。gpg --export コマンドを使用します。--armor オプションを使用するのが一般的です。これにより、鍵がテキストベース(ASCII)形式で作成され、メールやその他のテキスト通信チャネルで簡単にコピー&ペーストできるようになります。ここでは labex.pub という名前で保存します。
ターミナルで以下のコマンドを実行してください。labex の部分は、キー生成時に使用したユーザーID に置き換えてください。
gpg --export --armor -o labex.pub labex
ls を使用してファイルが作成されたことを確認できます。
ls
ファイルリストに labex.pub が表示されるはずです。内容を確認することもできます。
cat labex.pub
出力は -----BEGIN PGP PUBLIC KEY BLOCK----- で始まるテキストのブロックになります。これがあなたの公開鍵であり、他者と共有できる状態です。
次に、別のユーザーから公開鍵を受け取り、それをキーリングにインポートするシミュレーションを行います。実際のシナリオでは、安全な経路を通じて他者から公開鍵を受け取ります。この実験では、プロセスを再現するために一時的に「Alice」のキーペアを作成し、Alice の公開鍵をエクスポートします。
まず、Alice 用のキーペアを一時的に生成します。対話的なプロンプトを避けるためにバッチモードを使用します。
cat > alice-key-params << 'EOF'
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: Alice
Name-Email: alice@example.com
Expire-Date: 2y
%no-protection
%commit
EOF
パラメータファイルを使用して Alice のキーペアを生成します。
gpg --batch --generate-key alice-key-params
キー生成を確認する出力が表示されます。
gpg: key <KEY_ID> marked as ultimately trusted
public and secret key created and signed.
次に、Alice から受け取ったと仮定して、Alice の公開鍵をファイルにエクスポートします。
gpg --export --armor -o alice.pub alice@example.com
この実験のデモンストレーションとして、Alice の秘密鍵をキーリングから削除します。現実の世界では、あなたは彼女の公開鍵しか持っていないはずだからです。
gpg --delete-secret-keys alice@example.com
プロンプトが表示されたら、y を入力して Enter を押し、削除を確定します。
gpg --delete-keys alice@example.com
再度、y を入力して Enter を押し、削除を確定します。
これで、他者から受け取った状態を模した Alice の公開鍵ファイル alice.pub が手元にあります。
一時的なキー生成ファイルを削除します。
rm alice-key-params
Alice の公開鍵ファイルが用意できたので、gpg --import コマンドを使用して自分の GPG キーリングにインポートします。
gpg --import alice.pub
鍵がインポートされたことを確認する出力が表示されます。
gpg: key <KEY_ID>: public key "Alice <alice@example.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
Alice の鍵がキーリングに含まれていることを確認するために、公開鍵を一覧表示します。
gpg --list-keys
出力には、自分の鍵(labex)と新しくインポートされた鍵(Alice)の両方が表示されます。
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [ unknown] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
Alice の鍵の信頼レベルが [ unknown](不明)とマークされていることに注目してください。次のステップで、鍵の信頼を管理する方法を学びます。
公開鍵への署名と他者向けのファイルの暗号化
このステップでは、受け取った公開鍵に対する信頼を確立する方法と、その鍵を使用して所有者向けにファイルを暗号化する方法を学びます。公開鍵をインポートしただけでは、GPG はその鍵が本物かどうかを判断できません。自分の秘密鍵でその鍵に「署名」することで、暗号学的な保証を与え、自分の GPG 環境に対して「この鍵はこの人物のものであると信頼している」と伝えることになります。これは GPG の「信頼の網(Web of Trust)」モデルにおける基本的な概念です。
まず、前のステップでインポートした「Alice」の公開鍵に署名する必要があります。メールアドレス(alice@example.com)を指定して gpg --sign-key コマンドを使用します。
gpg --sign-key alice@example.com
GPG は Alice の鍵の詳細を表示し、署名するかどうかの確認を求めます。
pub rsa2048/XXXXXXXXXXXXXXXX 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: SC
trust: unknown validity: unknown
sub rsa2048/YYYYYYYYYYYYYYYY 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: E
[ unknown] (1). Alice <alice@example.com>
Really sign? (y/N)
y を入力して Enter を押します。鍵にパスフレーズが設定されている場合は、入力を求められます。これは、署名が自分の秘密鍵でしか実行できない暗号操作であるためです。求められたらパスフレーズを入力し、Enter を押します。
完了したら、再度鍵を一覧表示して署名を確認します。
gpg --list-keys
Alice の鍵のエントリの変化に注目してください。信頼レベルが [unknown] ではなくなっています。署名によって明示的に信頼したため、[ultimate](究極の信頼)と表示されるようになります。
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [ultimate] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
信頼できる Alice の公開鍵が手に入ったので、彼女だけが開くことができるファイルを暗号化できます。まず、そのための新しいファイルを作成します。
echo "This is a confidential message for Alice." > message-for-alice.txt
次に、gpg -e コマンドを使用してこのファイルを暗号化します。今回は -r フラグで受信者として Alice を指定します。
gpg -e -r alice@example.com message-for-alice.txt
GPG は Alice の公開鍵を使用して暗号化を行います。ls で結果を確認しましょう。
ls
ディレクトリ内に新しい暗号化ファイル message-for-alice.txt.gpg が表示されます。
labex.pub mytestfile.txt
alice.pub mytestfile.txt.decrypted
message-for-alice.txt mytestfile.txt.gpg
message-for-alice.txt.gpg
このファイルは安全に暗号化されました。Alice の秘密鍵(およびそのパスフレーズ)にアクセスできる人だけが、このメッセージを復号して読むことができます。
gpg --export-secret-keys と gpg --gen-revoke による鍵のメンテナンス
最後のステップでは、GPG 鍵に関する 2 つの重要なメンテナンス作業を行います。それは、秘密鍵の安全なバックアップの作成と、失効証明書の生成です。秘密鍵は代えが効かないものです。もし紛失すると、対応する公開鍵で暗号化されたすべてのデータにアクセスできなくなります。また、失効証明書は、秘密鍵を紛失したり盗まれたりした場合に、その公開鍵を無効化するためのセーフティネットとなります。
まず、秘密鍵のバックアップを作成しましょう。これは GPG 鍵を管理する上で最も重要なステップの一つです。
これには gpg --export-secret-keys コマンドを使用します。保存や持ち運びが容易なように、--armor フラグを使用して ASCII 形式のテキストファイルを作成します。エクスポートする鍵をユーザーID で指定する必要があります。
gpg --export-secret-keys --armor -o gpgkey.asc labex
このコマンドは、ユーザー labex の秘密鍵を gpgkey.asc という名前のファイルに書き出します。このファイルは極めて機密性の高いものです。 実際の運用では、このファイルを暗号化された USB ドライブや安全な金庫など、非常に安全なオフラインの場所に保管してください。
次に、失効証明書を作成します。これは鍵の生成直後に行い、秘密鍵のバックアップとは別の安全な場所に保管しておくべきものです。秘密鍵を紛失したり盗まれたりした場合、この証明書を公開することで、その鍵を今後使用したり信頼したりすべきではないことを他者に知らせることができます。
gpg --gen-revoke コマンドを使用します。--output フラグを使用して、証明書を revoke.asc というファイルに保存します。
gpg --output revoke.asc --gen-revoke labex
対話形式で進みます。
Create a revocation certificate for this key? (y/N)と聞かれたら、yを入力してEnterを押します。- 失効の理由を選択するよう求められます。この実験では、デフォルトの
0 = No reason specified(理由未指定)を受け入れるためにEnterを押します。 - オプションで説明を追加できます。今は何も入力せずに
Enterを押します。 - 最後に、
Is this okay? (y/N)と聞かれたら、yを入力してEnterを押し、内容を確定します。 - 鍵にパスフレーズが設定されている場合、証明書の作成を承認するためにパスフレーズの入力を求められます。入力して
Enterを押します。
失効証明書が作成されたという確認メッセージが表示されます。
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The printout
might be scanned and reconstructed by a determined attacker.
ls コマンドを使用して、~/project ディレクトリに 2 つの新しいファイルが作成されたことを確認します。
ls
ファイルリストに gpgkey.asc と revoke.asc が表示されているはずです。これで、必須の鍵メンテナンス作業が正常に完了しました。
まとめ
この実験では、Linux 環境における GNU Privacy Guard(GPG)の基本操作を学びました。まず、gpg --gen-key コマンドを使用して、公開鍵と秘密鍵からなる個人の GPG キーペアを生成しました。このプロセスでは、鍵の仕様を選択し、安全なパスフレーズで保護されたユーザーID を作成しました。鍵の生成後は、gpg -e を使用して自分宛てにローカルファイルを暗号化し、続いて gpg --decrypt コマンドと秘密鍵を使用してそれを復号する練習を行い、公開鍵暗号の基本原則を体験しました。
これらの基本を踏まえ、他者と安全に通信する方法を探索しました。gpg --export で自分の鍵を共有し、gpg --import で他のユーザーの鍵を受け取るという公開鍵の交換方法を学びました。また、インポートした公開鍵に署名して信頼を確立することの重要性と、その鍵を使用して特定のユーザー向けにファイルを暗号化する方法についても学習しました。最後に、gpg --export-secret-keys による秘密鍵のバックアップや、鍵が漏洩した場合に備えて無効化するための gpg --gen-revoke による失効証明書の作成といった、不可欠な鍵メンテナンス作業を実施しました。



