暗号技術入門まとめ



とっつきにくい暗号技術が簡潔にわかり易く書かれていて、読んでいてとても面白かった。最高の入門書だと思います。
まだ2月だが、今年の My 技術書 of the yearはこの本に決まる可能性が高い。


<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/4797382228/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4797382228&linkCode=as2&tag=fkrw2960-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797382228&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fkrw2960-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=fkrw2960-22&l=as2&o=9&a=4797382228" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />




覚書。

#第一部　暗号
いろんな暗号技術

- 対象暗号
- 公開鍵暗
- 一方向ハッシュ関数は正真性を提供
- メッセージ認証コードは、正真性と認証を提供
- デジタル署名はなりすまし、改ざん、否認防止
- 擬似乱数生成器
その場限りの鍵（セッションキー）を作るのに使う

この６つは**暗号学者の道具箱**と呼ばれている。暗号化に関する技術はこの６つを駆使することで実現されている。


### セキュリティの常識
- 秘密の暗号アルゴリズムは使わない。
 - 天才に任せたほうが良い。
- 暗号アルゴリズムはいつか暴かれる
- セキュリティは一番弱いところから壊れる
 - それって人間だよね。暗号ではなく。

##対称暗号
###DES
64bitの平文をブロックとしてまとめて暗号化する。
現在ではブルートフォースアタックで解析できる様になった。

ファイステルネットワークを採用していて、ラウンドと呼ばれる暗号化の1ステップを何度も繰り返す。DESでは16ラウンド。
平文を32ビットごとに分けて、右32bitとサブ鍵をもとにラウンド関数fでビット列を生成し、左32bitとXORを採って暗号化する。これを右と左を入れ替えながら何度も繰り返す。

特徴

 - ラウンド数を増やせる
 - ラウンド関数fをどんなものにしても復号化が可能で、
出力から入力を逆算できなくてもよい。
 - 暗号化と復号化を全く同じ構造で実現できる

### Triple DES
特徴

- DES keyを３つ使って、暗号化、復号化、暗号化と三段重ねする。
- 単独のDESとしても使えるように2段目は **復号化** になる。
- 銀行などで使われているが、処理スピードが高くない。

### AES
- 複数のラウンド
- SPN構造
- SubBytes > ShiftRows > MixColumns > AddRoundKey の順番で処理
- これを10-14回繰り返す
- 現時点で安全で高速

SubBytes：単一換字暗号
ShiftRows：行ごとに左に規則的にシフト
MixColumns：列ごとに行列計算
AddRoundKey：ラウンド鍵とXOR

##ブロック暗号モード

### ECB : Electric CodeBlock
- シンプルだが最も機密性が低い
- 同じ平文ブロックは常に同じ暗号文ブロックになる
- 電子符号表モード

ECBに対する攻撃

- ブロックの入れ替えが可能
- 仕組みとしては改ざんが可能（MACを使えば防げるけど）

### CBC : Cipher Block Chaining
- １つ前の暗号文ブロックと平文ブロックをXORを取ってから暗号化
- 最初の暗号文ブロックはランダムな値の初期化ベクトル
- 暗号文ブロックに対して入れかえや改ざんが困難

###CFB : Cipher FeedBack
- ひとつ前の暗号文ブロックを暗号アルゴリズムの入力の戻す
- CBCと違って暗号アルゴリズム自体にfeedbackし、鍵ストリームとなったものと平文をXORする

CFBモードへの攻撃

- 再生攻撃が可能
- 防ぐためにはMACが必要

###OFB : Output FeecBack
- 暗号アルゴリズムの出力を暗号アルゴリズムの入力にフィードバックする
- 平文と暗号アルゴリズムの出力をXORして暗号文ブロックを作り出している

### CTRモード
- 1ずつ増加するカウンタを暗号化して鍵ストリームを作り出す
- カウンタは、ランダムな値ノンス8bitとブロック番号8bitを組み合わせて作る


##公開鍵暗号
対象暗号には鍵配送問題がある。暗号的な解決方法は２つ

- Diffie-Hellman鍵交換
- 公開鍵暗号

|  名前                    |   用途    |
|:--------------------:|:------|
|公開鍵/public key      | 暗号用 |
|(私有)秘密鍵/private key| 複合用 |

問題

- 公開鍵暗号でも、認証の問題は解決できない。
- 対称鍵暗号は対象暗号に比べて何百倍も遅い

