【初学者向け】暗号基本技術まとめ その1

## 目的
仕事でセキュリティ関連の内容を扱っているが、知識不足な部分が多く、基礎内容を勉強し直すことにした。
せっかくなので、(ほぼ自分のために)学んだことをまとめていく。

## 目次
+ <b>【今回】その1：暗号技術で重要な役割を果たす基本要素について学ぶ</b>
+ [その2：対称暗号(共通鍵暗号)、公開鍵暗号(DES、AES、RSA、楕円曲線暗号など)の詳細を学ぶ](https://qiita.com/marumen/items/8e9645734beafef3c714)
+ (予定)その3：デジタル署名、証明書の詳細を学ぶ
+ (予定)その4：opensslなどを使った実践

## 参考
以下の本を参考に勉強を行った。
この記事を見てよく分からないところは以下の本を参照ください。[^1]
[^1]: こう書くとサクラっぽいですが、非常に説明が丁寧で読みやすいです。数学的な内容は最小限に抑えて説明されているため、数学嫌いの方でも取っ付きやすいかと思います

+ 暗号技術入門 第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%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797382228/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=

## 勉強メモ

### 暗号学者の道具箱
以下、6つの技術を<b>暗号学者の道具箱</b>と呼ぶ。
これらは暗号技術の中で特に重要な役割を果たす。

+ 対称暗号(共通鍵暗号)
+ 公開鍵暗号
+ 一方向ハッシュ
+ メッセージ認証符号(MAC)
+ デジタル署名
+ 疑似乱数生成器

それぞれ以下の脅威からの防衛のために使われる。
(疑似乱数生成器は共通鍵暗号、公開鍵暗号などの各暗号技術の処理中で利用される)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/9e04edd9-029e-6f2d-d916-55862127cb90.png)

<b>※情報セキュリティ3要素[^2]</b>
[^2]:https://activation-service.jp/iso/column/2013
https://smillione.co.jp/it_blog/1131/
+ 機密性：権限がない人が情報にアクセスできないようにすること
+ 完全性：データが欠落していないかつ最新の状態であること
+ 可用性：必要な時に使える状態を維持すること
+ 真正性(認証)：利用者や情報そのものが本物であることを担保する
+ 責任追及性：ある行為が誰によって行われたかを明確にすること
+ 否認防止(否認不可能性)：情報の作成者が作成した事実を後から否認(後から自分ではないという)できないようにすること
+ 信頼性：情報システムの処理が、欠陥や不具合なく確実に行われること

### 対称暗号(共通鍵暗号) / 公開鍵暗号

+ 送信者から受信者へ送る暗号文の漏洩を防ぐこと(機密性)ができる技術

##### 対称暗号(共通鍵暗号)
+ 送信者/受信者で<b>共通の鍵</b>を使う
+ 共通鍵を使うため、鍵配送問題がある。<b>(盗聴されると暗号文が漏洩してしまう)</b>
+ DES、AESが有名な暗号アルゴリズム
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/cebb8e93-9906-6685-da68-6d4e1bc23997.png)


##### 公開鍵暗号
+ 送信者/受信者で<b>異なる鍵(秘密鍵/公開鍵)</b>を使う
+ 送信者/受信者で鍵が異なるため、<b>暗号文の盗聴は不可</b>
+ RSA、楕円曲線暗号(ECC)が有名な暗号アルゴリズム
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/c29bd116-3379-1f6c-4648-1ca6a24ea989.png)

### 一方向ハッシュ

+ メッセージの一方向ハッシュを取ることで改ざんを検知(完全性)できる

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/aff921a2-26e2-f262-efcf-0e827211395f.png)

##### 一方向ハッシュ関数の性質
+ 出力される<b>ハッシュ値は固定長</b>(例：ハッシュ関数がSHA-256の場合、常にハッシュ値は32byteになる)
+ 2つの異なるメッセージが同じハッシュを持ってはいけない(<b>衝突耐性</b>と呼ぶ)[^3]
+ <b>一方向性</b>を持っている必要がある。ハッシュ値からメッセージへの逆変換はできないこと
+ MD4やMD5、SHAが有名な一方向ハッシュ関数
[^3]: 衝突耐性とは、正しくは同じハッシュを持つメッセージを見つけることが困難(事実上不可)であることを言う。例えば見つけるためにはスパコンを使って数千年かかるといった状況。

