暗号技術における RSA を用いたデジタル署名

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

はじめに

RSA を用いたデジタル署名に関する実験 (Lab) へようこそ。デジタル署名とは、デジタルメッセージや文書の認証性 (authenticity) と完全性 (integrity) を検証するために使用される暗号化メカニズムです。これにより、メッセージが既知の送信者によって作成されたこと(認証性)と、転送中に改ざんされていないこと(完全性)が保証されます。

この実験 (Lab) では、デジタル署名のライフサイクル全体について実践的な経験を積みます。私たちは、暗号化タスクのための堅牢で多用途なユーティリティである openssl コマンドラインツールを使用します。秘密鍵を使用して署名を生成する方法と、対応する公開鍵を使用してそれを検証する方法を学びます。最終的には、デジタル署名がどのようにデジタル通信を保護しているかについて、実践的な理解を得ることができるでしょう。

デジタル署名の概念

このステップでは、デジタル署名の核となる概念の理解から始めます。デジタル署名は、送信者によってその秘密鍵 (private key) を使用して作成されます。この鍵は秘密に保たれ、送信者のみが知っています。その後、署名は送信者の対応する公開鍵 (public key) を持つ誰でも検証できます。

このプロセスは、2 つの重要なセキュリティ保証を提供します。

  • 認証性 (Authenticity): 秘密鍵を持っているのは送信者だけであるため、有効な署名はメッセージがその送信者から発信されたことを証明します。
  • 完全性 (Integrity): 署名はメッセージの内容と数学的に結びついています。メッセージが何らかの方法で変更された場合、署名はもはや有効ではなくなります。

この実験 (Lab) を容易にするために、セットアッププロセスですでに RSA 鍵ペアが生成されています。private.pem(秘密鍵)と public.pem(共有可能な鍵)です。また、message.txt という名前のファイルも作成されています。準備されたファイルを確認するために、プロジェクトディレクトリ内のファイル一覧を表示しましょう。

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

ls -l

準備されたファイルが表示されるはずです。

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem

鍵とメッセージが揃ったので、最初のデジタル署名を作成する準備ができました。

秘密鍵によるメッセージへの署名

このステップでは、message.txt ファイルに対してデジタル署名を作成します。このプロセスには主に 2 つのアクションが含まれます。まず、メッセージの暗号学的ハッシュ(一意の固定長バイト列)を作成し、次にそのハッシュを秘密鍵で暗号化します。その結果がデジタル署名となります。

この操作を実行するために openssl dgst コマンドを使用します。message.txt に署名するためのコマンドを実行しましょう。

openssl dgst -sha256 -sign private.pem -out signature.bin message.txt

このコマンドの内訳は以下の通りです。

  • openssl dgst: OpenSSL のダイジェスト (digest) コマンドを呼び出します。
  • -sha256: メッセージハッシュを作成するために SHA-256 アルゴリズムを指定します。
  • -sign private.pem: 指定された秘密鍵 private.pem を使用してハッシュに署名するよう OpenSSL に指示します。
  • -out signature.bin: 生成されたバイナリ署名を格納する出力ファイルを指定します。
  • message.txt: 署名対象の入力ファイルです。

コマンド実行後、signature.bin という名前の新しいファイルが作成されます。このファイルにはデジタル署名が含まれています。ファイル一覧を再度表示することで、その作成を確認できます。

ls -l

ファイル一覧に signature.bin が表示されるはずです。

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem
-rw-rw-r-- 1 labex labex  256 Oct 20 09:26 signature.bin

公開鍵による署名の検証

このステップでは、署名を検証したい受信者の役割を担います。これを行うには、受信者は 3 つのものが必要です。元のメッセージ (message.txt)、デジタル署名 (signature.bin)、そして送信者の公開鍵 (public.pem) です。

検証プロセスは署名プロセスを逆転させます。OpenSSL は公開鍵を使用して署名を復号し、元のハッシュを明らかにします。次に、受信したメッセージの新しいハッシュを独自に計算します。2 つのハッシュが一致すれば、署名は有効です。

再度 openssl dgst を使用しますが、今回は -verify オプションを使用します。

