Block cipher mode of operation

提供: tezos-wiki
移動先: 案内検索

暗号化において、ブロック暗号操作モードは、ブロック暗号を使用して秘密性などの[情報セキュリティ|情報サービス]を提供するアルゴリズムであるまたは真正性。 ブロック暗号自体は、[[ブロック(データ記憶)|ブロック]と呼ばれるビットの1つの固定長グループの安全な暗号化変換(暗号化または復号化)にのみ適しています。動作モードは、暗号の単一ブロック動作を繰り返し適用して、ブロックよりも大きなデータ量を確実に変換する方法を説明します。

ほとんどのモードでは、各暗号化操作のためにしばしば初期化ベクトル(IV)と呼ばれる独自のバイナリシーケンスが必要です。 IVは非反復でなければならず、またいくつかのモードではランダムでなければならない。初期化ベクトルは、同じ平文が同じ[[Key(暗号)]キー]で独立して複数回暗号化されていても、異なるciphertextが生成されることを保証するために使用されます。ブロック暗号には1つ以上のブロックサイズがありますが、変換中はブロックサイズは常に固定です。ブロック暗号モードはブロック全体で動作し、データの最後の部分が現在のブロックサイズよりも小さい場合は paddedをフルブロックにする必要があります。

歴史と標準化[編集]

ECB、CBC、OFB、およびCFBの初期の運用モード(以下を参照)は1981年のもので、FIPS 81、 'DESモードの操作' '。 2001年、米国国立標準技術研究所(NIST)は、[Advanced Encryption Standard | AES]をブロック暗号として追加し、http: /nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf SP800-38A]、 '操作のブロック暗号モードの推奨事項'。最後に、2010年1月、NISTはSP800-38Eに「[XTS-AES]」を追加しました。「Recommendation for Block Cipher動作モード:ストレージデバイスの機密性を保証するXTS-AESモード。 NISTの承認を受けていない他の機密性モードが存在する。例えば、CTSはciphertext stealingモードであり、多くの一般的な暗号ライブラリで利用できます。

ブロック暗号モードECB、CBC、OFB、CFB、CTR、 XTSは機密性を提供しますが、誤った改ざんや悪意のある改ざんから保護しません。改変や改ざんは、CBC-MAC電子署名など別の[メッセージ認証コード]で検出できます。暗号のコミュニティは、専用の完全性保証の必要性を認識し、NISTはHMAC、CMAC、GMACで対応しました。 HMACは、2002年にFIPS 198、「Keyed-Hash Message認証コード(HMAC)」として承認されました、CMACは2005年にSP800-38Bで公開されました。「ブロック暗号モードの推奨:CMAC 「ガロア/カウンターモード| GMAC」]は2007年にSP800-38Dの下で公式化され、 '操作のブロック暗号モードの推奨:ガロア/カウンタモード(GCM)およびGMAC' '。

暗号の共同体は、機密性モードと真正性モードとの合成(結合)が困難で誤りが起こりやすいことを観察した。したがって、機密性とデータの完全性を単一の暗号プリミティブ(暗号化アルゴリズム)に組み合わせたモードを提供し始めました。これらの結合モードは認証された暗号化、AEまたは "authenc"と呼ばれます。 AEモードの例としては、 CCMSP800-38C)、 GCMSP800-38D)、 CWC EAX IAPM OCBを選択します。

現在、いくつかの国内および国際的に認知された標準化団体によって動作モードが定義されています。 ISO / IEC 10116 CBCモードでは、IVは暗号化時に予測不能でなければならず、特に(以前の)メッセージの最後の暗号文ブロックを次のメッセージのIVとして再使用する一般的な方法は安全ではありません(たとえば、この方法はSSL 2.0で使用されていました)攻撃者がIV(または暗号文の前のブロック)彼は次の平文を指定しますが、前に同じ鍵で暗号化されたブロックの平文についての推測を確認できます(これはTLS CBC IV攻撃として知られています)。

パディング[編集]

