【Webエンジニアの求人なのに】Day2. 公開鍵暗号を知らない


##はじめに
今週末も【Webエンジニアの求人なのに】シリーズです。
今日は「公開鍵暗号を知らない」をテーマにまとめていきたいと思います。
基本的に私自身が初心者なので自分の考え方を述べるというやり方ではなく、いろいろな参考サイトをもとに回答をつくるという流れです。

##公開鍵暗号を知らない

![3551F8E9-7F7E-4375-B809-9ACF4302652D[373].png](https://qiita-image-store.s3.amazonaws.com/0/256858/8c3cdfee-37f6-e3e0-11a3-b0d72f1195fe.png)
まずこの記事を書くきっかけになったツイートです。
実際に私はこのすべてについて理解できていませんので、一つずつ勉強しようと思いました。

前回はこちらの記事です。
[【Webエンジニアの求人なのに】Day1.GETとPOSTの違い](https://qiita.com/_ayk_study/items/b2537c5f0fcaaa7ddf08)

今日は「公開鍵暗号」についてまとめたいと思います。

##公開鍵とは
[SSHなるものをよくわからずに使っている人のための手引書](https://qiita.com/kenju/items/b09199c4b3e7203a2867)から引用します。


>SSHとは、セキュアな通信を行うためのプロトコルです。
・・・
>このSSHを使うと、リモートサーバに安全にログインできたり、
ファイルをセキュアに送受信することができたりします。
・・・
>SSHは「Secure Shell」の訳で、リモートシェルに特化しています。
公開鍵認証という仕組みを用いて、セキュアな通信を実現しています。

※プロトコル…コンピューター同士が通信をする際の手順や規約などの約束事。ネットワークでコンピューターが使う言語のようなもので、双方が理解できる同じプロトコルを使わないと通信は成立しない。（[プロトコル
ASCII.jpデジタル用語辞典の解説](https://kotobank.jp/word/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB-8535)）

ここではじめて「公開鍵」という言葉がでてきました。
SSHという言葉がはじめて出てきましたが、まずは公開鍵について詳しくまとめてみたいと思います。


##公開鍵「暗号」とは

>双方が同じ鍵を使う、共通鍵暗号方式だと、送る側と受け取る側がいつ、どこで、どのように鍵を安全に受け渡すかが問題になる。
その問題を解決するため、「閉める鍵と開ける鍵を別々にすれば、鍵をやりとりしなくて済む」というものがあった。送る方は、最初から閉める鍵を持っておき、受け取る方は、最初から開ける鍵を持っておけば、鍵をやり取りする必要はありません。
しかし、ふたつの鍵がまったく無関係では、閉める鍵で閉めたものを、開ける鍵で開けることができません。なんらかの関係はあるけど、別の鍵。そんな都合のいい鍵を見つける必要がありました。
イギリス政府通信本部のエリスの後輩であるクリフォード・コックスは、そのような都合のいい鍵のペアを作るには、一方向関数を使えばいいと思いつきました。

→**このような一方向関数を使って公開鍵と秘密鍵の２つの鍵のペアを作るのが公開鍵暗号の基本になる。**


引用元：[4枚の図解でわかる公開鍵暗号](https://persol-tech-s.co.jp/corporate/security/article.html?id=26)



##公開鍵暗号はなぜ必要か
[AdminWeb:VPSサービスの使い方：暗号化の必要性](https://www.adminweb.jp/web-service/ssh/index4.html#section1)から引用すると、

>インターネットを経由して情報のやり取りを行う場合、悪意のある第三者に情報を盗み見される危険性があるためです。
>そこで重要なデータについては送信する前に暗号化を行います。もし途中で悪意のある第三者にデータを盗み見されたとしてもデータは暗号化されているため悪意のある第三者はデータの内容を見ることは出来ません。



##SSHとは
次にSSHについてみていきましょう。

[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](https://qiita.com/tag1216/items/5d06bad7468f731f590e)が非常にわかりやすかったです。

>暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。
SSHでは以下の点で従来のTelnetより安全な通信が行える。1
パスワードやデータを暗号化して通信する。
クライアントがサーバーに接続する時に、接続先が意図しないサーバーに誘導されていないか厳密にチェックする。

一言でいうと、SSHは安全に通信するための手段ということでしょうか。そして安全に通信するための手段を実現する方法として公開鍵なるものがあるということでしょうか。

また、SSHの認証方式にはパスワード認証方式と公開鍵認証方式
があるが、公開鍵認証方式のほうがセキュリティ的には安全だそう。


##鍵交換認証方式について
[鍵交換方式による認証](http://www14.plala.or.jp/campus-note/vine_linux/server_ssh/ssh_key.html)から引用。

>鍵交換方式の認証は公開鍵暗号方式を利用した認証であり、パスワードがネットワーク上を流れる事はありません。 よって、鍵が外部に漏れなければパスワード認証よりもセキュリティを高める事が可能になります。

ちょっとごちゃごちゃしますが、鍵交換認証方式は公開鍵暗号方式を利用したものということがわかりました。

公開鍵認証の仕組みは以下のとおり。（同サイトから引用）


![ssh_key1.png](https://qiita-image-store.s3.amazonaws.com/0/256858/673a84d2-875d-3920-7779-da5e460348cc.png)


[SSHの仕組み!ぼんやりとした理解だったものをすっきりさせようの会](http://nigohiroki.hatenablog.com/entry/2013/08/18/221434)及び[【SSHの仕組み】を図解で簡単に解説してみる](http://webrogram.com/series/ssh/ssh_image)から引用すると、

１　公開鍵と秘密鍵を作成する。




２　公開鍵をサーバーに渡す
この時点で自分のPCには、秘密鍵、サーバー側には公開鍵がある状態。




３　サーバー側で公開鍵とユーザーを結びつける


４　PCから接続要求が来ると、サーバー側は本当に接続していいPCなのかを判断するため、サーバー側で乱数を発生し、公開鍵とその乱数で暗号を作成。作成した暗号をPC側に渡す。

５　サーバー側は、暗号生成と同時に、乱数を利用し、ハッシュ値を生成する。※後に認証で使用。

※乱数とは…ランダムで適当な数字のこと。不規則な数字のこと。（引用元：[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1461.html)）
※ハッシュ値とは、「データを投入して生成される数値のこと」(引用元：[たぶん世界一わかりやすい ハッシュ(hash)の説明](https://www.parte.co.jp/hash/index.html)）


６　PC側で暗号を受け取ると、PC側は、パスフレーズで秘密鍵を復号。復号すると、サーバー側で生成した乱数を発生させ、取り出すことができる。
また、その乱数からハッシュ値を生成し、サーバー側にハッシュ値を送る。

※　暗号化、復号とは、
>暗号化は、クレジットカードの番号やパスワードなどの秘密情報を暗号化し、「jd9w%siew0=oha」みたいな文字列することで、元のデータをわからなくすること。
復号化は、「jd9w%siew0=oha」を元のデータに戻すこと。

（引用元：[暗号化と復号化をできるだけ簡単に詳しく説明してみる。](https://qiita.com/SHOSI/items/2b3178e0790ccf2fce6d)）



７　PC側から送られてきたハッシュ値とサーバー側でもっているハッシュ値が一致したら認証成功。


このような流れでログインが完了する。

すごい流れですね・・難しくて理解できているのかできていないのかわかりません（理解できていない。）
特にハッシュ関数や乱数とかが実際に数式を解読する部品になっているのだと思いますが、今回はそこまで詳しくは解説しないことにします。
→なぜこのようなことが可能なのか、実際に数式を使って説明しているサイト（引用元：[4枚の図解でわかる公開鍵暗号](https://persol-tech-s.co.jp/corporate/security/article.html?id=26)
)もありました。


※秘密鍵・公開鍵やSSHについて詳しく解説しているサイトもほかに多数あります。
・[公開鍵暗号について理解が足りていなかったのでメモ](http://d.hatena.ne.jp/kasei_san/20120329/p1)
・[妻に公開鍵暗号を教えてみた](http://d.hatena.ne.jp/nishiohirokazu/20140809/1407556873)
・[SSH通信って、結局何してるの？](https://qiita.com/naoki_mochizuki/items/aea14a65a4a513e4816f)



##公開鍵暗号とはどのようなものか？への回答（案）

問「公開鍵暗号とはどのようなものですか？」
答「公開鍵暗号とは、一方向関数を使って公開鍵（暗号鍵）と秘密鍵（復号鍵）の鍵のペアを生成し、公開鍵により暗号文を生成し、秘密鍵を知る本人にしか復号できないよう、暗号化することである。」



##ちょっと一息～コンピューターの父アラン・チューリング～
公開鍵暗号について調べていたら公開鍵を開発したイギリスの政府機関の前身はあのアランチューリングもメンバーにいたエニグマの解読チームだったようです。

アラン・チューリングはナチス・ドイツの最強と呼ばれた「エニグマ」を解読したチューリングマシーン（現在ではコンピューターと呼ばれる）を開発した天才数学者のイギリス人。
ただ、当時LGBTなどの理解がない中で、このような功績を残したのにも関わらず、同性愛の罪で警察に逮捕され、最後は自殺により彼の人生は幕を閉じました。死後６０年以上たち、２０１３年にエリザベス女王に恩赦を受けました。

最近映画「イミテーションゲーム」で見てすごくおもしろかったので、おっ！と思いました！
このようなサイトもありました[「天才アラン・チューリングの栄光と悲劇」2017年9月](http://gagbot.net/blog/blog21)

##最後に
いかがでしょうか。
少しシンプルな回答にして逃げた感じはありますが、もっとこうしたほうが正しい回答だ、相手に伝わる回答だというご指摘がありましたらコメントをください。


次回は「OSI参照モデルを知らない」について調べたいと思います。
また来週 ^^) _旦~~