openssl dgst -sha256 -verify public.pem -signature signature.bin message.txt

検証コマンドの内訳は以下の通りです。

  • -verify public.pem: 指定された公開鍵 public.pem を使用して署名を検証するよう OpenSSL に指示します。
  • -signature signature.bin: 検証対象の署名ファイルを指定します。
  • message.txt: 署名が対応すると想定されている元のメッセージファイルです。

署名が有効な場合、OpenSSL は次のメッセージを出力します。

Verified OK

この確認は 2 つのことを意味します。メッセージは間違いなく private.pem 鍵の所有者によって署名されており、message.txt の内容が署名されて以来変更されていないということです。

秘密鍵によるファイルへの署名

このステップでは、別のファイルに署名プロセスを適用することで、署名プロセスを強化します。これにより、署名付きハッシュがどのように作成され、使用されるかについての理解が深まります。ディレクトリには document.txt という別のファイルがあります。このドキュメントに対してデジタル署名を作成します。

手順はステップ 2 で行ったことと全く同じです。document.txt の SHA-256 ハッシュを生成し、そのハッシュを秘密鍵 private.pem で署名します。

署名を作成し、document.sig という名前のファイルに保存しましょう。

openssl dgst -sha256 -sign private.pem -out document.sig document.txt

このコマンドは、document.txt の現在の内容に固有の新しい署名ファイル document.sig を作成します。ドキュメントに変更があった場合、新しい署名を生成する必要があります。

document.sig が作成されたことを確認するために、ファイル一覧を表示しましょう。

ls

出力に新しい署名ファイルが表示されるはずです。

document.sig  document.txt  message.txt  private.pem  public.pem  signature.bin

これで署名されたドキュメントが手に入りました。これは、次のステップでデジタル署名の完全性検証能力を実証するために使用します。

署名の改ざんテスト

この最終ステップでは、デジタル署名の最も重要な機能である完全性保護を実証します。意図的に署名後の document.txt ファイルを改ざんし、その後、元の署名で検証を試みます。これにより、デジタル署名がいかに不正な変更を防ぐかを示します。

まず、document.txt ファイルにいくつかのテキストを追加します。これは攻撃者がドキュメントを変更する状況をシミュレートします。

echo "This is an unauthorized change." >> document.txt

これで document.txt の内容が変更されました。元の署名 document.sig は、ファイルの以前の内容に基づいて作成されています。

次に、変更された document.txt ファイルを、元の署名 document.sig と公開鍵を使用して検証してみます。

openssl dgst -sha256 -verify public.pem -signature document.sig document.txt

今回、検証は成功しません。代わりに、次のようなエラーメッセージが表示されます。

Verification failure
805BA484597F0000:error:02000068:rsa routines:ossl_rsa_verify:bad signature:../crypto/rsa/rsa_sign.c:430:
805BA484597F0000:error:1C880004:Provider routines:rsa_verify:RSA lib:../providers/implementations/signature/rsa_sig.c:774:

この失敗は予期された結果です。これは、変更された document.txt のハッシュが、document.sig 内に暗号化されていたハッシュと一致しなくなったために発生します。これにより、ファイルが署名されて以来改ざんされたことが即座に証明されます。このメカニズムは、デジタルドキュメントや通信を信頼するための基本となります。

まとめ

この実験(Lab)では、RSA と OpenSSL を使用したデジタル署名の実際的な適用方法を習得しました。

以下のプロセス全体を順を追って実行しました。

  • デジタル署名によって提供される真正性(authenticity)と完全性(integrity)の核となる概念を理解しました。
  • 秘密鍵 (private.pem) を使用してメッセージに署名し、署名ファイルを作成しました。
  • 対応する公開鍵 (public.pem) を使用して署名を検証し、メッセージの真正性を確認しました。
  • 署名されたファイルを意図的に改ざんした後、Verification failure を目撃し、デジタル署名がいかにデータ完全性を保護するかを実証しました。

この実践的な経験は、デジタル世界で信頼がどのように確立されるかを理解するための強固な基盤を提供します。これは、サイバーセキュリティおよび現代のコンピューティングにおける極めて重要な概念です。