メインコンテンツへスキップ
  1. ノート/
  2. セキュリティと暗号/

RSA暗号、デジタル署名、ハッシュを組み合わせる例

·1251 文字·3 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml
以下の式はRSAの仕組みを理解するための簡略化した説明です。実際のシステムでは、RSAをそのまま実装せず、RSA-OAEPやRSA-PSSをサポートする暗号ライブラリを利用してください。

AliceがBobへメッセージを送り、次の3つを同時に実現したいとします。

  • 機密性:Bob以外がメッセージを読めない。
  • 完全性:途中でメッセージが改ざんされていない。
  • 送信元の検証:確かにAliceが署名したことを確認できる。

1. 鍵の持ち方
#

人物公開鍵秘密鍵用途
Alice(e_A, n_A)(d_A, n_A)署名の生成、Alice宛データの復号
Bob(e_B, n_B)(d_B, n_B)Bob宛データの復号、署名の生成

公開鍵は相手へ渡して構いません。秘密鍵は本人だけが管理します。

2. Aliceがメッセージを暗号化する
#

Aliceが次のメッセージをBobへ送るとします。

M = "Hello, Bob!"

AliceはBobの公開鍵でメッセージを暗号化します。

$$ C = M^{e_B} \bmod n_B $$

暗号文CはBobの公開鍵に対応する秘密鍵を持つBobだけが復号できます。

3. Aliceがハッシュを計算し、署名を生成する
#

Aliceはメッセージ全体をハッシュ関数へ入力します。

$$ H(M) = \operatorname{SHA-256}(M) $$

そのハッシュ値へAliceの秘密鍵で署名します。概念的には次の式です。

$$ S = H(M)^{d_A} \bmod n_A $$

実際のRSA署名では、ハッシュ値をそのままRSA演算へ渡すのではなく、RSA-PSSなどの署名パディングを使います。

4. AliceがBobへ送るデータ
#

Aliceは、暗号文と署名を一緒に送ります。

$$ \text{送信データ} = (C, S) $$

5. Bobが復号する
#

Bobは自分の秘密鍵で暗号文を復号します。

$$ M = C^{d_B} \bmod n_B $$

これでBobは元のメッセージMを得ます。

6. Bobが署名を検証する
#

BobはAliceの公開鍵を使って署名からハッシュ値を取り出します。

$$ H'(M) = S^{e_A} \bmod n_A $$

続いて、Bob自身も受信したメッセージからハッシュ値を計算します。

$$ H(M) = \operatorname{SHA-256}(M) $$

次の値が一致すれば、署名の検証に成功します。

$$ H(M) = H'(M) $$

一致しない場合は、メッセージが改ざんされた、署名が不正である、または別の鍵を使っている可能性があります。

7. 何が保証されるのか
#

  • Bobの公開鍵で暗号化することで、Bobの秘密鍵を持つ人だけが復号できます。これは機密性に関係します。
  • Aliceの秘密鍵で署名し、Aliceの公開鍵で検証することで、署名生成者とメッセージの完全性を確認できます。
  • ハッシュ関数を使うことで、長いメッセージ全体ではなく固定長のダイジェストへ署名できます。

ただし、署名が検証できたからといって、公開鍵が本当にAliceのものだとは限りません。公開鍵を証明書、信頼済みの鍵サーバー、指紋の照合などで正しく確認する必要があります。

まとめ
#

RSA暗号化は機密性、デジタル署名は完全性と送信元の検証を主な目的とします。大きなメッセージやファイルでは、通常はAES-GCMなどでデータを暗号化し、RSA-OAEPで共通鍵を保護するハイブリッド暗号を使います。署名にはRSA-PSSなど、用途に合った標準方式を選んでください。

関連記事


评论