##RSAのアルゴリズム
この辺のがまとまってて良さそう。
http://quanon.hateblo.jp/entry/2015/03/26/205949

### 公開鍵暗号への攻撃
- man-in-the-middle攻撃（中間者攻撃）:
アリスとボブの間に入って、鍵をすり替えながらなりすます攻撃。
対策は公開鍵の証明書
- 選択暗号文攻撃

##ハイブリッド暗号システム
対称暗号と公開鍵暗号を組み合わせていいとこ取りする。
メッセージは対称暗号で暗号化し、そのセッションキーを公開鍵暗号で暗号化する。
一般的にメッセージが鍵自体よりも長いので有効。
セッションキーは擬似乱数生成器で作り出して推測不可能なものにする。
セッションキー暗号化とメッセージの暗号化を結合して送る。
PGP, SSL/TLSでも使われている。


# 第二部　認証

##一方向ハッシュ関数
メッセージの指紋をとって改ざんされてないことを保証するもの。真正性のチェック。
ハッシュ値はもとのデータがどんな長さであっても固定サイズになる。
もとのデータが1bitでも変化したら、ハッシュ値も非常に高い確率で異なるべき。
<dl>
<dt>弱衝突耐性</st>
<dd>ある特定のハッシュ値を持つ別のメッセージを見つけ出すことが困難であること</dd>
<dt>強衝突耐性</st>
<dd>ハッシュ値が一致するような異なるメッセージを見つけ出すことが困難であること</dd>
</dl>

##具体例
###MD4/MD5
衝突を見つけることが考案されたので安全ではない
###SHA1
教衝突耐性が破られたため、安全ではない
###SHA2
まだやぶられてない

###SHA3
SHA1が破られたことを受けて作られた新しい方式。Keccak

###一方向ハッシュ関数への攻撃
- ブルートフォースアタック
- 誕生日攻撃
ハッシュ値が一致するデータを２つ探しておいて、一方を攻撃対象に使わせ、もう片方を実際の処理に使う。百万円の契約書と一億円の契約書など。

###一方向ハッシュ関数で解決できない問題
なりすましを検出できない。認証にはMACとデジタル署名が必要。

##MAC: メッセージ認証コード 
送信者の意図通りのものであることを照明する。改ざんとなりすましの防止が目的。
ひとことで言うと、**鍵に依存した一方向ハッシュ関数**。

メッセージからMAC値を計算し、メッセージと共に送る。受信者はメッセージからMAC値を計算して、受け取ったMAC値と比較することで認証する。
ここでも鍵配送問題がある。

ところで、ある時
> 対称暗号で暗号化されているのに、なぜMACが必要なのか。鍵を持っていて正しく復号化できるのであれば、それは正しい相手なのだから、MACは不要では？？

という質問をされたことがある。
その時は明解に答えられなかったが、この本にほぼ同じ内容のコラムがあった。答えは
> 受信者は、平文を"正しく復号化"できているかを判断できない場合がある。例えば平文がランダムな文字列だったり、似た文字だった場合。平文が振り込み金額のみを送るようなケースでは「1000」という部分が「4258419」となってても正しさを判断できない。あるいは、平文が鍵をであるような場合、ランダムな文字列が別のランダムな文字列になってたら正しさを判断できない。


###HMAC
ハッシュ関数を使ったMAC

MACに対する攻撃

- **再生攻撃（リプレイ攻撃）** : 暗号化された内容を盗聴して同じ内容を再送する
対策としては、シーケンス番号、タイムスタンプ、ノンスを追加する。

###MACで解決できない問題
- 第三者に対する証明
- 否認防止


## デジタル署名
改ざん、なりすまし、否認防止が目的。
自分のメッセージであることを証明するために、メッセージ、あるいはそのハッシュ値を自分のプライベート鍵で暗号化したものをメッセージに付加して送る。受信側は送信者の公開鍵で復号化して、メッセージまたはハッシュ値と比較することで検証する。

デジタル署名にもman in the middle攻撃される可能性がある。

MACとデジタル署名の比較

||メッセージ認証コード|デジタル署名|
|:-:|:-:|:-:|
|鍵|共有鍵|公開鍵暗号で署名作成・検証|
|鍵配送問題|起きる|起きないが、公開鍵の認証が必要|
|正真性|◯|◯|
|認証|◯：通信相手に対してのみ|◯：第三者に対しても|
|否認防止|×|◯|