[ブロック暗号]は固定の[ブロックサイズ(暗号化|サイズ)]の単位(「ブロックサイズ」と呼ばれます)で動作しますが、メッセージの長さはさまざまです。したがって、いくつかのモード([[暗号モードを電子コードブック.28ECB.29 | ECB]でブロックする]と CBC)では、暗号化の前に最後のブロックを埋め込む必要があります。いくつかの[padding(cryptography)| padding]スキームが存在する。最も簡単な方法は null bytesplaintextに追加してその長さをブロックサイズの倍数にすることですが、平文の元の長さを復元できるように注意する必要があります。たとえば、平文が Cスタイル stringで、最後を除いてヌルバイトを含まない場合は、これは自明です。ブロックを記入するのに十分なゼロbitが後に続く単一bitを追加することである元の DESメソッドは少し複雑です。メッセージがブロック境界で終了する場合、全体のパディングブロックが追加されます。最も洗練されたものは、追加の暗号文を発生させないような[ciphertext stealing]やresidual block terminationなどのCBC固有のスキームです。 [Bruce Schneier | Schneier]と[Niels Ferguson | Ferguson]は、2つの可能性を示唆しています。実用的暗号sect 5.1 - >はどちらもシンプルです:値128(16進80)のバイトを付加し、最後のブロックを埋めるために必要な数のゼロバイト、または最後のブロックを値 n を持つ n バイトで埋めます。

CFB、OFBおよびCTRモードでは、ブロック暗号の出力でプレーンテキストを[排他的論理和| XORing]することによって、長さがブロックサイズの倍数でないメッセージを処理する特別な手段は必要ありません。平文の最後の部分ブロックは最後のkeystreamブロックの最初の数バイトとXORされ、最終部分平文ブロックと同じサイズの最終暗号テキストブロックを生成します。ストリーム暗号のこの特性は、暗号化された暗号文データが元の平文データと同じサイズであることを必要とするアプリケーションに適しており、 パディングバイトを追加することが不都合なストリーミング形式でデータを送信するアプリケーションの場合に使用します。

共通モード[編集]

多くの操作モードが定義されています。これらのうちのいくつかを以下に説明します。暗号モードの目的は、暗号化されたデータに存在するパターンをマスクすることである ECBの弱点

異なる暗号モードは、暗号ブロックまたは他のグローバルに決定論的な変数からの出力を後続の暗号ブロックにカスケード接続することによってパターンをマスクする。リストされたモードの入力は、次の表に要約されています。

<! - Todoこの表は、おそらく中間体、暗号文および暗号ブロック機能の列を作成し、鍵は常に入力です。たぶん、数学のマークアップを使用する - >

モードの概要
モード フォーミュラ 暗号文
ECB Y i </ sub> = F(PlainText i </ sub>、Key) Y i </ sub>
CBC Y i </ sub> = PlainText i </ sub> XOR暗号文&lt; sub&gt; i-1&lt; / sub&gt; F(Y、key);暗号文&lt;サブ&gt; 0&lt; / sub&gt; = IV
PCBC Y i </ sub> = PlainText i </ sub> XOR(暗号文<sub-i-1 </ sub> XOR PlainText i-1 </ sub>) F(Y、key);暗号文&lt; sub&gt; 0&lt; / sub&gt; = IV
CFB (Y、key);暗号文 0 </ sub> = IV;暗号文>
OFB Y i </ sub>は、プレーンテキストXOR Y i </ sub> ;
クリック率 (Key、IV + g(i)); IV = token(); Y = Sub i = 平文XOR Y i </ sub>

注:g(i)は決定論的な関数であり、しばしばidentity functionである。

電子コードブック(ECB)[編集]

暗号化モードの中で最も簡単なものは、従来の物理的な[[コードブック]の名前に従った)「電子コードブック」(ECB)モードです。メッセージはブロックに分割され、各ブロックは別々に暗号化されます。

File:ext_38dKJsdjh_ECB encryption.svg

File:ext_38dKJsdjh_ECB decryption.svg

この方法の欠点は、同一のplaintextブロックが同一のciphertextブロックに暗号化されていることです。したがって、データパターンをうまく隠すことはできません。いくつかの意味では、それは重大なメッセージ機密性を提供せず、暗号プロトコルでの使用にはまったく推奨されません。

