公開鍵暗号・デジタル署名・デジタル証明書を体系的に理解する

## 概要
先日、デジタル証明書をインターン先で扱うことがありました。
そこで本記事では、アウトプットの意味を込めて、デジタル証明書の仕組みを解説します。またデジタル証明書を理解する上で必要となる、公開鍵暗号・デジタル署名の知識もあわせて解説してみます。
だいぶ自身の解釈や気持ちを重視して書いた部分もありますので、もし誤りを発見されたら暖かくご指摘いただけると幸いです。

## 目次
1. 暗号化・認証
2. 公開鍵暗号
3. デジタル署名
4. デジタル証明書 

### 1. 暗号化・認証
アリスがボブに、他の誰にも内容を知られないようにメッセージを送りたいとします。
ボブ以外には内容を知られては困るので、アリスはメッセージにAという処理を施し、ボブに送付します。メッセージを受け取ったボブは、メッセージにBという処理をしてメッセージを閲覧します。
このときの、Aを**暗号化**、Bを**復号化**といいます。
![Screen Shot 2022-10-28 at 14.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/79d4b2e7-49c4-2a50-f500-3b85ed69356f.png)
また、メッセージを受け取ったボブが、そのメッセージが本当にアリスから送られてきたものかを確認する処理を**認証**と言います。

### 2. 公開鍵暗号
公開鍵暗号では、「 暗号化の鍵」と「 復号化の鍵 」が異なる鍵となっています。アリスは「 暗号化の鍵 」を使ってメッセージを暗号化し、ボブは「 復号化の鍵 」を使って暗号文を復号化します。
「 暗号化の鍵 」のことを **公開鍵**といい、「 復号化の鍵 」のことを **秘密鍵** といいます。
これらからわかることを整理しておきます。
・アリスが必要なのは、**公開鍵**である
・ボブが必要なのは、**秘密鍵**である
・盗聴者に知られて困るのは、**秘密鍵**である
・**公開鍵**は、盗聴者に知られてもかまわない → 文字通り**公開しても何も危険が及ばない**

#### 公開鍵暗号の具体的な手順
①ボブが、公開鍵と秘密鍵(鍵ペア)を生成する。
②ボブが、公開鍵をアリスに送付する(公開する)。
③アリスが、公開鍵でメッセージを暗号化する。
④アリスが、暗号化したメッセージをボブに送る。
⑤ボブが、暗号化されたメッセージを秘密鍵で復号化する。

![Screen Shot 2022-10-28 at 14.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/54098fcf-6d47-99c2-c89d-25719c6c9527.png)
※ メッセージを送りたいのはアリスなのに、メッセージを受け取る側のボブからアクションを起こさなければいけないのは少し不思議に思うかもしれません。実際には、ボブに暗号通信をしたいアリスが、ボブの公開鍵を取ってくるというようなイメージになります。

以上の方法で、**お互いが正しい通信相手とやり取りを行っているという仮定の上で**、他の誰にも内容を知られることなく アリスからボブへメッセージを送ることができました。
めでたしめでたし...と一見思ってしまいかもしれませんが、以前問題は残っています。
上記の太字で示した仮定は、**通信を行っている相手が盗聴者であっても気づくことができない**という事実を含んでいます。上の例では、ボブは「メッセージ内容が暗号化されているので盗聴はされていない」ということはわかりますが、「そのメッセージを送ってきた人が本当にアリスか」まではわかりません。
そこで登場するのが、**デジタル署名**という暗号技術です。

### 3. デジタル署名
デジタル署名とは、“署名“という文字通り**このメッセージを送ってきたのは本当にその人か**を特定する暗号技術です。
アリスはメッセージにデジタル署名を行うことによって、
- そのメッセージは自分が送ったことを証明することができ(**認証**)、
- 逆に自分が送ったメッセージを「送っていない」と否定することはできません（**否認防止**）。

ボブはメッセージの署名を検証することによって、そのメッセージが本当にアリスによって送られたものかを判断できます。

デジタル署名では、当然署名する人のみが「 署名用の鍵 」を持ち、署名の検証者全員が「 検証用の鍵 」は持っている必要があります。この構図は先程説明した公開鍵暗号によく似ています。
少し考えてみると、
・署名用の鍵 → **秘密鍵**
・検証用の鍵 → **公開鍵**
として用いれば、デジタル署名を実現できることがわかります。
言い換えると、**公開鍵暗号方式と逆の鍵を使って処理を行えば、デジタル署名を実現できる**ことになります。


