暗号化によるデータの整合性と真正性の確保

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

はじめに

デジタル世界において、データが改ざんされていないこと(完全性)と、信頼できるソースから提供されていること(真正性)を保証することは極めて重要です。暗号技術は、これらの目標を達成するためのツールを提供します。

この実験では、Linux システムにおける基本的な暗号技術の実践を紹介します。以下の項目について学びます。

  • ハッシュ化: ファイルの一意で固定サイズの「指紋」を作成します。ファイルが 1 ビットでも変更されると、ハッシュは完全に変化します。MD5 および SHA256 アルゴリズムを使用します。
  • デジタル署名: プライベートキーを使用してファイルを「署名」します。これにより、対応する公開鍵を持つ誰もが、ファイルが真正であり、変更されていないことを検証できます。
  • 暗号化: ファイルの内容をスクランブルし、復号するための正しい鍵を持つ者だけが読み取れるようにすることで、機密性を確保します。

md5sumsha256sum、および GnuPG (gpg)(Pretty Good Privacy (PGP) 標準の GNU 実装)などの標準的な Linux コマンドラインツールを使用します。この実験の終わりには、自信を持ってファイルのハッシュ化、署名、検証、暗号化、および復号ができるようになります。

ファイルハッシュの計算 (MD5 および SHA256)

このステップでは、ファイルの暗号学的ハッシュを計算する方法を学びます。ハッシュ関数は、入力(ファイルなど)を受け取り、ハッシュ値またはダイジェストとして知られる固定サイズのバイト列を返します。この値はデジタル指紋として機能します。

まず、md5sum コマンドを使用して、~/project ディレクトリにあらかじめ作成されている important_data.txt ファイルの MD5 ハッシュを計算します。

ターミナルで以下のコマンドを実行してください。

md5sum important_data.txt

ハッシュ値とその後にファイル名が続く出力が表示されます。

d9e21981521545759153147864347199  important_data.txt

MD5 は高速ですが、脆弱性のため、現在では暗号目的には安全ではないと考えられています。より安全で一般的に使用されている代替手段は、SHA-2 ファミリ、特に SHA256 です。

次に、sha256sum コマンドを使用して SHA256 ハッシュを計算しましょう。

sha256sum important_data.txt

出力は、より長く、より安全なハッシュになります。

a39b2c414f234246a2535321238863141b1a4849443b9992994b4189317e8591  important_data.txt

important_data.txt の内容を少しでも変更すると、MD5 および SHA256 の両方のハッシュが完全に変化し、不正な変更を簡単に検出できるようになります。

GnuPG (GPG) のインストールと設定

このステップでは、デジタル署名と暗号化に使用するツールである GnuPG (GPG) をインストールします。GPG は最新の Linux ディストリビューションでは多くの場合プリインストールされていますが、存在を確認し、最新の状態に保つことは良い習慣です。

まず、apt-get update を使用してパッケージリストを更新します。パッケージ管理には管理者権限が必要なため、sudo を使用する必要があります。

sudo apt-get update

次に、gnupg パッケージをインストールします。-y フラグは、プロンプトに対して自動的に「yes」と応答するため、インストールを非対話的にします。

sudo apt-get install -y gnupg

インストールが完了したら、バージョンを確認することで GPG が正しくインストールされていることを検証できます。

gpg --version

以下のような出力が表示され、インストールが確認できるはずです。バージョン番号や詳細は若干異なる場合があります。

gpg (GnuPG) 2.2.27
libgcrypt 1.9.4
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/labex/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

これで GPG の準備が整いましたので、独自の暗号鍵を作成に進むことができます。

デジタル署名用の GPG キーペアの生成

このステップでは、秘密鍵と公開鍵からなる独自の GPG キーペアを生成します。

  • 秘密鍵: 極秘に保管する必要があります。メッセージの復号化やデジタル署名の作成に使用されます。
  • 公開鍵: 自由に共有できます。あなた宛てのメッセージの暗号化や、あなたのデジタル署名の検証に使用されます。

通常、gpg --full-generate-key は対話形式でセットアップを実行します。このラボではプロセスを簡素化し非対話的にするために、GPG のバッチモードを使用します。まず、キーの詳細を指定するパラメータファイルを作成します。

「ヒアドキュメント」を使用した以下の cat コマンドを使用して、gen-key-params ファイルを即座に作成します。

cat << EOF > gen-key-params
%echo Generating a basic key
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: LabEx User
Name-Email: user@labex.io
Expire-Date: 0
%no-protection
%commit
%echo done
EOF

このファイルは、"LabEx User" という名前で "user@labex.io" というメールアドレスを持つユーザーのために、2048 ビットの RSA キーを作成するように GPG に指示します。キーは期限切れにならず、簡素化のためにパスフレーズなしでキーを作成するために %no-protection を使用します(実際のシナリオでは、常に強力なパスフレーズを使用してください)。

