はじめに
この実験 (Lab) では、現代暗号技術の礎石である非対称暗号 (asymmetric encryption) の原理を探求します。対称暗号 (symmetric encryption) が暗号化と復号化に単一の鍵を使用するのに対し、非対称暗号は公開鍵 (public key) と秘密鍵 (private key) のペアを使用します。
公開鍵は暗号化に使用され、誰とでも共有できます。秘密鍵は秘密に保持され、復号化に使用されます。この仕組みにより、事前に秘密鍵を共有する必要なく安全な通信が可能になります。
本実験では、広く採用されている RSA アルゴリズムと強力なコマンドラインツール openssl を使用してこのプロセスを実証します。公開鍵を使用したメッセージの暗号化方法、および秘密鍵を使用した復号化方法を学習します。すべての操作は、~/project ディレクトリ内のターミナルで実行されます。
非対称暗号化の基礎
このステップでは、公開鍵暗号 (public-key cryptography) としても知られる非対称暗号の核となる概念を学習します。これは実行するコマンドのない概念的なステップですが、これらの原理を理解することは、その後の実践的なタスクにとって極めて重要です。
非対称暗号は、数学的に関連付けられた 2 つの異なる鍵に依存しています。
公開鍵 (Public Key): この鍵は誰でも利用できるように公開されます。その主な機能はデータを暗号化することです。公開鍵を持っている人は誰でもメッセージを暗号化できますが、その暗号化されたメッセージを復号化するためにそれを使用することはできません。これは、誰でも手紙を投函できる開いた郵便受けの投入口のようなものだと考えてください。
秘密鍵 (Private Key): この鍵は、所有者によって秘密かつ安全に保持されなければなりません。その機能は、対応する公開鍵で暗号化されたデータを復号化することです。秘密鍵を保持している人だけがメッセージを復号化できます。郵便受けの例えで言えば、秘密鍵は郵便受けを開けて手紙を取り出すことができる固有の鍵です。
この一方向の関係性が、安全でないネットワーク上での安全な通信の基盤となります。次のステップでは、独自の公開鍵/秘密鍵ペアを生成し、それらを使用してメッセージの暗号化と復号化を行います。
RSA 鍵ペアの生成
このステップでは、openssl コマンドラインツールを使用して RSA 鍵ペアを生成します。このコマンドは、秘密鍵と公開鍵の両方のコンポーネントを含む単一のファイルを生成します。
ターミナルで以下のコマンドを実行してください。この実験 (Lab) のすべてのコマンドは、デフォルトの ~/project ディレクトリから実行する必要があります。
openssl genrsa -out private.pem 2048
このコマンドを分解してみましょう。
openssl: OpenSSL ツールキットを呼び出すコマンドです。genrsa: RSA 秘密鍵を生成するための特定のコマンドです。-out private.pem: このフラグは、鍵の出力ファイル名を指定します。ここではprivate.pemという名前を付けています。2048: これは鍵の長さをビット単位で示します。2048 ビットは、RSA 鍵にとって標準的で安全な長さです。
次に、ls コマンドを使用して、カレントディレクトリにファイル private.pem が作成されたことを確認します。
ls
出力に private.pem がリストされているはずです。
private.pem
公開鍵の抽出
このステップでは、作成した private.pem ファイルから公開鍵を抽出します。秘密鍵ファイルには必要なすべてのコンポーネントが含まれていますが、メッセージの暗号化のために他者と安全に共有できる個別の公開鍵ファイルが必要です。
公開鍵を抽出するには、次のコマンドを使用します。
openssl rsa -in private.pem -pubout -out public.pem
コマンドの内訳は以下の通りです。
openssl rsa: このコマンドは RSA 鍵の処理に使用されます。-in private.pem: 入力ファイル、つまり秘密鍵を指定します。-pubout: このフラグは、鍵の公開部分を抽出して出力するようにopensslに指示します。-out public.pem: 公開鍵の出力ファイル名を指定します。
このコマンドは、操作を確認する短い出力を生成します。
writing RSA key
次に、ディレクトリ内のファイルを再度リスト表示して、秘密鍵と公開鍵の両方を確認します。
ls
これで private.pem と public.pem の両方が表示されるはずです。
private.pem public.pem
公開鍵ファイルの内容を表示できます。これは PEM 形式のテキストファイルです。
cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
...
-----END PUBLIC KEY-----
公開鍵によるメッセージの暗号化
このステップでは、秘密のメッセージを作成し、抽出したばかりの公開鍵を使用してそれを暗号化します。対応する秘密鍵を持つ者だけが復号化できます。
まず、秘密のメッセージを含む単純なテキストファイルを作成しましょう。
echo "This is a secret message." > message.txt
このコマンドは、指定された内容を持つ message.txt という名前のファイルを作成します。次に、このファイルを公開鍵を使用して暗号化します。
openssl pkeyutl -encrypt -pubin -inkey public.pem -in message.txt -out encrypted.bin
このコマンドを見てみましょう。
openssl pkeyutl: 暗号化や復号化などの公開鍵操作を実行するためのユーティリティです。-encrypt: 暗号化操作を実行したいことを指定します。-pubin: 入力鍵 (-inkey) が公開鍵であることを示します。-inkey public.pem: 暗号化に使用する公開鍵を指定します。-in message.txt: 平文メッセージを含む入力ファイルです。-out encrypted.bin: 暗号化されたデータ(暗号文)が保存される出力ファイルです。
コマンド実行後、新しいファイル encrypted.bin が作成されます。その内容を表示しようとすると、メッセージの暗号化された形式である、読めないバイナリデータが表示されます。
cat encrypted.bin
出力は文字化けした文字列になり、メッセージが暗号化されていることが確認できます。
秘密鍵によるメッセージの復号化
この最終ステップでは、暗号化されたメッセージを秘密鍵を使用して復号化し、元の平文を取り戻します。これにより、秘密鍵の所有者のみが秘密情報にアクセスできることが実証されます。
encrypted.bin を復号化するには、次のコマンドを使用します。
openssl pkeyutl -decrypt -inkey private.pem -in encrypted.bin -out decrypted.txt
コマンドオプションを確認しましょう。
openssl pkeyutl: 以前と同じユーティリティです。-decrypt: 今回は復号化操作を指定します。-inkey private.pem: 復号化に使用する秘密鍵を指定します。-in encrypted.bin: 暗号化された暗号文を含む入力ファイルです。-out decrypted.txt: 復元された平文が保存される出力ファイルです。
このコマンドにより、decrypted.txt という名前の新しいファイルが作成されます。復号化が成功したことを確認するために、この新しいファイルの内容を表示します。
cat decrypted.txt
元のメッセージが完全に復元されているはずです。
This is a secret message.
おめでとうございます!RSA と OpenSSL を使用した非対称暗号化および復号化の完全なサイクルを正常に実行できました。
まとめ
この実験では、RSA アルゴリズムと OpenSSL ツールキットを使用した非対称暗号化に関する実践的な経験を積みました。
公開鍵と秘密鍵の根本的な違い、およびそれらが通信のセキュリティ確保において果たすそれぞれの役割について学びました。
具体的には、以下の重要なスキルを練習しました。
openssl genrsaを使用した 2048 ビットの RSA 鍵ペアの生成。openssl rsaを使用した秘密鍵ファイルからの公開鍵の抽出。openssl pkeyutlを使用した公開鍵による平文メッセージの暗号化。openssl pkeyutlを使用した対応する秘密鍵による結果の暗号文の復号化。
これらのスキルは、セキュアなウェブブラウジング(HTTPS)から暗号化された電子メール、デジタル署名に至るまで、さまざまなアプリケーションでセキュアなシステムを理解し実装するための基礎となります。



