以下の式は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など、用途に合った標準方式を選んでください。


