维基百科:
CBC模式具有自愈性:如果修改密码的一个块,错误最多会传播两个块。
编写的示例:
将块大小设为64位。原来的明文如下:
3231343336353837 3231343336353837 3231343336353837 • • •正确的密码文本是:
ef7c4bb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •如果密文已损坏,则字节'0x4b'更改为'0x4c':
ef7c4cb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •然后将其解密为:
efca61e19f4836f1 3231333336353837 3231343336353837 • • •问题:
我很难理解CBC (密码块链)的自愈特性,我认为一个虚构的例子可能会有所帮助,但我现在更困惑了。任何帮助都会很好。
发布于 2014-10-11 22:26:02
就我个人而言,我发现解密图形对于这类问题非常有用。来自维基百科(公共领域图像)

现在,让我们添加一些腐败:

红色点表示部分损坏的输入,而实心红线表示完全块损坏。
在启动之前,我将把原始明文块通过p3编号为p1,通过p3'将损坏的块编号为p1',通过c3将正确的密文块编号为c1,通过c3'将损坏的块编号为c1' >
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)不可区分--我们得到一个完全(伪)随机块作为解密函数的输出:
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是XORed,所以我们以
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
^注意,这个公式在任何地方都使用未损坏的块。提醒您,在加密过程中,这样生成了这个块:
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您可以看到,第一个密文块c1'的原始损坏(c1')被逐字传输到第二个明文块p2',但它在其他方面保持完整(就像图形中的大部分白色块所显示的,其中一个方块是红色的)。CBC的这一特殊特性可能导致对现实世界系统(如填充甲骨文攻击 )的攻击。
第三个块非常无聊:没有对解密和异或的输入,因此p1=p1'和那里的一切都很好。
发布于 2014-10-11 21:35:16
在CBC模式下解密时,首先使用密钥解密所讨论的块,然后用密文中的前一个块对其进行异或解密。看看CBC模式在维基上的绘制
由于您只需要在CBC模式下解密当前和以前的块,密文中更改的字节的效果只会影响它所在的块,以及下面的块(如果存在的话)。
https://stackoverflow.com/questions/26318430
复制相似问题