担当:勝見
目次
- はじめに
- 暗号アルゴリズム
- 暗号モードの種類
- 各暗号モードの仕組みと特徴
- まとめ
はじめに
- 前回の対象暗号では、1ブロック(※)分の暗号化についての説明でした。
- 任意の長さの平文を暗号化するためには、ブロック暗号を繰り返す必要がある。
- ブロック暗号を繰り返す方法のことをブロック暗号の「モード」と呼ぶ。
(※)1ブロック= 64ビット(8バイト)、128ビット(16バイト)など
分割イメージ
単純に暗号化すると1
単純に暗号化すると2
今回のポイント
- 同じ入力があったたとき、暗号化された結果の出力が同じにならないようにする方法。
- 暗号化/復号化するときに一工夫して、ブロックごとに操作して、より複雑さを加える方法。
暗号アルゴリズム
暗号アルゴリズムは、次の2つに大きく分けられる。
* ブロック暗号
* ストリーム暗号
ブロック暗号(block cipher)
- ある特定のビット数の「まとまり」を一度に処理する暗号アルゴリズムの総称。
- ブロック単位で処理が完了する。
- 第3章の「対称暗号」で紹介された、DES, 3DES, AESが相当する。
ストリーム暗号(stream cipher)
- データの流れ(ストリーム)を順次処理していく暗号アルゴリズム
- 1ビット、8ビット、32ビットなどの単位で暗号化や復号化が行われる
- データの流れを順次処理し、内部状態を持っている
- 第3章の「対称暗号」で紹介された「使い捨てパッド」が相当する。
ブロック暗号のモード
- ブロック暗号
- ECBモード: Electronic CodeBook mode(電子符号表モード)
- CBCモード: Cipher Book Chaining mode(暗号ブロック連鎖モード)
- ストリーム暗号
- CFBモード: Cipher-FeedBack mode(暗号フィードバックモード)
- OFBモード: Output-FeedBack mode(出力フィードバックモード)
- CTRモード: CounTeR mode(カウンタモード)
暗号化方式表記例
平文ブロックと暗号ブロック
各モードを説明する前に
ECB(Electric CodeBook)モード
- 平文ブロックを暗号化したものが、そのまま暗号文ブロックになる
- どのモードよりも最もシンプル→ なぜなら特別なことは一切行わない
ECBモードの暗号化・復号化
ECBモードの危険性
ピクセルパターンが同一となるブロックは、同一の暗号パターンとなるので、オリジナルの画像は滲んで復元できる。
※ 出典:暗号利用モード(検索日時:2017年03月31日)
https://commons.wikimedia.org/wiki/File:Tux.jpg?uselang=ja
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Tux_ecb.jpg
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Tux_secure.jpg
ECBモードへの攻撃 1/2
ECBモードへの攻撃 2/2
ECBモード:利点と欠点
CBC(Cipher Block Chaining)モード
一つ前の暗号ブロックと平文ブロックのXORを取ってから暗号化を行う
CBCモードによる暗号化
CBCモードによる復号化
初期ベクトルIV
- 1ブロック前の平文ブロックを使用するが、最初の平文ブロックの前にはブロックは存在しない。
- 最初の1ブロック分のみ、代わりのものを用意する。
- 初期ベクトル(initialization vector)と呼ばれ、一般的にIVと呼ばれる。
ECBモードとCBCモードの比較
CBCモードの特徴1
- 平文ブロックは、必ず「一つ前の暗号ブロック」とXORを取ってから暗号化される。
- もし、平文ブロック1と2の値が等しくても、暗号文ブロック1と2の値は同じになるとは限らない。
- ECBモードの欠点は、この仕組みでCBCモードにはない。
パディングオラクル攻撃1
- 平文のデータ長が必ずしも、16の倍数(AESの場合)にならない。
- 足りない分は、16の倍数になるように詰め物(パディング)を行う。
パディングオラクル攻撃2
- パディングの内容を変化させながら、暗号文を何度も送信させ、受信側でエラーにならないデータを作り出して、平文の情報の一部を得ようとするもの。
- CBCモードに限らずパディングを行うモードすべてに使える
- 2014年SSL3.0へのPOODLE攻撃として大問題になった。
初期ベクトル(IV)への攻撃
- 初期ベクトル(IV)は予測不能な乱数として与える必要がある。
- SSL/TLSのTLS1.0では、IVが予測不可能な乱数として与えられていなく、前回CBCモードで暗号化した際の最後のブロックが使われていた。
- TLS1.1以降では、IVを明示的に与えらえるように変更された。
CBCモード:利点と欠点
CFB(Cipher FeedBack)モード
- CFBモードでは、1つ前の暗号文ブロックを暗号アルゴリズムの入力に戻す。
- フィードバックというのは、入力へ戻すということを意味する。
- 「平文ブロック」は暗号アルゴリズムによって直接暗号化を行わない。
- 「平文ブロック」と「暗号アルゴリズムの出力(鍵ストリーム)」とをXORして「暗号文ブロック」を作り出す。
CFBモードによる暗号化
CFBモードによる復号化
鍵ストリーム
暗号アルゴリズムが生成するビット列のことを鍵ストリーム(key stream)と呼ぶ。
CFBモードとストリーム暗号
- CFBモードの構造は、「使い捨てパッド」と似ている。
- 使い捨てパッドは、「平文」と「ランダムなビット列」とをXORして「暗号文」を作りだす。
補足
- 暗号アルゴリズムの出力は計算で作り出しているので、真のランダムなビット列ではない。
- CFBモードが使い捨てパッドのように理論的に解読不能になるわけではない。
CBCモードとCFBモードの比較
再生攻撃(Replay Attack)
CFBモード:利点と欠点
OFB(Output-FeedBack)モード
- 「平文ブロック」は暗号アルゴリズムによって直接暗号化を行わない。
- 「平文ブロック」と「暗号アルゴリズムの出力」とをXORして「暗号文ブロック」を作り出す。
- OFBモードは、CFBモードに似ている。
CFBモードによる暗号化
CFBモードによる復号化
CFBモードとOFBモードの比較
OFBモードとCFBモードでは、暗号アルゴリズムの入力だけが異なっている。
OFBモード:利点と欠点
CTR(CounTeR)モード
- CTRモードは、1ずつ増加していくカウンタを暗号化して、鍵ストリームを作り出す
- ストリームカウンタを文字列化したビット列と、平文ブロックとのXORを取った結果が、暗号ブロックとなる。
カウンタの作り方1
カウンタの初期値は、暗号化のたびに異なる値(ノンス)を元にして作る。ブロック長が128ビット(16バイト)の場合は、以下のようになる
カウンタの作り方2
- 前半の8バイトがノンスと呼ばれ、固定の値となる。
- 後半の8バイトはブロック番号で、この部分がカウントアップされていく
- カウンタ値が増え毎回異なるので、それで暗号化した鍵ストリームもブロックごとに異なるビット列となる
CTRモードによる暗号化
CTRモードによる復号化
OFBモードとCTRモードの比較
- OFBモードは暗号文ブロックをフィードバックする
- CTRモードではカウンター値を増加させる
CTRモードの特徴
- CTRモードの暗号化と復号化は同じ構造となるので、プログラムの実装が容易
- CTRモードでは、暗号化・復号化の際に使うカウンタをノンスとブロック番号から求めるので、ブロックを任意の順番で暗号化・復号化することができる。
- 任意の順序で暗号化・復号化できる性質を持っているので、処理を並列に実行できる。
CTRモード:利点と欠点
まとめ
- ECBモード以外を使用する。
- IVは、毎回ランダムに作成する。
- 改ざんなどの攻撃は可能だが、第8章「メッセージ認証コード」を組み合わせることで、改ざんが検知可能。
AESのデフォルト値
- MySQL 5.7 AES-128-ECB モードを変更して、IVを管理する方法 を考える必要あり
- Laravel5.1以降 AES-256-CBC IVは自動管理(IV+暗号化データが生成)
- PHP 自分で全て指定
参考書籍
結城浩(2015)『暗号技術入門 第3版 秘密の国のアリス』SB Creative 446pp.
ISBN978-4-7973-8222-8
第4章 ブロック暗号のモード(p82-p109)