### メッセージ認証符号(MAC)

+ メッセージが正しい送信者から送られたもの(なりすまし、改ざん防止 = 認証、完全性)であることを担保する技術

![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/912069ec-e710-0867-12d1-4d2a354a2c2c.png)


+ 共通鍵を使うため、鍵の配送問題がある(<b>改ざんやなりすましが可能となってしまう</b>)
+ メッセージ認証符号だけでは、<b>機密性は担保できない</b>。機密性は共通鍵暗号など別の方法で担保が必要
+ 一方向ハッシュを使ったHMACが有名

##### 認証付き暗号

+ 共通鍵暗号とメッセージ認証符号を組み合わせることで<b>機密性、完全性、認証</b>を同時に満たす仕組み
+ Encrypt-then-MACやGCM(AES-GCMなどで利用される)が有名

### デジタル署名

+ 否認防止(否認：後から自分ではないという)[^4]を実現する技術

[^4]: メッセージ認証符号(MAC)では実現できないか？
否認防止の例：Aさん→Bさんへ送信したメッセージをCさん(第三者)に対して証明する
AさんとBさんはMAC計算のための共通鍵を持っている
つまり、同じMAC値をAさん、Bさん両方が計算できる。よって、第三者にAさん、Bさんどちらのメッセージかを証明することはできない

![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/93196463-b3e3-248e-a079-dd5f065bd4b5.png)

+ メッセージ認証符号(MAC)で実現していた<b>認証、完全性もこの技術で担保可能</b>
+ デジタル署名だけだとメッセージは盗聴可能。つまり、<b>機密性は担保できない</b>
+ 署名時の暗号処理(公開鍵暗号)としては、RSAや楕円曲線暗号(ECDSA)が有名
+ 公開鍵証明書やSSL/TLSなどの証明書でも利用される

### 乱数

+ 攻撃者に見破られない性質(予測不可能性)を実現するための技術
+ 主に共通鍵暗号や公開鍵暗号などの鍵生成時に利用される

##### 乱数の性質
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/8d5a4933-786c-4c51-c4a9-a82ec28915da.png)

- 無作為性
    - 統計的な偏りがないでたらめな数列
    - この性質だけでは暗号技術に使用できるレベルではない
    - <b>でたらめ = 見破ることができないとは限らないため</b>
- 予測不可能性
    - 過去の数列から次の出力が予測できない性質(=攻撃者は<b>次の出力を見破ることはできない</b>)
    - 無作為性も持ち、暗号技術で利用可能
- 再現不可能性
    - <b>同じ数列を再現することはできない</b>という性質
    - ソフトウェアだけでは再現不可能性は実現できない
	- ソフトウェアは有限の内部状態しか持たず、そこからは有限の周期を持つ値しか生成できない
	- <b>ハードウェアの情報から再現不可能性を持つ乱数を生成可能</b>
	- 例えば、熱雑音という自然現象をもとに再現不可能性を持つ乱数列を生成するハードウェアも作られている

##### 疑似乱数生成器

+ 乱数生成器(RNG)[^5]：熱や音の変化など自然現象の結果を元に乱数を生成する<b>ハードウェア</b>
+ 疑似乱数生成器(PRNG)：乱数を生成をする<b>ソフトウェア</b>
[^5]: 真正乱数生成器(TRNG:True Random Number Generator)とも呼ばれる

<img width="450" alt="image8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248487/9c5fd117-c673-73c6-cee1-2204f72e6d78.png">

+ <b>種(seed)は利用者だけの秘密にしないといけない</b>(暗号で使う"鍵"と同様の扱い)
+ 種(seed)は予測可能な値を使用してはいけない
+ 疑似乱数列生成の方法として、一方向性ハッシュを使う方法、暗号を使う方法が有名

## まとめ
今回は主に、<b>暗号学者の道具箱</b>として挙げられる以下の項目について、勉強を行った。
+ 対称暗号(共通鍵暗号)
+ 公開鍵暗号
+ 一方向ハッシュ
+ メッセージ認証符号(MAC)
+ デジタル署名
+ 疑似乱数生成器

今後は、各項目の詳細を深堀していきたい