【基本情報】デジタル署名は「鍵4本」と「署名生成・検証」で考えるとスッキリ分かる
はじめに
基本情報技術者試験(FE)の勉強中、次の過去問でつまずきました。
令和4年度 問37
発信者がメッセージのハッシュ値からデジタル署名を生成するのに使う鍵はどれか。
選択肢は次の4つです。
- ア:受信者の公開鍵
- イ:受信者の秘密鍵
- ウ:発信者の公開鍵
- エ:発信者の秘密鍵
答えは エ:発信者の秘密鍵 です。
「秘密鍵を使いそうだ」というところまでは分かっても、
「受信者の秘密鍵」と「発信者の秘密鍵」で迷いました。
原因は、頭の中で鍵を「公開鍵と秘密鍵の2本」だけで考えていたことです。
しかし、この問題では登場人物が2人います。
- 発信者
- 受信者
登場人物が2人いるなら、それぞれが公開鍵と秘密鍵のペアを持っています。
つまり、鍵は全部で 4本 あります。
ここが見えると、選択肢の意味がかなり整理しやすくなります。
まず分けるべきこと:暗号化とデジタル署名は別物
公開鍵暗号やデジタル署名を学ぶときに、最初に混乱しやすい点があります。
それは、次の2つを同じものとして考えてしまうことです。
- 公開鍵暗号による暗号化・復号
- デジタル署名による署名生成・署名検証
どちらも「公開鍵」と「秘密鍵」というペアの鍵を使います。
しかし、目的が違います。
公開鍵暗号の場合
公開鍵暗号で秘密のメッセージを送りたい場合、基本的には次のように考えます。
- 受信者の公開鍵で暗号化する
- 受信者の秘密鍵で復号する
この目的は、受信者だけが読めるようにすることです。
つまり、中心にあるのは「秘密に送ること」です。
デジタル署名の場合
一方、デジタル署名では次のように考えます。
- 発信者の秘密鍵で署名を生成する
- 発信者の公開鍵で署名を検証する
この目的は、その署名が発信者の秘密鍵によって作られたものかを確認することです。
つまり、中心にあるのは「誰が作った署名か」と「内容が変わっていないか」を確認することです。
ここで大事なのは、デジタル署名を
「秘密鍵で暗号化して、公開鍵で復号するもの」
と考えないことです。
正確には、デジタル署名では 署名生成 と 署名検証 を行います。
登場人物は2人、鍵は4本
この問題では、発信者と受信者が登場します。
それぞれが公開鍵と秘密鍵のペアを持つので、鍵は次の4本になります。
| 持ち主 | 公開鍵 | 秘密鍵 |
|---|---|---|
| 発信者 | 発信者の公開鍵(ウ) | 発信者の秘密鍵(エ) |
| 受信者 | 受信者の公開鍵(ア) | 受信者の秘密鍵(イ) |
選択肢ア〜エは、この4本の鍵を並べていたわけです。
ここに気づくと、問題の見通しがよくなります。
なぜ「発信者の秘密鍵」なのか
判断の軸はシンプルです。
署名は「本人だけが作れる」ものでないと、証拠にならない。
デジタル署名は、発信者が作るものです。
そのため、署名を作るときに使うのは、発信者だけが使える鍵でなければなりません。
各選択肢を見ていきます。
ア:受信者の公開鍵
受信者の公開鍵は、受信者に向けて暗号化するときなどに使われる鍵です。
しかし、今回の目的は「受信者だけが読めるようにすること」ではありません。
今回の目的は、発信者が署名を作ることです。
そのため、受信者の公開鍵は使いません。
イ:受信者の秘密鍵
受信者の秘密鍵は、受信者だけが持つ鍵です。
発信者が勝手に使える鍵ではありません。
また、仮に受信者の秘密鍵で何かを作ったとしても、それは「発信者が作った証拠」にはなりません。
そのため、これも不適切です。
ウ:発信者の公開鍵
発信者の公開鍵は、誰でも持つことができる鍵です。
公開鍵で署名を作れることにしてしまうと、誰でも同じように署名を作れてしまいます。
それでは「発信者本人だけが作れる証拠」になりません。
発信者の公開鍵は、署名を作るためではなく、署名を検証するために使います。
エ:発信者の秘密鍵
発信者の秘密鍵は、発信者だけが持つ鍵です。
そのため、この鍵を使って作られた署名は、発信者の秘密鍵を持つ者だけが作れるものになります。
したがって、正解は エ:発信者の秘密鍵 です。
そもそもデジタル署名とは何か
デジタル署名は、よく次のように説明されることがあります。
デジタル署名とは、ハッシュ値を発信者の秘密鍵で暗号化したもの。
この説明は、試験勉強の入口ではイメージしやすいかもしれません。
しかし、厳密にはあまりよい説明ではありません。
なぜなら、デジタル署名は本来、単なる「暗号化・復号」ではなく、
署名生成・署名検証 という別の仕組みだからです。
より安全に説明するなら、次のようになります。
デジタル署名とは、発信者が自分の秘密鍵を使って、メッセージまたはそのハッシュ値に対して生成する検証可能なデータである。
そして受信者は、発信者の公開鍵を使って、その署名が正しいかを検証します。
つまり、次のように理解すると分かりやすいです。
- 発信者の秘密鍵:署名を作るために使う
- 発信者の公開鍵:署名を検証するために使う
ここで大事なのは、
「秘密鍵で暗号化して、公開鍵で復号する」
と覚えることではありません。
そうではなく、
秘密鍵を持つ者だけが署名を作ることができ、公開鍵を使えば誰でもその署名を検証できる。
と考える方が正確です。
なぜ「メッセージ」ではなく「ハッシュ値」なのか
問題文には「メッセージのハッシュ値からデジタル署名を生成する」とあります。
では、なぜメッセージ本文そのものではなく、ハッシュ値を使うのでしょうか。
ハッシュ値には、主に次の特徴があります。
- 長いデータでも、固定長の短い値に変換できる
- 元のデータが少しでも変わると、ハッシュ値も大きく変わる
そのため、長いメッセージ全体を直接扱うよりも、ハッシュ値を使った方が効率的です。
ただし、ここで注意が必要です。
「改ざん検知はハッシュがあるからできる」とだけ考えると、少し不正確です。
ハッシュ値だけでは、改ざん検知としては不十分です。
なぜなら、攻撃者がメッセージを改ざんしたあと、その改ざん後のメッセージから新しいハッシュ値を計算することもできてしまうからです。
重要なのは、ハッシュ値が 発信者の秘密鍵による署名 と結びついていることです。
つまり、流れとしては次のようになります。
- 発信者がメッセージからハッシュ値を作る
- 発信者が自分の秘密鍵を使って署名を生成する
- 受信者が受け取ったメッセージから、もう一度ハッシュ値を作る
- 発信者の公開鍵を使って、署名がそのメッセージに対して正しいか検証する
もしメッセージが途中で改ざんされていれば、検証は失敗します。
つまり、改ざん検知はハッシュ単独の力ではなく、
ハッシュとデジタル署名の仕組みが組み合わさることで実現される
と考えると分かりやすいです。
検証では何をしているのか
デジタル署名の検証は、単純に
「公開鍵で署名を復号して、中のハッシュ値を取り出す」
と説明されることがあります。
しかし、この説明も一般化すると危険です。
デジタル署名の方式にはいろいろな種類があり、すべてが「公開鍵で復号して中身を取り出す」という形ではありません。
そのため、一般向けには次のように理解する方が安全です。
受信者は、発信者の公開鍵・受け取ったメッセージ・署名を使って、署名が正しいかを検証する。
検証結果は基本的に、
- 正しい
- 正しくない
のどちらかです。
ここで確認しているのは、主に次の2点です。
1. 発信者の秘密鍵を持つ者が署名を作ったこと
発信者の公開鍵で検証できる署名であれば、対応する秘密鍵を使って作られた署名だと判断できます。
ただし、ここでいう「発信者本人」という判断には前提があります。
その公開鍵が本当に発信者本人のものだと信頼できる必要があります。
公開鍵と本人の対応関係が間違っていれば、署名の検証結果だけで現実の本人確認まで完了するわけではありません。
2. メッセージが改ざんされていないこと
署名を作ったときのメッセージと、受信者が受け取ったメッセージが違っていれば、検証は失敗します。
そのため、デジタル署名によって、メッセージの完全性を確認できます。
この問題の考え方
もう一度、問題を見ます。
発信者がメッセージのハッシュ値からデジタル署名を生成するのに使う鍵はどれか。
ここで問われているのは、暗号化ではありません。
問われているのは、デジタル署名を生成する鍵 です。
デジタル署名を生成するのは発信者です。
そして、署名は発信者だけが作れるものでなければなりません。
したがって、使う鍵は 発信者の秘密鍵 です。
よって答えは、
エ:発信者の秘密鍵
です。
まとめ
デジタル署名を考えるときは、まず「暗号化・復号」と「署名生成・署名検証」を分けて考えることが大切です。
公開鍵暗号による暗号化では、主に次のように考えます。
- 受信者の公開鍵で暗号化する
- 受信者の秘密鍵で復号する
一方、デジタル署名では、次のように考えます。
- 発信者の秘密鍵で署名を生成する
- 発信者の公開鍵で署名を検証する
この問題で鍵が4本出てくるのは、発信者と受信者がそれぞれ鍵ペアを持っているからです。
| 目的 | 使う鍵 |
|---|---|
| 発信者が署名を作る | 発信者の秘密鍵 |
| 受信者が署名を検証する | 発信者の公開鍵 |
| 受信者だけに読めるよう暗号化する | 受信者の公開鍵 |
| 受信者が復号する | 受信者の秘密鍵 |
今回の問題は「署名を生成する鍵」を聞いています。
したがって、答えは 発信者の秘密鍵 です。
最後に、デジタル署名は次のように覚えると混乱しにくいです。
デジタル署名は、秘密鍵を持つ者だけが作れる署名を、対応する公開鍵で検証する仕組みである。
このように考えると、
「受信者の秘密鍵」と「発信者の秘密鍵」で迷いにくくなります。