3分で復習する暗号技術入門

## この記事でわかること

共通鍵暗号、公開鍵暗号、一方向ハッシュ関数などについて(それぞれ)3分で復習します。

## <i class="fa fa-list" style="font-size:1em;"></i> 目次

- [暗号の利用](http://qiita.com/aidy91614/items/1a2f7c86e66cf68918e2#%E6%9A%97%E5%8F%B7%E3%81%AE%E5%88%A9%E7%94%A8)
- [共通鍵暗号方式](http://qiita.com/aidy91614/items/1a2f7c86e66cf68918e2#%E5%85%B1%E9%80%9A%E9%8D%B5%E6%9A%97%E5%8F%B7)
- [公開鍵暗号方式](http://qiita.com/aidy91614/items/1a2f7c86e66cf68918e2#%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7)
- [一方向ハッシュ関数](http://qiita.com/aidy91614/items/1a2f7c86e66cf68918e2#%E4%B8%80%E6%96%B9%E5%90%91%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0)
- [メッセージ認証コード](http://qiita.com/aidy91614/items/1a2f7c86e66cf68918e2#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E8%AA%8D%E8%A8%BC%E3%82%B3%E3%83%BC%E3%83%89)
- [ディジタル署名](http://qiita.com/aidy91614/items/1a2f7c86e66cf68918e2#%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D)

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> 暗号の利用

暗号は主に下記の五つの用途に応用されます。

- 共通鍵暗号方式
- 公開鍵暗号方式
- 一方向ハッシュ関数
- メッセージ認証コード
- ディジタル署名

それぞれ暗号によってなにを担保したいのかによって使い分けられます。
以下では、それぞれの用途について、「暗号をどのように使うのか」、「なにを保証できるか」、「特徴」についてまとめてみます。

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> 共通鍵暗号

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 暗号をどのように使うのか

共通鍵暗号はその名の通り、**共通の秘密鍵を用いてメッセージを暗号化**することでやりとりの秘密を守ります。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> なにを保証できるか

**機密性**を保証できます。機密性とは、許可されたものだけが許可された範囲内で情報にアクセスできる性質を意味します。
共通鍵暗号によって、共有している秘密鍵を持つものの間でしか中身の見ることのできないメッセージのやりとりが可能になります。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 特徴

どうように機密性を保証するものとして、次に紹介する公開鍵暗号があります。
公開鍵暗号と比較すると、共通鍵暗号には以下のような特性があります。

- 共通鍵暗号では、通信するペアの数だけ鍵を発行する必要があり、**鍵の管理が煩雑**になりうる
- 共通鍵暗号では、秘密鍵をどのように相手に運搬するのかを考える必要がある
- 共通鍵暗号は公開鍵暗号よりも**高速**に暗号化・復号化が可能
- 共通鍵暗号は公開鍵暗号よりも**鍵長を短くできる**(同じ程度の解読の難しさを担保するための鍵長が短くて済む)

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 代表的な共通鍵暗号アルゴリズム

- シーザー式暗号
  - 古典的な暗号方式
- バーナム暗号
  - 排他的論理和を使用した暗号方式。**解読不可能性**が証明されている
- DES
  - IBM者が開発したアルゴリズム
- Triple DES
  - DESに対して上位互換を持つ暗号方式
- AES
  - アメリカの新国家暗号規格。公募した中から優秀な方式が選定された

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> 公開鍵暗号

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 暗号をどのように使うのか

公開鍵暗号では、**公開鍵**(public key)、**プライベート鍵**(private key; 私用鍵、秘密鍵ともいう)と呼ばれる二種類の鍵を使います。
二つの鍵は明確に用途が分けられています。公開鍵はメッセージを暗号化するために使います。プライベート鍵は暗号化されたメッセージを復号するために用います。
公開鍵暗号を用いて Alice から Bob にメッセージを送る場合の手順は以下になります。

1. Bob は公開鍵とプライベート鍵のペアを用意する
2. Bob はプライベート鍵は自分だけが利用できるようにし、一方で公開鍵は Alice に送る(この時公開鍵は第三者に見られても問題はない)
3. Alice は Bob から受け取った公開鍵を使ってメッセージを暗号化し、Bob に送信する
4. Bob は Alice から受け取った暗号化されたメッセージをプライベート鍵を使って復号する(このメッセージを復号できるのはプライベート鍵を持っている Bob だけである)

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> なにを保証できるか
**機密性**を保証できます。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 特徴

- 公開鍵暗号では、公開鍵を通信相手に渡すことでセキュアな通信ができるため、鍵をどのように相手に渡すかを考える必要がない
- 公開鍵暗号では、共通鍵よりも**計算時間がかかる**

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 代表的な公開鍵暗号アルゴリズム

- RSA
  - 桁数が大きい合成数のす因数分解問題の困難性を利用した暗号方式
- ElGamal暗号
  - 位数が大きな群の離散対数問題の困難性を利用した暗号方式
- 楕円曲線暗号
  - 楕円曲線上の離散対数問題の困難性を利用した暗号方式

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> 一方向ハッシュ関数

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 暗号をどのように使うのか

あるデータを復号不可能な方法でハッシュ化する。
メッセージとともに、そのメッセージのハッシュ値を送信することで、受け取ったメッセージのハッシュ値を受信者が計算して送られてきたハッシュ値と照らし合わせることで、メッセージが改ざんされていないことを確認できる。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> なにを保証できるか

**完全性**を保証できます。完全性とは、ある情報が途中で欠落や重複、改ざんなどのトラブルが発生することなく正しく処理されることを表す。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 特徴

- 任意の長さのメッセージのハッシュは、特定の長さのハッシュ値になる
- ハッシュ値は高速に計算可能
- メッセージが 1bit でも変わったらハッシュ値も変わる
- **ハッシュ値から元のメッセージを計算できない**

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 代表的な一方向ハッシュ関数

- MD5
  - 与えられた入力に対して 128bit のハッシュ値を出力する。既に脆弱性が発見されているため現在は**非推奨**
- SHA-1
  - アメリカ政府標準のハッシュ関数。160bit のハッシュ値を出力する
- SHA-2
  - SHA-224, SHA-256, SHA-384, SHA-512 の総称
- BCrypt
  - Blowfish 暗号を利用したパスワード用ハッシュ関数。ブルートフォース攻撃やレインボーテーブルに対して強い設計になっている

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> メッセージ認証コード

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 暗号をどのように使うのか

一方向ハッシュ関数に加えて、送受信者間で共通鍵を用いてメッセージ認証コード(MAC)と呼ばれるコードを生成する。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> なにを保証できるか

**完全性**と**真正性**を保証できます。真正性とは、利用者、システム、プロセス、情報などが主張通りであることを確実にする性質です。
真正性が保証されている場合、なりすましによって送信者が偽られていることがないと保証できます。
一方向ハッシュ関数を用いると、メッセージが改ざんされていないことが保証できるが、一方で、なりすましを保証することはできない。
そこで、送受信者で共通の鍵を共有することで正しい送信者からのメッセージであることを保証します。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 特徴

- 共通鍵を用いるため、送受信者は事前に鍵の交換を行う必要がある
- **否認不可性を持たない**、すなわち送信者は自分がそのメッセージを送っていないと主張することができ、メッセージ認証コードではその真偽を証明することができない

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> ディジタル署名

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 暗号をどのように使うのか

公開鍵暗号と同様に 公開鍵とプライベート鍵を用意する。
Alice が Bob にディジタル署名付きメッセージを送信する場合を考える。

1. Alice はメッセージに対して、自身のプライベート鍵を用いて署名する
2. Alice は署名付きメッセージを Bob に送信する
3. Bob は Alice の施した署名の正しさを、 Alice の公開鍵を用いて検証する

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> なにを保証できるか

**完全性**、**否認防止性**、**真正性**が保証できます。ようは、**メッセージ認証コードが保証する内容に否認防止性が加わっています**。

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 特徴

- メッセージ認証コードと違い、否認防止性が保証できる。というのも、署名するには送信者の持つプライベート鍵が必要であり、それは送信者しか知り得ないものであるから

### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 代表的なディジタル署名
- RSA 署名
 - RSA 暗号を応用して作られた署名アルゴリズム
- DSA(Digital Signature Algorithm)
  - ElGamal 暗号を応用して作られた ElGamal 署名を改良したもの
- ECDSA (Elliptic Curve DSA)
  - 楕円曲線暗号の応用の一つ