维基百科:
CBC模式具有自我修复属性:如果密码的一个块是 更改后,错误最多传播两个块。
编组示例:
让块大小为64位。原文是:
3231343336353837 3231343336353837 3231343336353837 • • •
正确的密文是:
ef7c4bb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •
如果密文已损坏,则字节'0x4b'
更改为'0x4c'
:
ef7c4cb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •
然后将其解密为:
efca61e19f4836f1 3231333336353837 3231343336353837 • • •
问题:
我很难理解CBC(Cipher Block Chaining)的自我修复属性,我认为一个合适的例子可能会有所帮助,但我现在更加困惑。任何帮助都会很棒。
答案 0 :(得分:12)
就个人而言,我发现解密图形对这类问题非常有帮助。 From the Wikipedia (public domain image):
现在让我们添加一些腐败:
红点表示部分损坏的输入,而红线表示完整的块损坏。
我们开始之前的一些符号:我会将原始明文块编号为p1
到p3
,将损坏的块编号为p1'
到{{1 },正确的密文块阻为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
)。由于块密码被设计为伪随机置换 - 这是一个与随机函数无法区分的双射函数(不知道密钥0x4b ^ 0x4c = 0x07 = 4+2+1
) - 我们得到一个完全(伪)随机块作为输出解密功能:
k
作为下一步,IV是异或,所以我们最终得到
dec( c1 ,k) = p1 XOR IV
<=> dec(ef7c4bb2b4ce6f3b,k) = 3231343336353837 XOR IV
dec( c1' ,k) = p1' XOR IV
<=> dec(ef7c4cb2b4ce6f3b,k) = efca61e19f4836f1 XOR IV
表示整个区块被破坏(底部是完整的红色区块)。
现在,转到第二个块:我们再次通过解密密文块来启动,该块工作正常,因为块中没有发生损坏:
dec( c1 ,k) XOR IV = p1
<=> dec(ef7c4bb2b4ce6f3b,k) XOR IV = 3231343336353837
dec( c1' ,k) XOR IV = p1'
<=> dec(ef7c4cb2b4ce6f3b,k) XOR IV = efca61e19f4836f1
请注意,此公式在任何地方都使用未损坏的块。提醒一下,这个块在加密过程中是这样生成的:
dec( c2 ,k) = p2 XOR c1
<=> dec(f6266e3a97af0e2c,k) = 3231343336353837 XOR ef7c4bb2b4ce6f3b
^
下一步是再次应用前一个块的XOR(这次不是IV,而是c1')。之前的块c1'已损坏:
c2 = enc( p2 XOR c1 ,k)
<=> f6266e3a97af0e2c = enc(3231343336353837 XOR ef7c4bb2b4ce6f3b,k)
现在我们实际上可以将 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'
,但它保持不变(如图所示)通过图形中的大多数白色块,单个方块为红色)。 CBC的这种独特属性可能导致对真实世界系统的攻击,如padding oracle attacks。
第三个区块很无聊:解密和XOR没有输入,因此p2'
并且一切都很好。
答案 1 :(得分:1)
当在 CBC模式中解密时,通过首先使用密钥解密所讨论的块来解密块,然后将其与密文中的前一个块进行异或。在wiki
上查看 CBC模式图纸由于在CBC模式下只需要当前和前一个用于解密的块,因此密文中已更改字节的影响只会影响它所在的块以及后面的块(如果存在)。