ECBモードが、均一な色の広い領域を使用するビットマップイメージを暗号化するために使用されるとき、ECBが平文データパターンを暗号文に残すことができる程度の顕著な例が見られます。個々のピクセルの色は暗号化されていますが、オリジナルの同じ色のピクセルのパターンが暗号化されたバージョンに残っているため、全体的なイメージが認識されます。

ECBモードは、各ブロックがまったく同じ方法で復号化されるので、再生攻撃にさらされることのない完全性保護のないプロトコルを作ることもできます。

暗号ブロック連鎖(CBC)[編集]

Ehrsam、Meyer、SmithおよびTuchmanは、1976年にCipher Block Chaining(CBC)モードを発明した.CBCモードでは、平文の各ブロックは暗号化される前の前の暗号文ブロックと[XOR]される。このように、各暗号文ブロックは、その点まで処理されたすべての平文ブロックに依存する。各メッセージを一意にするには、最初のブロックで初期化ベクトルを使用する必要があります。

File:ext_38dKJsdjh_CBC encryption.svg

File:ext_38dKJsdjh_CBC decryption.svg

最初のブロックにインデックス1がある場合、CBC暗号化の数式は次のようになります。 C_i = E_K(P_i \ oplus C_ {i-1})、</ math> :C_0 = IV・math&gt;&lt; math&gt;

CBC解読の数式は (C_i)\ oplus C_ {i-1}、&lt; / math&gt; :C_0 = IV。&lt; / math&gt;

CBCは、最も一般的に使用される操作モードです。その主な欠点は、暗号化がシーケンシャル(すなわち、並列化できない)であり、メッセージが暗号ブロックサイズの倍数にパディングされなければならないことである。この最後の問題を処理する方法の1つは、暗号文の盗用として知られている方法です。平文またはIVにおける1ビットの変更は、後続のすべての暗号文ブロックに影響することに注意してください。

間違ったIVで解読すると、平文の最初のブロックが壊れますが、後続の平文ブロックは正しいでしょう。これは、各ブロックが平文ではなく、前のブロックの暗号文と排他的論理和をとるため、前のブロックを解読してから現在の解読のIVとして使用する必要がないためです。これは、平文ブロックが2つの隣接する暗号文のブロックから復元できることを意味する。結果として、復号化を並列化することができます。暗号文への1ビットの変更は、対応する平文のブロックの完全な破損を引き起こし、後続の平文のブロック内の対応するビットを反転するが、残りのブロックは元のままであることに留意されたい。この特殊性は、POODLEのようなさまざまな[パディング・オラクル攻撃]で悪用されます。 「明示的初期化ベクトル(Explicit Initialization Vectors)」は、単一のランダムブロックを平文に付加することによって、この特性を利用する。暗号化は、IVが暗号解読ルーチンに伝達される必要がないことを除いて、通常どおりに行われる。どのようなIV復号化が使用しても、ランダムブロックだけが「壊れている」。それは安全に破棄することができ、解読の残りは元の平文です。

暗号ブロック連鎖(PCBC)の伝播[編集]

伝播暗号ブロック連鎖モードまたは平文暗号ブロック連鎖モードは、暗号化のときだけでなく、解読時に無限に伝搬する暗号文の小さな変化を引き起こすように設計されています。 PCBCモードでは、平文の各ブロックは、暗号化される前の前の平文ブロックと前の暗号文ブロックとの両方とXORされる。 CBCモードと同様に、最初のブロックでは初期化ベクトルが使用されます。

File:Pext_38dKJsdjh_CBC encryption.svg

File:Pext_38dKJsdjh_CBC decryption.svg

暗号化アルゴリズムと復号化アルゴリズムは次のとおりです。

C_i = E_K(P_i、P_ {i-1}、C_ {i-1})、P_0、C_0、C_i、

P_i = D_K(C_i)\ oplus P_ {i-1} \ oplus C_ {i-1}、P_0 \ oplus C_0 = IV&lt; / math&gt;

