はじめに
この実験では、Linux環境においてGPG(GNU Privacy Guard)を使用してファイルを暗号化および復号するための基本的なスキルを学びます。まず、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を押します。
システムは自動的に安全なデフォルト設定を使用します:
- Key type: RSA and RSA (デフォルト)
- Key size: 3072 bits (安全なデフォルト)
- Key validity: 2 years (セキュリティのため自動的に有効期限が設定されます)
注意: 古いバージョンとは異なり、最新の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の公開鍵しか持っていない状況を再現するため、Aliceの秘密鍵をキーリングから削除します:
gpg --delete-secret-keys alice@example.com
プロンプトが表示されたら、y を入力して Enter を押し、削除を確認します。
gpg --delete-keys alice@example.com
同様に、y を入力して Enter を押し、削除を確認します。
これで alice.pub ファイルにAliceの公開鍵が保存されました。これは他者から受け取った状態をシミュレートしています。
一時的なキー生成ファイルをクリーンアップします:
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」の公開鍵に署名する必要があります。gpg --sign-key コマンドを使用し、メールアドレス(alice@example.com)で鍵を識別します。
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の鍵のエントリの変化に注目してください。インポートした鍵に署名すると、GPGはそれを [unknown] と表示しなくなります。ローカルのキーリングの状態によっては、[full] や [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 [full] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
署名を直接確認したい場合は、以下を実行します:
gpg --list-sigs alice@example.com
labex <labex@example.com> の署名行が表示されるはずです。これは、あなたの鍵がAliceのインポートされた公開鍵に署名したことを確認するものです。
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キー管理において最も重要なステップの1つです。
この目的には 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を押します。- 失効理由を選択するよう求められます。この実験では、
Enterを押してデフォルトの0 = No reason specifiedを受け入れます。 - オプションの説明を追加できます。今は
Enterを押して空白のままにします。 - 最後に、
Is this okay? (y/N)と聞かれたらyを入力してEnterを押し、詳細を確認します。 - キーにパスフレーズがある場合、GPGはこの証明書の作成を承認するためにパスフレーズを求めます。プロンプトが表示されたらパスフレーズを入力し、
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 ディレクトリに両方の新しいファイルが作成されたことを確認します。
ls
ファイルリストに gpgkey.asc と revoke.asc が表示されるはずです。これで、重要なキーメンテナンス作業が完了しました。
まとめ
この実験では、Linux環境におけるGNU Privacy Guard(GPG)の基本的な操作を学びました。まず、gpg --gen-key コマンドを使用して、公開鍵と秘密鍵で構成される個人用のGPGキーペアを生成しました。このプロセスには、キー仕様の選択と、安全なパスフレーズで保護されたユーザーIDの作成が含まれていました。キー生成後、gpg -e で自分自身のためにローカルファイルを暗号化し、その後秘密鍵と gpg --decrypt コマンドを使用して復号するというGPGの核心機能を練習し、非対称暗号の基本原則を実証しました。
これらの基礎を基に、他者と安全に通信する方法を探りました。gpg --export を使用して自分の鍵を共有し、gpg --import を使用して他者の鍵を受け取るという公開鍵の交換方法を学びました。また、インポートした公開鍵に署名して信頼を確立し、それを使用して特定のユーザー宛てにファイルを暗号化する重要性についてもカバーしました。最後に、gpg --export-secret-keys による秘密鍵のバックアップや、gpg --gen-revoke を使用した失効証明書の作成など、キーが侵害された場合に備えるための重要なキーメンテナンス作業を実行しました。



