暗号化において、暗号文窃盗( CTS ) は、ブロック暗号モードを使用する一般的な方法であり、複雑さがわずかに増すという代償を払って、暗号文を拡張することなく、ブロックに均等に分割できないメッセージを処理できます。
一般的な特徴
暗号文の盗難は、メッセージをブロック サイズの倍数に パディングせずに、ブロック暗号を使用して平文を暗号化する手法です。そのため、暗号文は平文と同じサイズになります。
これは、メッセージの最後の 2 つのブロックの処理を変更することによって行われます。最後の 2 つのブロック以外のすべての処理は変更されませんが、最後のプレーンテキスト ブロックを埋め込むために、最後から 2 番目のブロックの暗号文の一部が「盗まれ」ます。埋め込まれた最後のブロックは通常どおり暗号化されます。
最後の 2 つのブロックの最終的な暗号文は、最後から 2 番目のブロックの一部 (「盗まれた」部分は省略) と、元の平文と同じサイズの完全な最終ブロックで構成されます。
復号化するには、まず最後のブロックを復号化し、次に盗まれた暗号文を最後から 2 番目のブロックに復元し、その後通常どおり復号化する必要があります。
原則として、任意のブロック指向のブロック暗号モードを使用できますが、ストリーム暗号のようなモードは、パディングなしで任意の長さのメッセージにすでに適用できるため、この手法のメリットはありません。暗号文の盗難と組み合わされた一般的な動作モードは、電子コードブック(ECB) と暗号ブロック連鎖(CBC) です。
ECB モードで暗号文を盗むには、プレーンテキストが 1ブロックより長くなければなりません。回避策としては、プレーンテキストの長さが 1ブロック以下の場合に、CTR、CFB、OFB モードなどのストリーム暗号のようなブロック暗号モードを使用することが考えられます。
CBCモードの暗号文窃盗では、平文が 1ブロックより長い必要は必ずしもありません。平文が 1 ブロック以下の場合、初期化ベクトル(IV) は暗号文の前のブロックとして機能します。この場合、変更された IV を受信者に送信する必要があります。これは、暗号文の送信時に送信者が IV を自由に選択できない状況 (IV が派生値または事前に設定された値である場合など) では不可能な場合があります。この場合、CBC モードの暗号文窃盗は、1 ブロックより長い平文でのみ発生します。
長さが不明なデータに対して CTS 暗号化または復号化を実装するには、実装で最新の 2 つのデータ ブロックの処理を遅延 (およびバッファリング) して、データ ストリームの最後に適切に処理できるようにする必要があります。
暗号文形式
暗号文を送信用に整理する方法はいくつかあります。暗号文のビットはすべてのケースで同じで、送信順序が異なるだけなので、選択はセキュリティには影響しません。これは純粋に実装の利便性の問題です。
ここでの番号付けは、これらすべてを説明している Dworkin から取ったものです。3 番目は最も人気があり、DaemenとSchneierによって説明されています。Meyer は、関連しているが互換性のないスキーム (ビット順序とキーの使用に関して) を説明しています。
CS1
おそらく、暗号文を整理する最も明白な方法は、最後から 2 番目のブロックを切り捨てて送信し、その後に最後のブロック全体を送信することです。これは、次の 2 つの理由から、受信者にとって不便です。
- 受信者はいずれにしても最初に最終ブロックを復号する必要があり、
- この結果、最終ブロックが自然な境界上に揃えられなくなり、ハードウェア実装が複雑になります。
これには、最終的な平文ブロックがブロック サイズの倍数になった場合でも、暗号文は暗号文の盗難のない元の動作モードの暗号文と同一になるという利点があります。
CS2
多くの場合、最後の 2 つの暗号文ブロックを入れ替えて、暗号文が完全な最終ブロックで終了し、その後に切り捨てられた最後から 2 番目のブロックが続くようにすると便利です。これにより、暗号文ブロックが自然に整列します。
非盗難モードとの互換性を維持するために、オプション CS2 は、盗まれた暗号文の量がゼロ以外の場合、つまり元のメッセージがブロック サイズの倍数でない場合にのみ、このスワップを実行します。
これにより、自然なアライメントと非スチール モードとの互換性が維持されますが、アライメントされたメッセージ サイズとアライメントされていないメッセージ サイズのケースを別々に処理する必要があります。
CS3
最も一般的な代替案は、最後の 2 つの暗号文ブロックを無条件に交換します。これは、以下の説明で使用される順序です。
暗号文窃取モードの説明
データを暗号化または復号化するには、最後の 2 つのデータ ブロックを除くすべてのデータ ブロックに対して 標準のブロック暗号モードを使用します。
次の手順では、平文の最後の 2 つのブロック ( P n −1およびP n )の処理方法について説明します。ここで、 P n −1の長さは、ビット単位の暗号のブロック サイズB に等しく、最後のブロックP nの長さはMビットです。Kは、使用されているキーです。M は1 からBまでの範囲であるため、P n は完全なブロックである可能性があります。CBC モードの説明では、関係するブロックの直前の暗号文ブロックC n −2も使用します。平文が 2 つのブロック内に収まる場合、これは実際には IV である可能性があります。
この説明では、次の関数と演算子が使用されます。
- Head (data, a ): 「data」文字列の最初のaビットを返します。
- Tail (data, a ): 「data」文字列の最後のaビットを返します。
- Encrypt ( K、 data ): キーKを使用して、 'data' 文字列に対して、基礎となるブロック暗号を暗号化モードで使用します。
- Decrypt ( K、データ): キーKを使用して、 'data' 文字列に対して、基礎となるブロック暗号を復号モードで使用します。
- XOR : ビット単位の排他的論理和。キャリービットを使用しないビット単位の加算と同等です。
- ||: 連結演算子。演算子の両側の文字列を結合します。
- 0 a : 0ビットの文字列。
ECB暗号文の盗難
ECB モードでの暗号文の盗難により、最後の 2 つのブロック内でブロック間の依存関係が導入され、最後の 2 つのブロックのエラー伝播動作が変更されます。
ECB暗号化手順(図参照)

