ブロック暗号 【block cipher】
概要
ブロック暗号(block cipher)とは、暗号の種類の一つで、データを一定の長さごとに区切ってこれを単位として暗号化を行うもの。共通鍵暗号(共有鍵暗号/秘密鍵暗号)のほとんどが該当し、1ビットあるいは1バイト単位で暗号化を行うストリーム暗号と対比される。ブロック暗号は平文を暗号化する際、先頭から順に64ビット、128ビットなどのあらかじめ定められた固定長のブロックに分割し、それぞれのブロックを対象に暗号化処理を行う。暗号文の長さは平文と同じになる。ブロック長は暗号方式の仕様として決まった値を定めている場合(例えばDESは64ビット固定)と、いくつかの値から暗号化時に選択できるもの(Rijndaelは128~256ビット)がある。
ブロック内ではデータの位置の入れ替え(転置)などが行われるため、復号するにはブロックの全体が揃っていなければならない。データの末尾などでブロック長に足りない場合には、全ビット0のデータを既定の長さまで埋めるといった埋め合わせ(パディング)処理が行われる。
暗号モード (block cipher mode)
ブロック暗号では暗号文のランダム性を高めるため、一つ前のブロックの暗号化の結果を暗号化処理に反映させるテクニックが用いられることがある。どのように反映させるかを定めたものを暗号モードという。
最も単純なECBモード(Electronic Codebook Mode)と最も広く用いられるCBCモード(Cipher Block Chaining Mode)が有名だが、他にもCFBモード(Cipher Feedback Mode)やOFBモード(Output Feedback Mode)、CTRモード(Counter Mode)など様々な種類があり、CCMモード(Counter with CBC-MAC)のように認証のために考案されたモードもある。
ECBモード (Electronic Codebook Mode)
前のブロックの結果を利用せず、毎回どのブロックにも同じ暗号化処理を行う方式をECBモードという。最も単純な方式で、各ブロックの平文と暗号鍵のみを用いて暗号文を生成し、同じ平文からは常に同じ暗号文が得られる。
パターンの出現頻度などを解析して解読されやすく、毎回同じ暗号文となるため反射攻撃に悪用可能である。実装が容易で高速に暗号化・復号できるが、機密度が低いため実用上はなるべく用いない方がよいとされる。
CBCモード (Cipher Block Chaining Mode)
平文と直前のブロックの暗号文の各ビットをXOR演算したデータに対して暗号化を行い、これをそのブロックの暗号文とする方式をCBCモードという。様々な暗号方式で最もよく利用されている。
平文の一部が共通するブロックがあっても直前のブロックの結果が反映されて異なる暗号文が生成される。最初のブロックには直前のブロックが無いため、代わりに初期化ベクトル(IV:Initialization Vector)と呼ばれるダミーデータを用意する。これを毎回ランダムに変更すれば、得られる暗号文全体も規則性なく変化させることができる。
安全性は高いが、前から順番に暗号化しなければならないため処理を並列化できず暗号化に時間がかかる。また、あるブロックに生じた伝送エラーがそのブロックだけでなく直後のブロックの復号にも影響する。