暗号備忘録

#はじめに
ネットワークセキュリティを勉強する機会があったので
特に、<font color="red">「暗号」</font>についてざっくりまとめてみました

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/225251/2d9af5e1-5452-8b92-c48a-efe12f19f57e.jpeg)

#４つの問題
ネットワークセキュリティを考えるときに、以下の４つの問題を考えることが大切です

- 秘匿性：secrecy [機密性：confidentialityともいう]<br>
　⇨情報が第三者に渡らないようにすること
- 認証：authentication<br>
　⇨通信相手が誰かを確認するために用いる
- 否認防止：nonrepudiation<br>
　⇨署名を扱う、あとから主張を変更されることを防ぐ
- 完全性：integrity<br>
　⇨受けとったメッセージが通信相手からのもので、改ざんされていないことを確かめること<br><br>
![secrecy.jpeg](https://qiita-image-store.s3.amazonaws.com/0/225251/b99f9a17-4293-4b39-38fe-4936c1fab695.jpeg)

#いろいろな暗号
* <font color="red">対称暗号symmetric cryptography</font> ：暗号化と復号化の鍵が同じ
* <font color="red">公開鍵暗号public key cryptgraphy</font> ：暗号化と復号化の鍵が違う
* ハイブリッド暗号システム ：対称暗号と公開鍵暗号の組み合わせ
* <font color="red">一方向ハッシュ関数one way hash function</font> ：書き換え防止、ハッシュ値の一致で「完全性」を提供する
* <font color="red">メッセージ認証コードmessage anthetication code</font> ：期待する送信者かどうか確かめる、「完全性」だけでなく「認証」も提供する
* <font color="red">デジタル署名digital signature</font> ：「否認防止」のために文書などに施される。受信側はデジタル署名を検証verifyする
* <font color="red">疑似乱数生成器psesdo random number generator(PRNG)</font>
：鍵の生成に必要
* ステガノグラフィsteganography ：縦読みのようにメッセージの存在を隠す技法。暗号ではなく一度埋め込みが解明されると、すぐ内容がわかってしまう。電子透かしはこれに属する。
* 使い捨てパッドone time pad ：1917バーナムG.S Vernumによって考案される。平文とランダムなビット列とのXORをとる。単純な暗号だが復号化の際候補がいくつかありどれが正しい平文かわからない。1947にシャノンが数学的に'無条件に安全unconditionally secure'で'理論的に解読不能theoretically unbreakly'と証明。しかし平文とおなじビット長と安全な鍵が必要なため莫大なお金がかかり現実的ではない。だが大国同士のホットラインに使われることがあり、その際、鍵はエージェントが運ぶのだろう。アイデアはストリーム暗号に生きている。
* 量子暗号 ：1980Bennet,Brassardによって考案された。盗聴が不可能な仕組みである。(１)光子の偏光方向の正確な測定が原理的に不可能 (２)測定することで光子の状態が変化してしまう (１)(２)を利用して受信側が盗聴の有無を検出できる。

![認証.jpeg](https://qiita-image-store.s3.amazonaws.com/0/225251/500f1ab5-7786-0e3a-7fdc-53fe91806300.jpeg)


#対称暗号（共通鍵暗号）:DES
* DES (Data Encryption Standard)1977アメリカ連邦情報処理標準規格(FIPS)に採用される。
* 鍵のビット長は64ビット(7ビットおきに１ビットエラー検出が入る実質56ビット)、平文64ビットを暗号文64ビットにする。それ以上は暗号化を繰り返す(これをモードmodeという)
* 暗号化の構造:ファイステル(Horst Feistel)が作ったファイステルネットワークと呼ばれる、これをDESは使う。ワンステップをラウンドroundという。やり方は32ビットずつに分け、一方はそのまま、『もう一方』と『ラウンド関数と各ラウンドで生成されるサブ鍵とでつくるビット列』のXORをとり暗号化これを16回繰り返すのがDES。
* ファイステルネットワーク XORで暗号化しているのでラウンド関数にどんな関数でも使える。ラウンドが多くなっても問題がない。暗号化と復号化がサブ鍵が同じであれば全く同じ構造で実現できる。
* トリプルDES DESの３ラウンド分を１ラウンドにしたもの(鍵1,2,3がある)。３つとも違う鍵を使う、暗号化→復号化→暗号化の順、３つとも同じ鍵を使えば、DESとしても使える。鍵1,2が同じで鍵3だけ違うものをDES-EDE2という。鍵1,2,3が違うものをDES-EDE3という。現在でもICカードの標準規格のEMVでつかわれている。
* AES DESに変わる新たな対称暗号の標準規格。2000年NISTによりRijndaelラインダール(ベルギーの二人の研究者が考案)が選ばれた。
* 日本で暗号技術の評価をしてるのは暗号技術評価プロジェクト(CRYPTREC)

#公開鍵暗号
* 対称暗号より遅い
* 鍵配送問題key distribution problemを解決するのは以下の４つ
    * 公開鍵暗号
    * 鍵配布センター
    * 事前共有鍵
    * Diffei Hellman鍵交換→11章
* 歴史 1976DiffieとHellmanがアイデアを発表。1978RivestとShamirとAdlemanが公開鍵暗号アルゴリズムのRSAを発表。現在の標準規格を作った。
* 離散対数 例 7^□mod13=8 のような累乗の□を求めるのが離散対数。特に大きな数の離散対数を求めるアルゴリズムは見つかっていない。
* 離散対数はDiffie Hellman鍵交換や公開鍵アルゴリズムの一つのElGamal方式で使われている。
* RSAの構造 
    * 暗号文 =    平文^E  mod N
         平文     = 暗号文^D mod N  この簡単な形で求まる。
    1. N = p*q   p,qは素数
    2. L = lcm( p-1 , q-1 )   lcmは()内の最小公倍数を求める
    3. 1 < E < L , gcd( E , L ) = 1  EとLは互いに素(EとLは最大公約数が1)
    4. 1 < D < L , E*D mod L = 1
* 解読のためにはp,qが必要。だが今のところ大きな数Nの素因数分解を高速にするアルゴリズムは見つかっていない。
* 弱点 公開鍵の証明書がないと本当の公開鍵かわからない。
* 他の公開鍵暗号アルゴリズム
    * ElGamal方式
    * Rabin
    * 楕円曲線暗号eliptic curve cryptosystems:ECC
    
#一方向ハッシュ関数
* メッセージの改竄を検出するのが目的。メッセージからメッセージより短いハッシュ値を計算する。送信者のハッシュ値と受信者の計算した値の比較でわかる。
* ２つの異なるメッセージが同じハッシュ値をもつ(衝突collision)が、これを見つけるのが事実上困難である耐性を衝突耐性collision resistanceという。
* ハッシュ値から元のメッセージは復元できない。一方向ハッシュ関数は暗号ではないから復号化はできない。ハッシュ値を求めるときは一方向性が重要である。
* 一方向ハッシュ関数はpassword based encryption PBEという暗号化に使われる。
* メッセージ認証コードに一方向ハッシュ関数はつかわれる。メッセージ認証コードはSST/TLSでも使われる。
* デジタル署名に一方向ハッシュ関数は使われる。(ハッシュ値のデジタル署名なら短くて済む)→
* 疑似乱数生成器で一方向ハッシュ関数は使われる。一方向性を利用して過去の乱数からの類推をできないようにしている。
* ワンタイムパスワードに一方向ハッシュ関数は使われる。
* 具体的なアルゴリズム
    * 1990 MD4,1991 MD5 128ビットのハッシュ値
    * 1993 SHA-1 160ビットのハッシュ値 2^64ビットのメッセージまで計算できる
    * 2002 SHA-2(256,384,512ビットで選択できる) 256では2^64未満まで384,512では2^128未満までのメッセージを計算できる。
    * 誕生日攻撃 N人のうち少なくとも2人の誕生日が一致する確率が1/2以上になるには、Nは何人?→N=23
* 改竄はわかっても、なりすましはわからない。

#メッセージ認証コード
* メッセージ認証コードは改竄の防止(完全性)、なりましの防止(認証)ができる。
* メッセージ認証コードは鍵に依存した一方向ハッシュ関数。
* 送信者と受信者が事前共有鍵をもつ、メッセージをその共有鍵でメッセージより短いメッセージ認証コードmessage authentication code MAC で計算する。出力されたものはMAC値と言われる。→鍵配送問題がある！→公開鍵暗号で解決したのがデジタル署名
* 実用例
    * SWIFT society for worldwide interbank financial telecommunication国際的な銀行間の取引で使われる。公開鍵暗号ができるまでは共有鍵は人が運んでいた。
    * IPsecインターネットの根底の通信IPにセキュリティの機能をつけたもの
    * SST/TLS オンラインショッピングで使われる
* HMAC hash MAC一方向ハッシュ関数をもちいたメッセージ認証コード ipad,opad２つのビット列で２つの鍵ipadkey,opadkeyを作り、２重にハッシュ値を計算その後MAC値をだす。
* 再生攻撃を防ぐため シーケンス番号、ノンス、タイムスタンプなどがある。
* 送信者と受信者で同じ鍵のためrepudiationができてしまう。

#デジタル署名
* メッセージ認証コードの共有鍵を公開鍵暗号に変えたもの。メッセージを暗号化して署名とする場合と、ハッシュ値を暗号化して署名とする場合がある。ハッシュ値の方が使われる。
* 送信者はRSAの逆でプライベート鍵で暗号化、受信者は送信者の公開鍵で復号化する。公開鍵が送信者のものであるかを判断するために公開鍵にデジタル署名をするこれは証明書と言われる
* ソフトウェアのダウンロードの際、作成者が確かに作ったものか確かめる署名付きアプレットと呼ばれるものがある。

#SSL/TLS
*  https://のsはSSL/TLSが動いていると言う意味(SSLとTLSは別物みたい)
* HTTPはクライアントとサーバーの間のリクエストとレスポンスのやりとりで必要な処理を行っている
* HTTPはSSL/TLSの上に乗っている
* 秘匿性(対称暗号、公開鍵暗号、Differ-Hellman)、完全性(メッセージ認証コード、一方向ハッシュ)、認証、否認防止(デジタル署名)を解決する
* メールで使う、SMTPやPOP3も乗せられる
* 暗号スイートCipher suite どの暗号技術を使うか予めプロトコルに定義しておくそれを暗号スイートという
* TLSプロトコルはTLSレコードプロトコルとTLSハンドシェイクプロトコルから構成されている

#最後に
![owari.jpg](https://qiita-image-store.s3.amazonaws.com/0/225251/ed266211-59dc-94f3-dc29-8bca0e08b1c7.jpeg)

暗号技術は発達していますが、セキュリティ問題は結局人的要因が大きいみたいです。

例えばどんなに銀行のシステムが堅牢でも
ソーシャルエンジニアリグ（情報技術を使わないで、だまして情報を得る方法）みたいなことで
情報を取られてしまう。

とか

会社や個人のPCがずさんな管理のため知らない間に悪用され、自らへの被害におさまらず、第三者への攻撃に使われているとか。
知らないうちに加害者になっているなんて、前にそんな事件ありましたね、、

セキュリティを学ぶことは自分への被害だけでなく、他者への攻撃に悪用されることを防ぐこともできるんですね。