暗号利用モード

暗号利用モード（あんごうりようモード、Block cipher modes of operation）とは、ブロック暗号を利用して、ブロック長よりも長いメッセージを暗号化するメカニズムのことである。 ECBモード（単純なブロック暗号の利用法）では、ある鍵で同一の平文を暗号化すると、同一の暗号文になる。したがって、長いメッセージ（画像データなど）のある部分が他の部分と同じであるかどうかが、暗号文の比較によって判断できてしまうので、他のモードが必要となった。 暗号利用モードには、秘匿用の利用モードと、認証用の利用モードとがある。 秘匿用として多くの暗号利用モードが定義されており、これらのうち、ECB, CBC, OFB, CFBの4つは、FIPS, ANSIのほか、ISO、JISで規格化されている。またCTRは、AES制定の際に追加されたモードである。 代表的な暗号利用モードを以下に示す。以下の説明で、 C i {\displaystyle C_{i}} は暗号化後のi番目のブロック、 M i {\displaystyle M_{i}} は暗号化前のi番目のブロック、 E K ( _ ) {\displaystyle E_{K}(\_)} はブロック暗号処理を表す。 ECBモード (Electronic Codebook Mode) は、もっとも単純な暗号利用モードである。メッセージはブロックに分割され、それぞれのブロックは独立して暗号化される。 ECBモードの欠点は、同じ鍵を用いた場合には、同じ平文ブロックを暗号化した結果の暗号文ブロックが常に同じとなることである。このため、データのパターンを隠蔽することができない。メッセージの機密性の保持には向かず、暗号化プロトコルにおける使用は推奨されない。同じ入力に対して常に同じ出力を返すことから、ECBモードは反射攻撃に対しても脆弱である。 ECBモードにおいてデータのパターンがどの程度残されるかを、ビットマップ画像の暗号化を用いて説明する。各々のピクセルの色情報を暗号化しても、暗号化処理後の画像にはピクセルごとの色情報のパターンが残留している。 CBCモード (Cipher Block Chaining Mode) は、1976年にIBMによって開発された。CBCモードでは、平文の各ブロックは前の暗号文とのXORを取ってから暗号化される。すなわち、各々の暗号文ブロックはそれ以前のすべての平文ブロックに依存することとなる。メッセージごとのユニーク性を確保するため、最初のブロックの暗号化には初期化ベクトルが用いられる。 暗号化 C i = E K ( P i ⊕ C i − 1 ) , C 0 = I V {\displaystyle C_{i}=E_{K}(P_{i}\oplus C_{i-1}),C_{0}=IV} 復号 P i = D K ( C i ) ⊕ C i − 1 , C 0 = I V {\displaystyle P_{i}=D_{K}(C_{i})\oplus C_{i-1},C_{0}=IV} CBCモードは、最も広く用いられている暗号利用モードであり、ECBモードの欠点を補うものである。このモードの主な欠点は、各ブロックの暗号化にその前のブロックの暗号化の結果を使用することから暗号化処理を並列化することができないことと、暗号文ブロックのサイズの整数倍となるようメッセージをパディングする必要があることである。後者の例の一つが、Ciphertext stealing（英語版）と呼ばれるものである。CBCモードの暗号化においては、平文あるいは初期化ベクトルが1ビットでも変化すると、それ以降の暗号文すべてが変化することとなる。 不正な初期化ベクトルを用いて復号した場合、復号後の平文の最初のブロックは正しい結果とはならないが、それ以降のブロックは正しく復号される。これは、隣接する2つの暗号文ブロックから平文を回復することが可能なためである。これにより、CBCモードの復号処理は並列化が可能となる。CBCモードの復号においては、暗号文が1ビット変化した場合、その位置に対応するブロック全体および次のブロックにおける対応するビットの復号結果に影響を及ぼすが、それ以外のブロックには影響を及ぼさない。 PCBCモード (Propagating Cipher Block Chaining Mode あるいは Plaintext Cipher Block Chaining mode) は、CBCモードの変法である。 暗号化 C i = E K ( P i ⊕ P i − 1 ⊕ C i − 1 ) , P 0 ⊕ C 0 = I V {\displaystyle C_{i}=E_{K}(P_{i}\oplus P_{i-1}\oplus C_{i-1}),P_{0}\oplus C_{0}=IV} 復号 P i = D K ( C i ) ⊕ P i − 1 ⊕ C i − 1 , P 0 ⊕ C 0 = I V {\displaystyle P_{i}=D_{K}(C_{i})\oplus P_{i-1}\oplus C_{i-1},P_{0}\oplus C_{0}=IV} PCBCモードはケルベロス認証のバージョン4およびWASTE（英語版）において用いられているが、あまり一般的ではない。PCBCモードでは隣接する2つの暗号文ブロックを入れ替えたとしてもそれ以降のブロックの復号に影響しない。このため、ケルベロス認証のバージョン5ではPCBCモードは採用されていない。 CFBモード (Cipher Feedback Mode) は、CBCモードと類似しており、ブロック暗号を自己同期型のストリーム暗号として扱うものである。CFBモードの操作はCBCモードとよく似ており、特に復号処理はCBCモードでの復号処理をほぼそのまま逆転させたものとなる。 暗号化 C i = E K ( C i − 1 ) ⊕ P i , C 0 = I V {\displaystyle C_{i}=E_{K}(C_{i-1})\oplus P_{i},C_{0}=IV} 復号 P i = E K ( C i − 1 ) ⊕ C i , C 0 = I V {\displaystyle P_{i}=E_{K}(C_{i-1})\oplus C_{i},C_{0}=IV} 上に示したもっとも単純なCFBモードでは、CBCモードのような自己同期型とはなっていない。1バイト、1ビットでも欠けた場合にはそれ以降の復号は不可能となる。そのような欠落の後も同期を続けるためには、1バイト、1ビットを同時に暗号化する必要がある。ブロック暗号の入力にシフトレジスタを組み合わせることで、CFBモードは自己同期型で利用することが可能となる。 CFBモードを任意のxの整数倍の欠落に対しても同期を維持することが可能な自己同期型のストリーム暗号として利用するためには、ブロックサイズと初期化ベクトルのサイズでシフトレジスタを初期化する必要がある。これはブロック暗号によって暗号化され、暗号化結果の上位xビットは平文のxビットとのXORを取られ、これがxビットの暗号文となる。これらxビットの出力はシフトレジスタにシフトされ、次のxビットの平文の処理に用いられる。復号も同様であり、初期化ベクトルから始まり、復号、復号結果の上位xビットと暗号文のxビットのXORによりxビットの平文となり、これが次のxビットの暗号文の処理に用いられる。このような処理はCFB-8あるいはCFB-1として知られている（シフト量の大きさによる）。 まとめると次のようになる。ここで、Si は i 番目のシフトレジスタの状態、a << x は x ビットだけシフトした a、head(a, x) は a の上位 x ビット、n は初期化ベクトルのビット数である。 暗号化 C i = head ( E K ( S i − 1 ) , x ) ⊕ P i {\displaystyle C_{i}={\mbox{head}}(E_{K}(S_{i-1}),x)\oplus P_{i}} 復号 P i = head ( E K ( S i − 1 ) , x ) ⊕ C i {\displaystyle P_{i}={\mbox{head}}(E_{K}(S_{i-1}),x)\oplus C_{i}} 凡例 S i =   ( ( S i − 1 << x ) + C i )  mod  2 n {\displaystyle S_{i}=\ ((S_{i-1}<<x)+C_{i}){\mbox{ mod }}2^{n}} S 0 =   IV {\displaystyle S_{0}=\ {\mbox{IV}}} 暗号文からxビットが失われた場合、シフトレジスタによって再度同期されるまでは復号結果は正しいものとはならない。すなわち、平文の欠落は最大でも1ブロック分に留まることとなる。 CBCモードと同様に、平文における1ビットの変化であっても暗号文全体に及ぶため、暗号化処理の並列化は不可能である。同様に、復号処理の並列化は可能である。 CFBモードは、OFBモードやCTRモードと同様、CBCモードと比較して2つの利点を有している。ブロック暗号を暗号化処理にのみ用いることと、ブロックサイズの整数倍にメッセージのパディングを行う必要がないことである。 OFBモード (Output Feedback Mode) は、ブロック暗号を同期型のストリーム暗号として扱うものである。OFBモードでは、鍵ストリーム（英語版）を生成し、これと平文ブロックのXORを取ることで暗号文を得る。他のストリーム暗号と同様に、暗号文のビットをフリップさせると、平文の対応するビットがフリップする。この性質により、暗号化の前であっても前方誤り補正を適用することが可能となる。 XOR操作の対称性により、暗号化と復号は全く同じ操作となる。 暗号化 C j = P j ⊕ O j {\displaystyle C_{j}=P_{j}\oplus O_{j}} 復号 P j = C j ⊕ O j {\displaystyle P_{j}=C_{j}\oplus O_{j}} 凡例 O j =   E K ( I j ) {\displaystyle O_{j}=\ E_{K}(I_{j})} I j =   O j − 1 {\displaystyle I_{j}=\ O_{j-1}} I 0 =   IV {\displaystyle I_{0}=\ {\mbox{IV}}} 各々の操作はそれ以前のすべての操作に依存していることから、暗号化、復号ともに処理の並列化は不可能である。しかし、平文あるいは暗号文は各操作の最後のXORにのみ用いられることから、ブロック暗号による操作を先行して処理しておき、XORのみを最後に連続して行うことは可能である。 入力として0が連続する文字列を定数としてCBCモードを使用することでOFBモードの鍵ストリームを生成することができる。これは、CBCモード向けの高速なハードウェア実装をOFBモードに流用することが可能であることを意味する。 CFBモードのようにブロックの一部をフィードバックに用いた場合、OFBモードにおける平均サイクル長は 2 32 {\displaystyle 2^{32}} あるいはそれ以上小さくなる。Davies、Parkinによる数学モデルと、実験による検証から、完全なフィードバックの場合にのみサイクル長は最大となることが明らかとなった。このため、OFBモードの仕様からフィードバックの切り詰めのサポートは除去されている。 CTRモード (Counter Mode) は、ブロック暗号を同期型のストリーム暗号として扱うものである。integer counter mode (ICM) あるいは segmented integer counter mode (SIC) とも呼ばれる。 「カウンター」と呼ばれる値を暗号化することで鍵ストリームブロックを生成する。カウンターとしては、単調増加であり値が重複することがなければどのような関数でも用いることができるが、1ずつ増加するものがもっとも単純でありもっとも一般的である。単純かつ決定論的な関数をカウンターとして用いることには異論があり、批評家は「暗号システムを系統だった入力に晒すことは、不必要なリスクを招くものである」と主張していた。現在では、CTRモードは広く受け入れられており、入力関数に由来する問題はCTRモードではなく基礎となるブロック暗号によるものと認識されている。CTRモードはNiels FergusonおよびBruce Schneierによって推薦される2つの暗号利用モードのうちの1つとなっている（もう1つはCBCモード）。 CTRモードはOFBモードに似た性質を示すが、復号におけるランダムアクセス性を有している。CTRモードは暗号化、復号のいずれも並列処理が可能であり、マルチプロセッサ環境に適している。また、OFBモードのような短いサイクルの問題も存在しない。 下記のダイアグラムにおけるNonceは、他の暗号利用モードにおける初期化ベクトルに相当する。Nonceとカウンターを無損失操作（連結、add、XOR）によって組み合わせることで、実際に用いられるカウンターブロックが生成される。 CTS (Ciphertext stealing（英語版）) 2DEM (2D Encryption Mode) ABC (Accumulated Block Chaining) IGE (Infinite Garble Extension) F8@3GPP B = E K ( n o n c e ) {\displaystyle B=E_{K}(\mathrm {nonce} )} , C i = A i ⊕ M i {\displaystyle C_{i}=A_{i}\oplus M_{i}} , A i = E K ( A i − 1 + i + B ) {\displaystyle A_{i}=E_{K}(A_{i-1}+i+B)} など 認証用の利用モードとして次のものなどが知られている。 CCM (Counter with CBC-MAC) GCM (Galois/Counter Mode) OCB (Offset CodeBook) XCBC (eXtended Ciphertext Block Chaining) XCBC-MAC FIPS PUB-81 DES MODES OF OPERATION, 1980 December 2. ANSI X3.106 Digital encryption Algorithm - Modes of Operation ISO 8372:1987 Information processing -- Modes of operation for a 64-bit block cipher algorithm ISO/IEC 10116 Information technology -- Security techniques -- Modes of operation for an n-bit block cipher JIS X 5052:1990 64ビットのブロック暗号アルゴリズムの利用モード (Modes of operation for a 64-bit block cipher algorithm) JIS X 5053:1998 セキュリティ技術 ― ｎビットブロック暗号の利用モード (Information technology -- Security techniques -- Modes of operation for an n-bit block cipher) RFC 3610 -- Counter with CBC-MAC (CCM)