PCBCは[Kerberos(protocol)| Kerberos v4]]やWASTEなどで使用されていますが、それ以外はよくありません。 PCBCモードで暗号化されたメッセージでは、隣接する2つの暗号文ブロックが交換されても、後続のブロックの復号には影響しません。このため、Kerberos v5ではPCBCは使用されません。

暗号フィードバック(CFB)[編集]

CBCの親族である「Cipher Feedback」(CFB)モードは、ブロック暗号を自己同期化する[ストリーム暗号]にします。操作は非常に似ています。特に、CFB復号化は、逆に行われるCBC暗号化とほぼ同じです。

:C_i = E_K(C_ {i-1})\ oplus P_i&lt; / math&gt;

(C_ {i-1})\ oplus C_i&lt; / math&gt;

:C_ {0} = \\ mbox {IV}&lt; / math&gt;

File:ext_38dKJsdjh_CFB encryption.svg

File:ext_38dKJsdjh_CFB decryption.svg

自己同期暗号の定義により、暗号文の一部が失われた場合(送信エラーのためなど)、受信者は元のメッセージ(文字化けしたコンテンツ)の一部のみを失い、正しく復号化を続けることができます。ある量の入力データを処理した後の残りのブロック。上記で説明したCFBを使用する最も簡単な方法は、CBCのような他の暗号モードよりも自己同期的ではありません。暗号文全体のブロックサイズが失われた場合に限り、CBCとCFBの両方が同期しますが、1バイトまたは1ビットだけを失うと、永久に復号化が中止されます。 1バイトまたはビットだけを失った後に同期できるようにするには、1バイトまたは1ビットを一度に暗号化する必要があります。 CFBはブロック暗号の入力としてシフトレジスタと組み合わされたときにこのように使用できます。

CFBを使用して、失われたxビットの倍数に同期する自己同期ストリーム暗号を作成するには、シフト・レジスタを初期化ベクトルでブロック・サイズのサイズに初期化することから始めます。これはブロック暗号で暗号化され、結果の上位xビットは平文のxビットとXORされてxビットの暗号文が生成されます。これらのxビットの出力はシフトレジスタにシフトされ、プレーンテキストの次のxビットについてプロセス(ブロック暗号でシフトレジスタを暗号化することから始まる)が繰り返されます。解読は同様で、初期化ベクトルで始まり、結果の上位ビットを暗号文のxビットで暗号化しXORしてxビットの平文を生成し、次に暗号文のxビットをシフトレジスタにシフトして再度暗号化する。この進行方法は、CFB-8またはCFB-1(シフトのサイズに応じて)として知られています。

表記において、 は、シフトレジスタの「i」番目の状態であり、「 '<&lt;&lt;&lt; x は 'a' 'のビット、' 'head'(a、x) 'a' 'の' 'x' 'ビット、' ' IVのビット数です。

(i-1)、x)\ oplus P_i&lt; / math&gt;&lt; math&gt;

(i-1)、x)\ oplus C_i&lt; / math&gt;&lt; math&gt;

(S_ {i-1} <x)+ C_i)\ mbox {mod} 2 ^ nここで、

:S_ {0} = \\ mbox {IV}&lt; / math&gt;

xビットが暗号文から失われた場合、シフトレジスタが暗号化中に保持していた状態に再び等しくなるまで、暗号は正しくない平文を出力し、その時点で暗号は再同期化される。これにより、最大で1ブロック分の出力が文字化けすることになります。

CBCモードと同様に、平文の変更は暗号文に永遠に伝播し、暗号化は並列化できません。また、CBCのように、復号化を並列化することもできます。解読するとき、暗号文の1ビット変化は2つの平文ブロックに影響を与える:対応する平文ブロックの1ビット変化、および次の平文ブロックの完全な破損。後でプレーンテキストブロックが正常に復号化されます。

CFBは、CBCモードと比べてストリーム暗号モードOFBとCTRの2つの利点を共有しています。ブロック暗号は暗号化方向でのみ使用され、メッセージは暗号ブロックサイズの倍数に埋め込まれる必要はありません(ciphertext窃盗を使ってパディングを不要にすることもできます)。

