Encryption 解释CBC(密码块链接)的自愈性
维基百科: CBC模式具有自愈特性:如果密码的一个块是 更改后,错误最多传播两个块 虚构的例子: 让块大小为64位。原文为:Encryption 解释CBC(密码块链接)的自愈性,encryption,cryptography,cbc-mode,Encryption,Cryptography,Cbc Mode,维基百科: CBC模式具有自愈特性:如果密码的一个块是 更改后,错误最多传播两个块 虚构的例子: 让块大小为64位。原文为: 3231343336353837 3231343336353837 3231343336353837 • • • 正确的密码文本为: ef7c4bb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • • 如果密文损坏,字节'0x4b'更改为'0x4c': ef7c4cb2b4ce6f3b f6266e3a97af
3231343336353837 3231343336353837 3231343336353837 • • •
正确的密码文本为:
ef7c4bb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •
如果密文损坏,字节'0x4b'
更改为'0x4c'
:
ef7c4cb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • •
然后将其解密为:
efca61e19f4836f1 3231333336353837 3231343336353837 • • •
问题:
我很难理解CBC(密码块链接)的自愈特性,我认为虚构的例子可能会有所帮助,但我现在更困惑了。任何帮助都会很好。在CBC模式下解密时首先使用密钥解密有问题的块,然后将其与密文中的前一个块进行异或解密。查看上的CBC模式
由于在CBC模式下解密只需要当前和以前的块,密文中更改字节的效果只会影响它所在的块和下面的块(如果存在)。我个人认为解密图形对此类问题非常有用: 现在,让我们添加一些损坏: 红点表示部分损坏的输入,而实心红线表示完全的块损坏 开始之前的一些符号:我将原始明文块编号为
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
让我们看一下第一个块: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
最后简化p2xor 000000700000000=p2':
dec( c2 ,k) XOR c1' = p2'
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231333336353837
dec(c2,k)XOR c1'=p2'
dec(f6266e3a97af0e2c,k)异或ef7c4cb2b4ce6f3b=323133336353837
您可以看到,第一个密文块c1'
的原始损坏(0x07
)被逐字传输到第二个明文块p2'
,但它在其他方面保持不变(如图中大部分为白色的块所示,其中一个正方形为红色)。CBC的这种特殊属性可能导致对现实世界系统的攻击,例如
第三个块非常无聊:解密和XOR的输入没有改变,因此
p1=p1'
那里一切都很好。如果您提供生成示例的代码,包括IV和密钥,那么您的问题会更好,这样其他人就会知道如何重现您的示例。我猜你用过DES?@英仙座是的。我确实使用了DES。
dec( c2 ,k) = p2 XOR c1
<=> dec(f6266e3a97af0e2c,k) = 3231343336353837 XOR ef7c4bb2b4ce6f3b
^
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
dec( c2 ,k) XOR c1' = p2 XOR 0000007000000000
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR 0000007000000000
dec( c2 ,k) XOR c1' = p2'
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231333336353837