公開鍵暗号に関するQ&A

# はじめに
本記事は、[初心者がSSHについて学ぶ(´･ω･`)](/Pana/items/70cc74cd20c8b5b4fe15)のコメント欄で行われた、公開鍵暗号に関するやり取りと、そこからの派生となる話題をQ&A形式でざっくりまとめたものです。
※コメント欄で続けて脱線になるのを避けるという意図もあります。

# Q&A
## Q1: 秘密鍵と公開鍵の特徴
**Q: 秘密鍵と公開鍵は、以下の特徴を持っていると考えて良いか**

* 相手の公開鍵でデータを暗号化して送付し、相手は自身の秘密鍵で復号する
* 自分の秘密鍵でデータを暗号化して送付し、相手はこちらの公開鍵で復号する
* いずれにせよ秘密鍵自体を提示することなくデータを遣り取りする

**A: 一部を除いて誤りである**

* 問題ない点
    * 「秘密鍵自体を提示することなく」はその通りである
* 誤りである点
    * 「暗号化・復号」という機能に囚われている点が問題である。
    * 公開鍵暗号は複数の機能に分かれた技術の総称であり、秘密鍵・公開鍵で何を行うかは、その技術が何の機能に分類されるかによる。  
      → 機能一覧については、拙記事[2つの公開鍵暗号(公開鍵暗号の基礎知識)の「概要」](/angel_p_57/items/897bf94160be8d637585#概要)以降を参照のこと
* 注意を要する点
    * 「公開鍵でデータを暗号化・秘密鍵で復号」は暗号化(守秘)の機能に限っては正しい。  
      参考: [2つの公開鍵暗号(公開鍵暗号の基礎知識)](/angel_p_57/items/897bf94160be8d637585#狭義公開鍵暗号)の「狭義公開鍵暗号」
    * ただし、公開鍵・秘密鍵→暗号化と短絡してしまうようでは他の機能が目に入らなくなるので問題がある。
    * 加えて、公開鍵暗号の暗号化(守秘)はあまり一般に使われるわけではない。この機能を代表的に扱うのは技術全体の俯瞰という面で適切と言えない。

## Q2: 署名の仕組み

**Q: 署名とは、秘密鍵・公開鍵を使った以下の処理を行うものか**

* 署名生成時には、自分の秘密鍵での暗号化を行う
* 署名検証時には、相手がこちらの公開鍵で復号を行う

**A: 誤りである**

* 問題点
    * 暗号化・復号という「暗号化(守秘)」の機能と、署名・検証という「電子署名」の機能を混同している。
* 補足
    * 署名の機能自体を誤解している人は恐らく少ないと思われる。  
      → 機能については、[2つの公開鍵暗号(公開鍵暗号の基礎知識)の「電子署名」](/angel_p_57/items/897bf94160be8d637585#電子署名)を参照のこと
    * しかし、そこで署名処理の実体を「暗号化」、検証処理の実体を「復号」と捉えるのは誤りである。
    * この「誤り」は、仕組みを詳細に理解しようとして却って「蛇足」となる典型である。もし詳細に踏み込みたければ、それは数学の世界に挑むしかない。  
      ※参考: [電子署名DSA/ECDSAの数的構造](https://qiita.com/angel_p_57/items/f2350f2ba729dc2c1d2e)など  
      ※詳細に踏み込むことが必ずしも必要とは考えていないことに注意

## Q3: 共通鍵のやり取り

**Q: SSHの通信において、共通鍵のやり取りのために、公開鍵による暗号化は行わないのか**

**A: ほぼ行わない**

* 詳細
    * SSHにおいて共通鍵の元となるデータを共有するために用いるのは「鍵交換」に分類される公開鍵暗号である。  
      ※参考: [2つの公開鍵暗号(公開鍵暗号の基礎知識)](/angel_p_57/items/897bf94160be8d637585#鍵交換)の「鍵交換」
    * ただし、「鍵交換」を「暗号化(守秘)」で代替する方式はある。そのため「絶対ない」とは言えない。
    * そうは言っても、メジャーな実装でサポートされていない上、現状では技術的メリットが薄く、ほぼ使われない。
* 補足
    * ちなみにこれは、SSHv2の話である。今では使われなくなったSSHv1はまた仕組みが違う。( 詳細は割愛 )
    * なお類似プロトコルであるSSL/TLSにおいても、公開鍵暗号による「暗号化(守秘)」は、今日ではほぼ使われない。
    * ただし(現在も現役である)旧規格TLSv1.2まで、暗号化(守秘)を、鍵交換・認証に兼用する方式はあり、以前はそれなりに使われていた。

## Q4: 公開鍵暗号の説明

**Q: 公開鍵暗号を「公開鍵で暗号化、秘密鍵で復号」と説明するのは適切か**

**A: 条件付きで可、ただし推奨はしない**

* 条件とは
    * 暗号化(守秘)の機能が「複数ある機能分類の一部であること」を事前に明示すること  
      → 暗号化のイメージが固定されると、他の機能の理解に支障をきたすため  
      ※参考: [SSL/TLSの見落とされがちな「認証」という基本機能](/angel_p_57/items/dcb12a6a864f9aeba427) 
    * その応用事例を把握し説明できるようにすること  
      → ただし、SSHやSSL/TLSでほぼ使われない以上、状況は厳しい。
* 推奨しない理由
    * ゼロから説明するのであれば、公開鍵暗号の一分類である「電子署名」の方が向いていると考えているため。
    * 暗号化(守秘)の応用事例でポピュラーなもの(旧SSL/TLS,PGP,S/MIME等)でも、あくまで「鍵交換」の代替なので、せめて「鍵交換」の方を優先するのが自然だから。  
     ※暗号化(守秘)の説明で唯一長所と思えるのは、せいぜい「共通鍵暗号と直接に対比ができて印象深い」ことくらい

## Q5: 電子署名から説明する理由

**Q: Q4において「ゼロから説明するのであれば『電子署名』」とした理由は**

**A: 以下の複数の点が挙げられる**

* 暗号化に囚われない機能の把握
    * 公開鍵暗号において一番の基本は「2種類の鍵の存在」である。
    * そこで暗号化(守秘)から入ると、暗号という言葉とあいまって、どうしても暗号化にイメージが固定されがちである
    * そのため「2種類の鍵の存在」の一例として、暗号化でない機能から入ることにメリットがあると考えられる
* 使われる場面の多さ
    * 一般に目に触れる「公開鍵」はそのほとんどが「電子署名」(の検証)用途である。  
      → SSL/TLSの(公開鍵)証明書のほとんど、SSHの公開鍵認証用の鍵、暗号通貨等
    * 一番ポピュラーな技術を優先的に説明するのは、十分合理的と考えられる。
* 現実との対比のし易さ
    * 「電子署名」は、現実の「印鑑」での喩えに非常にマッチしている。  
      → 「はんこ」が秘密鍵、「印影のサンプル」が公開鍵、また「印影のサンプル」の載った「印鑑登録証明」が公開鍵証明書に相当
    * 「コード署名」等の、典型的な署名の用法のみならず、公開鍵認証のような認証についても「印鑑」の喩えで説明が可能である。  
      → 銀行の手続きで、「申請書類に銀行印で押印」することで、本人からの手続き依頼であることを確認しているのと、構図は全く同じ  
      ※ただし「電子署名」単独で認証は成立しないので、その点は要注意
    * 「鍵交換」「暗号化(守秘)」のような喩えがし辛い機能に比べると、説明をする上で大きく有利な点と考えることができる。

## Q6: 共通鍵暗号との連携

**Q: 「暗号化(守秘)」を持ち出さないとすれば、共通鍵暗号と連携する点はどのように説明するのが適切か**

**A: 「鍵交換」を説明すれば十分**

* 理由
    * 歴史的にも、公開鍵暗号が最初に発表された時は「鍵交換」+「共通鍵暗号」で暗号化するアイデアが示されていた。
    * 「暗号化(守秘)」を使うにしても「鍵交換」の代替でしかない。
    * いずれにせよ暗号化に終始して「認証」が蔑ろにならないよう注意は必要。
* 旧技術の説明をする上での注意
    * Q3で「TLSv1.2まで、暗号化(守秘)を、鍵交換・認証に兼用する方式はあり」と言った通り、歴史的上の話として、暗号化(守秘)を説明するのはありうる。
    * ただし「過去の1方式」という点を明示するよう注意が必要。
    * また、こちらも「認証」の機能の説明が蔑ろにならないように注意が必要。  
      ※その意味で、例えば結城さんの「暗号技術入門」をはじめとする、一般的なSSL/TLSの説明は危うい。( 証明書やPKIの話は、認証としては実は的を外している )

# おわりに
特に結論はありません。
なお、なにかしら質疑があれば、そのぶんQ&Aを増やしていくかも…?