暗号技術における対称暗号の基礎

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

はじめに

対称暗号化は、暗号化と復号化に単一の鍵を使用する、暗号技術における基本的な概念です。この方式は高速かつ効率的であるため、大量のデータを暗号化するのに最適です。

この実験(Lab)では、Linux 環境で強力なコマンドラインツールである openssl を使用して、対称暗号化の実践的な経験を積みます。秘密鍵の生成、テキストファイルの暗号化、復号化、そして最終的に復号化されたファイルが元のファイルと同一であることを検証する、一連のプロセスを順を追って学習します。

対称暗号の概念

このステップでは、対称暗号化のコアコンセプトを簡単に復習します。この「対称(Symmetric)」とは、データをロックする(暗号化する)のと同じ鍵が、それをアンロックする(復号化する)ためにも使用されることを意味します。

物理的な鍵のかかる箱を想像してみてください。鍵を使って箱を施錠します。再び開けるには、全く同じ鍵を使わなければなりません。対称暗号化において、この鍵はデジタル情報の一部であり、データを暗号化および復号化する必要がある関係者間で安全に共有されなければなりません。この単一の鍵が漏洩した場合、暗号化されたデータのセキュリティは失われます。

この実験(Lab)では、単純なテキストファイルを扱います。~/project ディレクトリ内に original.txt という名前のファイルが事前に作成されています。その内容を確認し、平文で読み取り可能なテキストファイルであることを確認できます。

現在のディレクトリ内のファイル一覧を表示して確認してみましょう。

ls -l

出力に original.txt ファイルが表示されるはずです。

-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

それでは、その内容を表示してみましょう。

cat original.txt

出力は、ファイル内の単純なテキストメッセージになります。

This is a secret message.

次のステップでは、このファイルを暗号化して読めないようにし、その後、元の形式に復号化します。

AES 鍵の生成

このステップでは、暗号化プロセスに使用する安全でランダムな鍵を生成します。対称暗号化の強度は、鍵の秘匿性とランダム性に大きく依存します。予測可能な鍵は推測されやすく、暗号化が無意味になります。

ここでは、openssl rand コマンドを使用して、暗号学的に強力なランダムな鍵を生成します。AES (Advanced Encryption Standard) アルゴリズムの標準的な長さである 256 ビットの鍵を生成します。

以下のコマンドを実行して、32 バイト(256 ビット)の鍵を 16 進数形式で生成し、aes.key というファイルに保存します。

openssl rand -hex 32 > aes.key

このコマンドを分解してみましょう。

  • openssl rand: ランダムなデータを生成するためのコマンドです。
  • -hex: 出力を 16 進数文字列としてフォーマットします。
  • 32: 生成するランダムデータのバイト数を指定します。各 16 進数文字は 4 ビット(または半バイト)を表すため、32 バイトのデータは 64 文字の 16 進数文字列になります。
  • > aes.key: コマンドの出力をリダイレクトし、aes.key ファイルに保存します。

それでは、生成された鍵を表示してみましょう。鍵はランダムに生成されるため、あなたの鍵は以下の例とは異なることに注意してください。

cat aes.key

256 ビットの秘密鍵である、長い 16 進数文字の文字列が表示されます。

2da75d4f284618ed6933d0e743757ed014ba39a1a8aa1879ebbbfe53b92d519a

この aes.key ファイルには、データの暗号化と復号化の両方に使用する秘密情報が格納されました。

AES によるファイル暗号化

このステップでは、生成した鍵を使用して original.txt ファイルを暗号化します。暗号化および復号化のための多用途なツールである openssl enc コマンドを使用します。

AES-256-CBC 方式を使用します。

  • AES-256: 256 ビット鍵を持つ高度な暗号化標準(Advanced Encryption Standard)を指します。
  • CBC: Cipher Block Chaining(暗号ブロック連鎖)の略で、ランダム性を追加し、同一の平文ブロックが同一の暗号文ブロックにならないようにする動作モードです。

ファイルを暗号化するには、次のコマンドを実行します。

openssl enc -aes-256-cbc -pbkdf2 -salt -in original.txt -out encrypted.dat -pass file:./aes.key

コマンドのオプションを確認しましょう。

  • openssl enc: 暗号化方式のためのコマンドです。
  • -aes-256-cbc: 使用する暗号化アルゴリズムを指定します。
  • -pbkdf2: 廃止警告を防ぐために、最新の標準ベースのパスワードベース鍵導出関数(PBKDF2)を使用します。
  • -salt: 暗号化前に鍵にランダムなソルト(salt)を追加します。これは、特定の種類の攻撃から保護するための重要なセキュリティ対策です。
  • -in original.txt: 暗号化する入力ファイルを指定します。
  • -out encrypted.dat: 暗号化されたデータを格納する出力ファイル名を指定します。
  • -pass file:./aes.key: OpenSSL に対し、パスワード(この場合は対称鍵)を aes.key ファイルから読み取るように指示します。