出力フィードバック(OFB)[編集]

「出力フィードバック」(OFB)モードは、ブロック暗号を同期ストリーム暗号にします。 keystreamブロックを生成し、平文ブロックで暗号文を取得する[XOR]。他のストリーム暗号と同様に、暗号文のビットを反転させることで、同じ場所の平文にフリップビットが生成されます。このプロパティは、多くのエラー訂正コードが暗号化の前に適用されていても正常に機能するようにします。

XOR演算の対称性のため、暗号化と復号化はまったく同じです。

:C_j = P_j + oplus O_j </ math>

:P_j = C_j + oplus O_j </ math>

(I_ {j})は以下のようになる。

【数1】I_j = \ O_ {j-1} </ math>

式中、I_ {0} = \\ mbox {IV}&lt; / math&gt;

File:ext_38dKJsdjh_OFB encryption.svg

File:ext_38dKJsdjh_OFB decryption.svg 各出力フィードバックブロック暗号演算は、前のすべてのものに依存するため、並列に実行することはできません。ただし、平文または暗号文は最終的なXORにのみ使用されるため、事前にブロック暗号演算を実行して、平文または暗号文が利用可能になると最終ステップを並列実行できます。

定数のゼロ列を入力としてCBCモードを使用することにより、OFBモードキーストリームを得ることが可能である。これは、OFBモード暗号化のためのCBCモードの高速ハードウェア実装の使用を可能にするので、有用であり得る。

CFBモードのように、部分ブロックをフィードバックとしてOFBモードを使用することは、平均サイクル長を因数2 ^ {32}πだけ減少させる。以上。 DaviesとParkinによって提案され、実験結果によって実証された数学的モデルは、完全なフィードバックのみで、得られる最大値に近い平均サイクル長が達成され得ることを示した。この理由から、切り捨てられたフィードバックのサポートはOFBの仕様から削除されました。

カウンター(CTR)[編集]

注:CTRモード(CM)は、「整数カウンタモード」(ICM)および「セグメント化整数カウンタ」(SIC)モードとも呼ばれます。

OFBと同様に、Counterモードはブロック暗号ストリーム暗号に変換します。 "カウンタ"の連続する値を暗号化して次のkeystreamブロックを生成します。カウンタは、実際のインクリメント・バイ・カウンタが最も簡単で最も普及しているものの、長時間繰り返しないことが保証されたシーケンスを生成する任意の関数でよい。単純な決定論的入力関数の使用法は、以前は議論の余地があった。批評家は、「意図的に暗号システムを既知の体系的な情報にさらすことは、不必要なリスクを表している」と主張した。しかし、今日のCTRモードは広く受け入れられており、あらゆる問題は基礎ブロック暗号の弱点とみなされており、その入力におけるシステムバイアスにかかわらず安全であると期待されている。 CBCと一緒に、CTRモードは、Niels FergusonとBruce Schneierが推奨する2つのブロック暗号モードの1つです。

CTRモードは1979年にWhitfield DiffieMartin Hellmanによって導入されました。

CTRモードはOFBと同様の特性を有するが、復号化中のランダムアクセス特性も可能にする。 CTRモードは、ブロックを並行して暗号化できるマルチプロセッサマシン上で動作するのに適しています。さらに、OFBに影響を与える可能性のある短周期の問題を抱えていません。

IV /ナンスがランダムである場合、無損失操作(連結、加算、またはXOR)を使用してカウンタと組み合わせて、暗号化のための実際の一意のカウンタブロックを生成することができます。非ランダムノンス(パケットカウンタなど)の場合、ノンスとカウンタを連結する必要があります(ノンスを上位64ビットに、カウンタを下位64ビットを128ビットカウンタブロックに格納するなど) 。ノンスとカウンタを単一の値に追加または排他的に加えるだけで、多くの場合、選択された平文攻撃の下でセキュリティが破られます。攻撃者がIVカウンタのペア全体を操作して衝突を引き起こす可能性があるからです。攻撃者がIVカウンタと平文を制御すると、既知の平文との暗号文の排他的論理和は、同じIVカウンタを共有する他のブロックの暗号文と排他的論理和をとったときにそのブロックを復号化する値を生成します。

