暗号化と電子署名と証明書

暗号化と電子署名と証明書の自分用メモ

---

# 用語
## 秘密鍵
- 1つだけ存在し、外部に漏らしてはいけない
- 秘密鍵から公開鍵を生成できる
- 秘密鍵を使ってデータを変換できる
- 公開鍵で変換されたデータを復元できる

## 公開鍵
- 複数存在し、外部に公開する
- 公開鍵から秘密鍵を生成することはできない
- 公開鍵を使ってデータを変換できる
- 秘密鍵で変換されたデータを復元できる

## ハッシュ化
- データに対して一意の文字列を生成すること
- データの中身が1byteでも変わると生成される文字列も変わる
- どのPCでハッシュ化しても同じデータから同じ文字列が生成される

## ダイジェスト
- データをハッシュ化した文字列

# 暗号化
- 送信内容を第三者に読み取られなくする技術
- 受信者だけがデータを読み取ることができる
- 前提
    - 送信者側に公開鍵が配られ、受信者が秘密鍵をもつ
- **改ざんについては保証しない**

## 流れ
1. 送信者はデータを公開鍵で暗号化する
2. 送信者は暗号化されたデータを受信者に送信する
3. 受信者は暗号化されたデータを秘密鍵で復号化する  
   　※復号できたとしてもしても送信者が送ったデータであることは保証されない

![key-暗号化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/d17bc351-5441-95cb-29f8-be908279dc49.png)


# 電子署名
- 送信内容が改ざんされたとき、受信者が分かるようにする技術
    - 受信者は署名検証することで改ざんされていないことを確認できる
- 前提
    - 送信者が秘密鍵と証明書をもつ
    - 受信者は中間証明書をもつ
- **送信内容は暗号化されず第三者でも読み取れる**

## 証明書
- CA署名付き公開鍵のこと

## CA
- 認証局のこと
- 公開鍵が正しいものであると保証する第三者機関
    - 公開鍵の持ち主の身元を保証する組織ではない
- 認証局も秘密鍵と公開鍵を持っている（CA秘密鍵、CA公開鍵）
- 閉ざされた環境では自身が認証局となることも可能

## 中間証明書
- CA署名付きCA公開鍵のこと
- 署名したCAと公開鍵をもつCAは別機関（署名したCAが上位）

## 署名
- 公開鍵のダイジェストを秘密鍵で変換したもの

## 署名検証
- 公開鍵をハッシュ化するとダイジェストが得られる
    - ハッシュ化は誰でも可能
- ダイジェストをCA秘密鍵で変換するとCA署名が得られる
    - CA署名はCA秘密鍵を持っている認証局しか発行できない
- CA署名をCA公開鍵で変換するとダイジェストが得られる
    - CA公開鍵は誰でも利用可能
- CA署名とCA公開鍵、公開鍵があれば誰でも検証できる
    - ダイジェストが一致することを確認する
        - 一致する場合
            - 公開鍵とCA署名生成時に基となった公開鍵は同じものといえる
        - 不一致の場合
            - CA署名の基となっている公開鍵と異なる公開鍵をハッシュ化している
            - CA秘密鍵から生成されていないCA公開鍵でCA署名を変換している

![key-ダイジェスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/6a1a742e-351e-a76f-d11d-a6d656373ed4.png)


## 流れ
1. 送信者はデータをハッシュ化してダイジェストを得る
1. 送信者は秘密鍵を用いて、ダイジェストから署名を生成する
1. 送信者はCSR（データ、署名、証明書）を受信者に送信する  
   　※平文データを送信しているため、第三者に盗み見される可能性あり
1. 受信者は証明書から公開鍵を取り出して、ハッシュ化してダイジェストを得る
1. 受信者はCA公開鍵を用いて、CA署名からダイジェストを得る
1. 得た2つのダイジェストを比較し、差異がないことを確認する  
   　※差異がある場合、公開鍵が改ざんされていると判断
1. 受信者はデータをハッシュ化してダイジェストを得る
1. 受信者は公開鍵を用いて、署名からダイジェストを得る
1. 得た2つのダイジェストを比較し、差異がないことを確認する  
   　※差異がある場合、平文データが改ざんされている可能性あり
   　※差異がある場合、送信者が誰かの証明書を利用している（なりすまし）可能性あり

![key-電子署名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/64e5c745-e1d4-710e-8066-f90e0fce9320.png)


# 証明書発行
- 送信者が認証局に自身の公開鍵をメール等で送付し、発行してもらう
- 認証局は証明書と中間証明書を送信者に返す
- 送信者は中間証明書を受信者に配布する

## 流れ
1. 送信者は秘密鍵から公開鍵を生成する
1. 送信者は発行対象者情報をハッシュ化してダイジェストを得る
1. 送信者は秘密鍵を用いて、ダイジェストから署名を生成する
1. 送信者はCSRを認証局に送付する
1. 認証局は発行対象者情報をハッシュ化してダイジェストを得る
1. 認証局は公開鍵を用いて、署名からダイジェストを得る
1. 得た2つのダイジェストを比較し、差異がないことを確認する
1. 認証局は公開鍵をハッシュ化してダイジェストを得る
1. 認証局はCA秘密鍵を用いて、ダイジェストからCA署名を生成する
1. 認証局は証明書と中間証明書を送信者に送付する
1. 送信者は受信者に中間証明書を配布する

![key-証明書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/1b6c88ed-81bf-b6a3-1b90-75c88f72509d.png)


# 中間（CA）証明書発行
- 認証局の証明書も同様に発行される
- 認証局は発行した証明書とともに自身の中間証明書を送付する
- ルート証明書はブラウザにプリインストールされるなど、別の枠組みで配布される

## ルート証明書
- 公開鍵をもつCAが自身で署名したCA署名付きCA公開鍵のこと


## 流れ
1. 認証局は秘密鍵から公開鍵を生成する
1. 認証局は発行対象者情報をハッシュ化してダイジェストを得る
1. 認証局は秘密鍵を用いて、ダイジェストから署名を生成する
1. 認証局はCSRをルート認証局に送付する
1. ルート認証局は発行対象者情報をハッシュ化してダイジェストを得る
1. ルート認証局は公開鍵を用いて、署名からダイジェストを得る
1. 得た2つのダイジェストを比較し、差異がないことを確認する
1. ルート認証局は公開鍵をハッシュ化してダイジェストを得る
1. ルート認証局はルート秘密鍵を用いて、ダイジェストからルート署名を生成する
1. ルート認証局は中間証明書を認証局に送付する

![key-ルート証明書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/a016b885-10c6-3273-1d93-03a62c5db2c7.png)

# 感想
- 暗号化、改ざん防止を両方やる場合はどうするのか？
    - 暗号したデータに署名して送信する……？