### デジタル署名で解決できない問題
正しい公開鍵を入手するために、証明書が必要。
つまるところ、公開鍵基盤 PKIが必要という話になる。

## 証明書
認証局（CA）が発行するもので、公開鍵が確かなものであることを証明する証明書（公開鍵証明書）
認証局はベリサインが有名


### PKI
公開鍵を運用するための規格、仕様の総称。
PKCS(Public Key Cryptography Standards)もPKIの一種。

- 利用者
- 認証局
- リポジトリ

で構成される。


証明書を破棄する場合は、証明書破棄リストCRLを作成する。

# 鍵・乱数・応用技術
## 鍵 ― 秘密のエッセンス
鍵は平文と同じ価値があると考えられるので、推測出来ないものにする必要がある。最も良いのは乱数を使うこと。パスワード＋ソルトをハッシュ関数にかける場合もある。PBE:Password based Encryption

**鍵更新** (現在の鍵のハッシュ値を新しい鍵とする)も良い。

**KEK** : 鍵を暗号化するための鍵を使うと、守るべき鍵の本数が減る


### Diffie-Hellman鍵交換
他人に知られても構わない情報を交換することで、お互いに共通の秘密鍵（セッションキー）を作りだす方法。
離散対数問題を解くことの難しさを利用している。

##乱数
暗号化技術において、鍵、鍵ペア、IV、ノンス、ソルトの生成に使われる非常に重要なもの。
無作為性、予測不可能性、再現不可能性が求められる。
ソフトウェアが生成する乱数は周期性があるため、ハードウェアから、キーボード入力の時間間隔、放射線観測機、熱雑音などを乱数生成の**種**として利用し、再現不可能性を実現している。

セキュリティ用に使えるアルゴリズムとそうでないものがあるので注意。Javaでは、`java.util.Random` は使えない。`java.security.SecureRandam`はセキュリティ用。

##PGP
Pretty Good Privacyの略。
OpenPGPという規格がある。
GnuPGPはOpenPGPを準拠したフリーソフトウェア。
対称暗号、公開鍵暗号（ハイブリッド暗号）、デジタル署名、一方向ハッシュ関数、証明書、圧縮、テキストデータ、分割統合、キーリングをサポート。

##SSL/TLS
Secure Socket Layer / Transport Layer Security.
上位にくるHTTP/SMTP/POP3などの内容を暗号化する。

TLSプロトコルは、TSLレコードプロトコルとTSLハンドシェイクプロトコルによって構成されている。


## 暗号技術と現実社会
いくらソフトウェアを強固にして守っても、最終的には一番弱いところ（主に人間）から破られます。

#ビットコイン
ビットコインは暗号化の技術を多数使っている。
P2Pベースの決済システムで、全ての取引記録が公開取引簿として記録されている。ブロックチェーン。

1つのブロックはトランザクション部とヘッダから出来ている。
トランザクション部には、トランザクションの集まりが保存されている。
ヘッダには直前のブロックのヘッダ部分のハッシュ値と、トランザクション部分のハッシュ値が格納されている。
ブロックを追加するためには、正しいヘッダを持ったブロックを計算しなければならない。直前のブロックのハッシュ値は、上位ビットに0が並ぶものになる。例えば
  `0000000000000000000000539f09e0a0c753924678bca8eceb88eaa1...`
のようなもの。条件を満たすハッシュ値が出るまで、ノンスを変えながらハッシュ値の計算をしまくる。この行為を**採掘**と言う。

## 量子暗号と量子コンピュータ
量子暗号が確立したら、解読できなくなる。盗聴によって読むと光子の状態が変化してしまうので。
それよりも先に量子コンピュータが誕生したら、現状の暗号化技術は全て解読される。



---
以上。
ほとんど単語だけのメモもありますが、検索用に。

全体を通して、本当に良い本でした。

<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/4797382228/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4797382228&linkCode=as2&tag=fkrw2960-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797382228&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fkrw2960-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=fkrw2960-22&l=as2&o=9&a=4797382228" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


以前読んだこちらも良い本でした。
<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/4797361190/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4797361190&linkCode=as2&tag=fkrw2960-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797361190&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fkrw2960-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=fkrw2960-22&l=as2&o=9&a=4797361190" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />