個人的には、この種の質問には解読グラフィックスが非常に役立つと思います。ウィキペディアから (パブリック ドメインの画像) :

次に、いくつかの破損を追加しましょう。

赤い点は部分的な破損した入力を表し、赤い実線は完全なブロックの破損を表します。
始める前のいくつかの表記法: 元の平文ブロックをp1
~p3
、破損したものをp1'
~p3'
、正しい暗号文ブロックをc1
~c3
、破損したブロックを ~ として番号付けc1'
しc3'
ます。
3231343336353837 3231343336353837 3231343336353837 • • •
p1 p2 p3
ef7c4bb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •
c1 c2 c3
ef7c4cb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •
c1' c2'=c3 c3'=c3
efca61e19f4836f1 3231333336353837 3231343336353837 • • •
p1' p2' p3'=p3
IV
あなたの例で与えていないものもあります。
最初のブロックを見てみましょう: ブロック暗号の入力の 3 ビットが変更されます ( 0x4b ^ 0x4c = 0x07 = 4+2+1
)。ブロック暗号は疑似ランダム順列になるように設計されているため、これはランダム関数と区別できない全単射関数です (鍵の知識なしk
) - 復号化関数の出力として完全に (疑似) ランダム ブロックを取得します。
dec( c1 ,k) = p1 XOR IV
<=> dec(ef7c4bb2b4ce6f3b,k) = 3231343336353837 XOR IV
dec( c1' ,k) = p1' XOR IV
<=> dec(ef7c4cb2b4ce6f3b,k) = efca61e19f4836f1 XOR IV
次のステップとして、IV は XOR されるため、最終的には
dec( c1 ,k) XOR IV = p1
<=> dec(ef7c4bb2b4ce6f3b,k) XOR IV = 3231343336353837
dec( c1' ,k) XOR IV = p1'
<=> dec(ef7c4cb2b4ce6f3b,k) XOR IV = efca61e19f4836f1
これは、ブロック全体が破壊されたことを示しています (下部の完全な赤いブロック)。
次に、2 番目のブロックに進みます。ブロックで破損が発生していないため、暗号文ブロックを復号化することから再び開始します。
dec( c2 ,k) = p2 XOR c1
<=> dec(f6266e3a97af0e2c,k) = 3231343336353837 XOR ef7c4bb2b4ce6f3b
^
この式では、どこでも破損していないブロックが使用されていることに注意してください。念のため、このブロックは暗号化中に次のように生成されました。
c2 = enc( p2 XOR c1 ,k)
<=> f6266e3a97af0e2c = enc(3231343336353837 XOR ef7c4bb2b4ce6f3b,k)
次のステップは、前のブロック (今回は IV ではなく c1') との XOR の適用です。この前のブロック c1' は破損しています:
dec( c2 ,k) XOR c1' = p2 XOR c1 XOR c1'
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR ef7c4bb2b4ce6f3b XOR ef7c4cb2b4ce6f3b
c1 XOR c1'
これで、(エラー) を実際に計算c1 XOR c1' = 0000007000000000
して、どこでも置き換えることができます。
dec( c2 ,k) XOR c1' = p2 XOR 0000007000000000
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR 0000007000000000
そして最後に単純化しp2 XOR 0000007000000000 = p2'
ます:
dec( c2 ,k) XOR c1' = p2'
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231333336353837
最初の暗号文ブロックの元の破損 ( 0x07
) がc1'
2 番目の平文ブロックに逐語的に転送されていることがわかりますがp2'
、それ以外はそのまま残ります (図のほとんどが白いブロックで視覚化され、単一の四角が赤くなっています)。CBC のこの特異な特性は、オラクル攻撃のパディングなど、現実世界のシステムに対する攻撃につながる可能性があります。
3 番目のブロックは非常に退屈です。復号化と XOR への入力が変更されていないためp1=p1'
、すべて問題ありません。