次に、パラメータファイルを使用してキーを生成します。

gpg --batch --gen-key gen-key-params

GPG はパラメータを使用してキーペアを生成します。これには数分かかる場合があります。完了したら、キーを一覧表示して、キーペアが正常に作成されたことを確認できます。

gpg --list-keys

出力には、新しく作成された公開鍵が以下のように表示されるはずです。

/home/labex/.gnupg/pubring.kbx
-------------------------------
pub   rsa2048 2023-10-27 [SC]
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid           [ultimate] LabEx User <user@labex.io>
sub   rsa2048 2023-10-27 [E]

これで、ファイルの署名と暗号化に使用できる GPG キーペアが用意できました。

GPG によるファイルのデジタル署名と検証

このステップでは、秘密鍵を使用してファイルのデジタル署名を作成します。この署名は、ファイルがあなたから提供されたものであり、署名されてから変更されていないことを証明します。

「デタッチド」署名を作成します。これは別のファイルに保存されます。元のファイルはそのまま残るため、これは便利です。

important_data.txt に署名するには、次のコマンドを実行します。GPG は、先ほど生成したデフォルトの秘密鍵を自動的に使用します。

gpg --detach-sign important_data.txt

パスフレーズなしでキーを作成したため、パスフレーズを求められることはありません。次に、ディレクトリ内のファイルを一覧表示して、新しい署名ファイルを確認します。

ls

元のファイルとその署体が表示されます。

gen-key-params  important_data.txt  important_data.txt.sig

ここで、あなたが important_data.txtimportant_data.txt.sig の両方、およびあなたの公開鍵を受け取った受信者であると想像してください。ファイルの信頼性と完全性を検証するために、受信者は gpg --verify コマンドを実行します。

自分で検証を実行してみましょう。

gpg --verify important_data.txt.sig important_data.txt

出力により、署名が有効であることが確認されます。

gpg: Signature made Mon Aug  4 16:39:30 2025 CST
gpg:                using RSA key 8765265B14E42532B9CBAE6DE2120C9784C69814
gpg: Good signature from "LabEx User <user@labex.io>" [ultimate]

「Good signature」というメッセージは、ファイルが本物であり、変更されていないことを確認します。

GPG によるファイルの暗号化と復号化

このステップでは、機密保持のためにファイルを暗号化する方法を学びます。署名(秘密鍵を使用)とは異なり、誰かのためにファイルを暗号化するには、その人の公開鍵が必要です。受信者はその後、自分の秘密鍵を使用してそれを復号化します。

ここでは、important_data.txt を自分自身のために暗号化します。そのため、受信者の鍵として自分の公開鍵を使用します。

ファイルを暗号化するには、次のコマンドを使用します。--recipient フラグは暗号化に使用する公開鍵の所有者を指定し、--output は暗号化されたファイル名を定義します。

gpg --encrypt --recipient "user@labex.io" --output important_data.txt.gpg important_data.txt

新しく作成された暗号化ファイル important_data.txt.gpg の内容を表示しようとすると、読み取れないバイナリデータが表示されます。

cat important_data.txt.gpg

次に、ファイルを復号化しましょう。この操作には対応する秘密鍵が必要です。秘密鍵を持っているため、メッセージを復号化できます。復号化されたコンテンツは decrypted_data.txt という名前の新しいファイルに保存します。

gpg --decrypt --output decrypted_data.txt important_data.txt.gpg

GPG は秘密鍵を使用してファイルを復号化します。ターミナルには、ファイルが自分の鍵で暗号化されたという確認を含む、GPG からの情報が表示されます。

最後に、復号化されたファイルの内容を表示して、プロセスが成功したことを確認します。

cat decrypted_data.txt

出力は、元の読み取り可能なメッセージであるはずです。

This is a secret message that needs to be protected.

ファイルを暗号化して内容を保護し、その後復号化して元の情報を取得することに成功しました。

まとめ

この実験では、Linux システム上で基本的な暗号化ツールと概念について実践的な経験を積みました。以下のタスクを正常に実行しました。

  • データ整合性を確保するために、md5sum および sha256sum を使用してファイルのハッシュを計算しました。
  • オープンソース暗号化の標準ツールである GnuPG (gpg) をインストールおよび設定しました。
  • 個人の GPG キーペア(公開鍵と秘密鍵)を生成しました。
  • 真正性と整合性を提供するために、gpg --detach-sign でデジタル署名を作成しました。
  • gpg --verify でデジタル署名を検証しました。
  • 機密保持のために gpg --encrypt を使用してファイルを暗号化しました。
  • gpg --decrypt を使用してファイルを復号化し、元のコンテンツにアクセスしました。

これらのスキルは、データの保護、ソフトウェアダウンロードの検証、およびさまざまな専門的および個人的な状況での通信の保護に不可欠です。