Encryption 解释CBC(密码块链接)的自愈性

Encryption 解释CBC(密码块链接)的自愈性,encryption,cryptography,cbc-mode,Encryption,Cryptography,Cbc Mode,维基百科: CBC模式具有自愈特性:如果密码的一个块是 更改后,错误最多传播两个块 虚构的例子: 让块大小为64位。原文为: 3231343336353837 3231343336353837 3231343336353837 • • • 正确的密码文本为: ef7c4bb2b4ce6f3b f6266e3a97af0e2c 746ab9a6308f4256 • • • 如果密文损坏,字节'0x4b'更改为'0x4c': ef7c4cb2b4ce6f3b f6266e3a97af

维基百科

CBC模式具有自愈特性:如果密码的一个块是 更改后,错误最多传播两个块

虚构的例子:

让块大小为64位。原文为:

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