それでは、デジタル署名の手順を以下に示していきます。
①アリスが公開鍵と秘密鍵を生成する。(初回のみ)
②アリスが公開鍵をボブに送付する。
③アリスは秘密鍵でメッセージに署名する。
④アリスは署名したメッセージをボブに送信する。
⑤ボブは公開鍵でメッセージの署名を検証する。
![Screen Shot 2022-10-28 at 15.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/d4878869-3393-e709-a12b-82cd8ab227da.png)

以上の方法で、**その公開鍵がアリスのものであるという仮定の上で**ボブはメッセージを送ってきた相手が本当にアリスであることを確認できました。
これでやっとめでたしめでたし...と思ってしまいそうですが、問題はまだ残っています。
この仮定は、悪意のある第三者がアリスになりすまして、「 この公開鍵はアリスのものだよ〜」と送ってきたときに、その公開鍵が本当にアリスのものか見抜く方法がないという事実を含んでいます。
この問題を解決するのが**デジタル証明書**という技術です。
※ お待たせしました

### 4. デジタル証明書・認証局
それでは、いよいよ本記事の主旨であるデジタル証明書について説明します。
前節で説明したように、デジタル証明書とは「 この公開鍵は〇〇さんのものです！」ということを証明するものです。
では、どのようにこれを実現するでしょうか。
結論、これは2者間の関係では実現することができません。ではどうするかというと、双方が信用している第3者を登場させます。これが認証局です。
![Screen Shot 2022-10-28 at 15.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/2768d0a7-ce01-090a-8526-b1105b9ba204.png)

では、具体的に認証局がどのようにしてアリスの公開鍵の正当性を担保するのかをご説明します。
前述の通り、前提としてアリスとボブは認証局を既に信頼している( = 正しい認証局の公開鍵を持っている) とします。
① アリスが鍵ペアを作成します。（初回のみ）
![Screen Shot 2022-10-28 at 15.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/c76ab0d0-1928-3b9a-0208-e6718a3452f7.png)

② アリスは作成した公開鍵と身分証明を認証局へ送り、公開鍵への署名を認証局にリクエストします。
※ アリスは既に認証局の公開鍵を持っているので、この通信は暗号化することができます
![Screen Shot 2022-10-28 at 15.32.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/0cf69279-b41c-a4f7-74f1-988076a8481f.png)

③認証局は 身分証明などを用いてアリスが「正しいアリス」であることを確認できたら、公開鍵に署名をし、送り返します。
![Screen Shot 2022-10-28 at 17.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/09f12345-3c7e-59a5-b12d-480d4170c89c.png)
④ アリスは、認証局の署名付き公開鍵をボブに送ります。

![Screen Shot 2022-10-28 at 15.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/4a6c869e-09ff-ded0-815b-95f136a7e582.png)

⑤ ボブは認証局の公開鍵を使って、公開鍵についている署名を検証します。
正当な認証局が署名していることが確認できたら、その公開鍵を「本当にアリスのものである」と判断します。
![Screen Shot 2022-10-28 at 15.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498913/f8c6ee0d-c2b5-495a-615f-745b1418f838.png)
以上で、ボブはアリスを「正しいアリス」であると認識し、「正しいアリスの公開鍵」を手に入れることはできました。同様の手順をボブが行うことで、アリスはボブの正しい公開鍵を手に入れることができます。
これらの準備をへて晴れて、ボブはアリスから送られてきたメッセージに対して、
- 本当にアリスから送られてきたか
- 内容が改ざんされていないか

を検証することができます。

以上の方法で、アリスとボブが認証局を既に信頼している という仮定の上で、2人は安全に公開鍵を交換することができました。
このように公開鍵暗号に基づく暗号化・認証を行う基盤を PKI ( Public Key Infrastructure : 公開鍵基盤 ) といいます。

参考
- [暗号技術入門 第3版　秘密の国のアリス](https://www.amazon.co.jp/%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E7%A7%98%E5%AF%86%E3%81%AE%E5%9B%BD%E3%81%AE%E3%82%A2%E3%83%AA%E3%82%B9-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B015643CPE)