コマンド実行後、encrypted.dat という名前の新しいファイルが作成されます。その内容を表示してみましょう。

cat encrypted.dat

出力は、ファイルが暗号化されていることを確認できる、判読不能な文字の羅列になります。

Salted___Mi72j)NU_nJ_h9s(0]%

これで、秘密メッセージの暗号化に成功しました。このファイルと aes.key の両方を持たない限り、誰もその内容を読み取ることはできません。

AES によるファイル復号化

このステップでは、encrypted.dat ファイルを復号化して元のメッセージを取り出します。これは対称暗号化であるため、暗号化時と同じ鍵 (aes.key) と同じ基本コマンド (openssl enc) を使用します。

主な違いは、OpenSSL に暗号化ではなく復号化を実行するように指示する -d フラグが追加されている点です。

ファイルを復号化するには、次のコマンドを実行します。

openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.dat -out decrypted.txt -pass file:./aes.key

このコマンドは暗号化コマンドと非常によく似ています。

  • -d: このフラグは、入力ファイルを復号化したいことを指定します。
  • -aes-256-cbc: 暗号化に使用されたのと同じ暗号方式を指定する必要があります。
  • -pbkdf2: 暗号化に使用されたのと同じ鍵導出関数を使用する必要があります。
  • -in encrypted.dat: 入力ファイルは、現在暗号化されたデータです。
  • -out decrypted.txt: 復号化された、読み取り可能なテキストが保存される出力ファイルです。
  • -pass file:./aes.key: ファイルの暗号化に使用されたのと同じ鍵を提供します。

コマンドが完了すると、decrypted.txt という名前の新しいファイルが作成されます。復号化が成功したかどうかを確認するために、その内容を見てみましょう。

cat decrypted.txt

出力は、original.txt にあった元のメッセージと全く同じであるはずです。

This is a secret message.

おめでとうございます!これで、完全な暗号化と復号化のサイクルを正常に完了しました。

ファイル整合性の検証

この最終ステップでは、復号化プロセスが完璧であり、decrypted.txt ファイルが original.txt ファイルの正確なコピーであることを検証します。短いメッセージの場合は目視で確認できますが、より大きなファイルや自動化されたスクリプトにはプログラムによるチェックが必要です。

Linux の diff コマンドは、この作業に最適なツールです。これは 2 つのファイルを 1 行ずつ比較し、相違点を報告します。ファイルが同一であれば、diff は何も出力しません。

元のファイルと復号化されたファイルを比較するために diff コマンドを実行します。

diff original.txt decrypted.txt

コマンドが実行され、メッセージなしでコマンドプロンプトに戻った場合、ファイルは同一であることを意味します。この沈黙が成功の証拠です。これにより、データが暗号化および復号化のサイクル全体を通じて完全性を維持したことが証明されます。

この実験(Lab)で扱ったすべてのファイルを確認するには、もう一度 ls -l を実行できます。

ls -l

元のファイル、鍵、暗号化されたデータ、そして最終的な復号化されたファイルが表示されます。

-rw-rw-r-- 1 labex labex 65 Oct 20 08:57 aes.key
-rw-rw-r-- 1 labex labex 26 Oct 20 08:57 decrypted.txt
-rw-rw-r-- 1 labex labex 48 Oct 20 08:57 encrypted.dat
-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

これにより、対称暗号化のライフサイクル全体を正常に管理できたことが確認できました。

まとめ

この実験(Lab)では、Linux 環境でopensslを使用して対称暗号化の基礎に関する実践的な経験を積みました。

あなたは、暗号化と復号化の両方に単一の共有鍵を使用するという中核的な概念を学びました。

  • 暗号化と復号化の両方に単一の共有鍵を使用するという中核的な概念を学びました。
  • openssl rand を使用して、強力な 256 ビットの AES 鍵を生成しました。
  • openssl enc を使用してテキストファイルを暗号化し、読み取れないようにしました。
  • 同じコマンドに -d フラグを付けて使用し、ファイルを元の状態に復号化しました。
  • 最後に、diff コマンドを使用して、復号化されたデータが元のデータと同一であることをプログラム的に検証し、データの完全性を確認しました。

この実践的な演習は、対称暗号がどのように機能し、データを保護するために実際的にどのように適用されるかを理解するための強固な基盤を提供します。