- E n −1 = Encrypt ( K , P n −1 )。P n −1を暗号化してE n −1を作成します。これは標準の ECB モードの動作と同じです。
- C n = Head ( E n −1 , M )。E n −1の最初のMビットを選択してC n を作成します。最終的な暗号文ブロックC nは、最後から 2 番目の暗号文ブロックの先頭のMビットで構成されます。いずれの場合も、最後の 2 つのブロックは、対応する平文ブロックとは異なる順序で送信されます。
- D n = P n || Tail ( E n −1 , B − M )。P n をE n −1の下位ビットで埋めます。
- C n −1 = Encrypt ( K , D n )。D nを暗号化してC n −1を作成します。最初の M ビットについては、これは ECB モードで発生することと同じです (暗号文の順序付けを除く)。最後のB − Mビットについては、これらのデータがこのキーで暗号化されるのはこれが 2 回目です (ステップ 2 のE n −1の生成時にすでに暗号化されています)。
ECBの復号手順
- D n = Decrypt ( K , C n −1 )。C n −1を復号してD nを作成します。これにより、暗号化プロセスのステップ 4 が元に戻されます。
- E n −1 = C n || Tail ( D n , B − M )。抽出した暗号文をD nの末尾にC nに埋め込みます(ECB暗号化プロセスのステップ3で配置されます)。
- P n = Head ( D n , M )。 D nの最初のMビットを選択してP n を作成します。ECB 暗号化プロセスのステップ 3 で説明したように、D nの最初のMビットにはP n が含まれます。この最後の (部分的な場合もある) ブロックを最終的な出力のためにキューに入れます。
- P n −1 = Decrypt ( K , E n −1 )。E n −1を復号してP n −1を作成します。これは暗号化手順 1 の逆になります。
ECB 暗号文窃盗エラーの伝播
C n −1の送信中にビットエラーが発生すると、P n −1とP nの両方がブロック全体で破損します。 C nの送信中にビットエラーが発生すると、 P n −1がブロック全体で破損します。 これは、ECB のエラー伝播動作からの大きな変更です。
CBC暗号文の盗難
CBC では、異なる隣接ブロックの処理間ですでに相互作用があるため、このモードでは CTS の概念的な影響は小さくなります。エラーの伝播が影響を受けます。
CBC暗号化手順
- X n −1 = P n −1 XOR C n −2 。 P n −1と前の暗号文ブロックC n −2との排他的論理和をとって、 X n −1を作成します。 これは標準の CBC モードの動作と同じです。
- E n −1 = Encrypt ( K , X n −1 )。X n −1を暗号化してE n −1を作成します。これは標準のCBCモードの動作と同じです。
- C n = Head ( E n −1 , M )。E n −1の最初のMビットを選択してC n を作成します。最終的な暗号文ブロックC nは、最後から 2 番目の暗号文ブロックの先頭のMビットで構成されます。いずれの場合も、最後の 2 つのブロックは、対応する平文ブロックとは異なる順序で送信されます。
- P = P n || 0 B − M。P n の末尾にゼロを埋め込んで、長さBのPを作成します。このステップでのゼロ埋め込みは、ステップ 5 にとって重要です。
- D n = E n −1 XOR P。E n −1とPの排他的論理和をとってD n を作成します。ブロックの最初のMビットについては、これは CBC モードに相当します。つまり、前のブロックの暗号文E n −1の最初のMビットが、最後の平文ブロックの平文のMビットと XOR されます。手順 4 のPのゼロ パディングは重要です。最後のB − Mビットに対する XOR 演算の効果が、E n −1の最後の B − M ビットをD nの末尾にコピーすることと同等になるためです。これらは、 C nが作成された手順 3 でE n −1から削除されたビットと同じです。
- C n −1 = Encrypt ( K , D n )。D nを暗号化してC n −1を作成します。最初のMビットについては、これは CBC モードで発生することと同じです (暗号文の順序付けを除く)。最後のB − Mビットについては、これらのデータがこのキーで暗号化されるのはこれが 2 回目です (ステップ 2 のE n −1の生成時にすでに暗号化されています)。
CBC 復号化手順
- D n = Decrypt ( K , C n −1 )。C n −1を復号してD nを作成します。これにより、暗号化プロセスのステップ 6 が元に戻されます。
- C = C n || 0 B − M。長さBのブロックCを作成するために、 C n の末尾にゼロを埋め込みます。ステップ 3 で役立つように、C nにゼロを埋め込みます。
- X n = D n XOR C 。 D nとCの排他的論理和をとってX n を作成します。最初のMビットを見ると、このステップではC n (暗号化プロセスのE n −1の最初のMビット) と (現在復号化された) P n XOR ヘッド ( E n −1、M ) の XOR 演算の結果が得られます (暗号化プロセスのステップ 4 ~ 5 を参照)。言い換えると、P nの最初のMビットをCBC 復号化したことになります。最後のB − Mビットを見ると、 E n −1の最後のB − Mビットが復元されます。
- P n = Head ( X n , M )。X nの最初のMビットを選択してP n を作成します。手順 3 で説明したように、 X nの最初のMビットにはP n が含まれます。この最後の (部分的な場合もある) ブロックを最終的な出力のためにキューに入れます。
- E n −1 = C n || 末尾 ( X n , B − M )。 X nの末尾 ( B − M ) ビットをC nに追加して、 E n −1を作成します。手順 3 で説明したように、E n −1は、 C n全体( Mビット長) にX nの最後のB − Mビットを追加したもので構成されます。手順 6 で処理するために、 E n −1 (暗号化プロセスで表示されるE n −1と同じ)を再構成します。
- X n −1 = Decrypt ( K , E n −1 )。E n −1を復号してX n −1を作成します。これは暗号化手順 2 の逆になります 。 X n −1 は暗号化プロセスと同じです。
- P n −1 = X n −1 XOR C n −2。X n −1と前の暗号文ブロックC n −2の排他的論理和をとってP n −1を作成します。最後に、暗号化プロセスのステップ 1 の XOR ステップを逆にします。
CBC 実装ノート
CBC 暗号文の盗難には、標準の CBC インターフェイスを使用して、説明した暗号文の盗難プロセスを実装する巧妙な (ただし不透明な) 方法があります。この方法を使用すると、専用の実装を使用する場合に必要となるものよりも 1 つの余分なブロック復号化操作が復号化段階で必要となり、パフォーマンスが低下します。
標準 CBC インターフェースを使用した CBC 暗号文盗用暗号化
- 最後の部分的な平文ブロックを 0 で埋めます。
- 標準の CBC モードを使用して、パディングされた平文全体を暗号化します。
- 最後の 2 つの暗号文ブロックを交換します。
- 暗号文を元の平文の長さに切り捨てます。
_on_CBC,_encryption_mode.svg/500px-CipherText_Stealing_(CTS)_on_CBC,_encryption_mode.svg.png)
標準 CBC インターフェースを使用した CBC 暗号文の盗難復号化
- D n = Decrypt ( K , C n −1 )。ECBモードを使用して最後から2番目の暗号文ブロックを復号します。
- C n = C n || Tail ( D n , B − M )。最後から2番目の暗号文ブロックのブロック暗号復号の最後のB − Mビットを使用して、暗号文をブロックサイズの最も近い倍数にパディングします。
- 最後の 2 つの暗号文ブロックを交換します。
- 標準の CBC モードを使用して (変更された) 暗号文を復号化します。
- 平文を元の暗号文の長さに切り捨てます。
_on_CBC,_decryption_mode.svg/500px-CipherText_Stealing_(CTS)_on_CBC,_decryption_mode.svg.png)
CBC 暗号文窃盗エラーの伝播
C n −1の送信中にビットエラーが発生すると、 P n −1とP nの両方がブロック全体で破損します。 C nの送信中にビットエラーが発生すると、 P nに対応するビットエラーが発生し、 P n −1がブロック全体で破損します。
参考文献
- デーメン、ジョアン(1995)。 「2.5.1と2.5.2」。暗号およびハッシュ関数の設計、線形および差分暗号解析に基づく戦略(PDF) (博士論文)。ルーヴェン・カトリーケ大学。
- シュナイアー、ブルース (1995)。応用暗号学(第 2 版)。John Wiley & Sons, Inc. pp. 191, 195。ISBN 978-0-471-12845-8。
- マイヤー、カール H.、マティアス、スティーブン M. (1982)。暗号化: コンピュータデータセキュリティの新たな次元。ジョン ワイリー アンド サンズ社。pp. 77–85。ISBN 978-0-471-04892-3。
- R. Baldwin、R. Rivest (1996 年 10 月)。RC5、RC5-CBC、RC5-CBC-Pad、および RC5-CTS アルゴリズム。doi : 10.17487 / RFC2040。RFC 2040 。
- Dworkin, Morris (2011 年 10 月)。ブロック暗号の動作モードに関する推奨事項: CBC モードの暗号文窃取の 3 つのバリエーション(PDF)。米国国立標準技術研究所 (NIST)。NIST 特別出版物 800-38A の補遺。