この図の nonceは、他の図のinitialization vector(IV)に相当することに注意してください。しかし、オフセット/位置情報が壊れていると、バイトオフセットに依存するため、そのようなデータを部分的に回復することは不可能である。

ファイル:ext_38dKJsdjh_CTR暗号化2.svg

File:ext_38dKJsdjh_CTR decryption 2.svg

エラー伝播[編集]

メッセージ認証コード認証された暗号化が広範囲に使用される前に、「エラー伝播」プロパティを動作モードの選択基準として検討するのが一般的でした。例えば、送信された暗号文の1ブロックエラーは、ECBモード暗号化のために再構成された平文において1ブロックエラーをもたらすが、CBCモードでは、このようなエラーは2ブロックに影響を及ぼすことがある。

そのような弾力性は、ランダムなエラー(例えば、ラインノイズ)に直面することが望ましいと感じる人もいれば、エラー訂正によって攻撃者がメッセージを悪意のある人に改ざんする可能性が増すと主張する人もいる。

しかし、適切な完全性保護が使用される場合、そのようなエラーは、メッセージ全体において(高い確率で)拒絶されることになる。ランダム誤りに対する耐性が望ましい場合には、送信前に暗号文に[誤り訂正符号]を適用しなければならない。

認証された暗号化[編集]

1つの暗号プリミティブ内で[秘密]と認証を組み合わせるための多くの動作モードが設計されている。このモードの例としては、 XCBC、[IACBCモード| IACBC]、[IAPMモード| IAPM]、[OCBモード| OCB]、[[EAXモード| EAX] CWC CCM GCM 認証された暗号化モードは、シングルパスモードまたはダブルパスモードに分類されます。 OCBモードなどの一部のシングルパス[認証された暗号化]アルゴリズムは、特許によって邪魔されますが、そのような偽造を避けるために特別に設計されリリースされています。

さらに、暗号化されていない関連データの認証も可能なモードもあります。これらのモードは AEAD(関連するデータによる認証された暗号化)方式と呼ばれます。例えば、EAXモードはダブルパスAEAD方式であり、OCBモードはシングルパスである。

他のモードとその他の暗号プリミティブ[編集]

ブロック暗号のためのより多くの動作モードが提案されている。一部は受け入れられ、完全に記述され(標準化されていても)、使用中です。他のものは不安定であり、決して使用すべきではありません。さらに、機密性、信頼性、または認証された暗号化(キーフィードバックモードや[一方向圧縮機能#Davies.E2.80.93Meyer | Davies-Meyer]など)のハッシングとして分類されていないものもあります。

NISTは、[1]でブロック暗号の提案モードのリストを維持しています。

ディスク暗号化では、アプリケーション用に特別に設計された特殊モードがよく使用されます。狭いブロック暗号化モード([Disk Encryption theory#Liskov.2C Rivest.2C and Wagner .28LRW.29 | LRW])、 XEX XTS)とワイドブロック暗号化モード([ディスク暗号化理論#CBC-mask-CBC(CMC)とECB-mask-ECB(EME)| CMC] CBC-mask-CBC(ECC)とECB-mask-ECB(EME)| EME]])は、ディスクのセクタを安全に暗号化するように設計されています([[disk encryption theory]参照)。

ブロック暗号は他の暗号プロトコルでも使用できます。これらは、ここで説明するブロックモードと同様の動作モードで一般的に使用されます。すべてのプロトコルと同様に、暗号的に安全であるためには、これらの動作モードを正しく設計するように注意する必要があります。

ブロック暗号を使用して暗号ハッシュ関数を構築するいくつかのスキームがあります。いくつかの方法の説明については、一方向圧縮機能を参照してください。

暗号で安全な擬似乱数生成器(CSPRNGs)は、ブロック暗号を使用して構築することもできます。

メッセージ認証コード s(MACs)は、しばしばブロック暗号で構築されます。 CBC-MAC OMAC PMACは例です。

関連項目[編集]

ソース[編集]

http://wikipedia.org/