LinuxにおけるGPGを使用したファイルの暗号化と復号

CompTIABeginner
オンラインで実践に進む

はじめに

この実験では、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 を使用できますが、この実験ではデフォルトのオプションで十分です。

以下の情報を入力するよう求められます:

  1. Real name: labex と入力
  2. Email address: labex@example.com と入力
  3. 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

対話形式でプロセスが進みます:

  1. Create a revocation certificate for this key? (y/N) と聞かれたら、y を入力して Enter を押します。
  2. 失効理由を選択するよう求められます。この実験では、Enter を押してデフォルトの 0 = No reason specified を受け入れます。
  3. オプションの説明を追加できます。今は Enter を押して空白のままにします。
  4. 最後に、Is this okay? (y/N) と聞かれたら y を入力して Enter を押し、詳細を確認します。
  5. キーにパスフレーズがある場合、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.ascrevoke.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 を使用した失効証明書の作成など、キーが侵害された場合に備えるための重要なキーメンテナンス作業を実行しました。