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

Aph*_*pha 3 encryption cryptography cbc-mode

维基百科:

CBC模式具有自我修复属性:如果密码的一个块被更改,则错误最多传播两个块.

编组示例:

设块大小为64位.原文是:

3231343336353837  3231343336353837  3231343336353837  • • •
Run Code Online (Sandbox Code Playgroud)

正确的密文是:

ef7c4bb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256 • • •
Run Code Online (Sandbox Code Playgroud)

如果密文已损坏,则字节'0x4b'更改为'0x4c':

ef7c4cb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256  • • •
Run Code Online (Sandbox Code Playgroud)

然后它被解密为:

efca61e19f4836f1  3231333336353837  3231343336353837  • • •
Run Code Online (Sandbox Code Playgroud)

题:

我很难理解CBC(Cipher Block Chaining)的自我修复属性,我认为一个合成的例子可能会有所帮助,但我现在更加困惑.任何帮助都会很棒.

Per*_*ids 13

就个人而言,我发现解密图形对这类问题非常有帮助.来自维基百科(公共领域图片):

原始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
Run Code Online (Sandbox Code Playgroud)

还有一些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
Run Code Online (Sandbox Code Playgroud)

作为下一步,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 
Run Code Online (Sandbox Code Playgroud)

这表明整个街区都被摧毁了(底部是完整的红色区块).

现在,转到第二个块:我们再次通过解密密文块来启动,该块工作正常,因为块中没有发生损坏:

    dec(      c2        ,k) =         p2       XOR         c1
<=> dec(f6266e3a97af0e2c,k) = 3231343336353837 XOR ef7c4bb2b4ce6f3b
                                                    ^
Run Code Online (Sandbox Code Playgroud)

请注意,此公式在任何地方都使用未损坏的块.提醒一下,这个块是在加密过程中生成的:

             c2      = enc(        p2       XOR         c1      ,k)
<=> f6266e3a97af0e2c = enc(3231343336353837 XOR ef7c4bb2b4ce6f3b,k)
Run Code Online (Sandbox Code Playgroud)

下一步是再次应用前一个块的XOR(这次不是IV,而是c1').之前的块c1'已损坏:

    dec(      c2        ,k) XOR       c1'        =         p2       XOR         c1       XOR        c1'
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR ef7c4bb2b4ce6f3b XOR ef7c4cb2b4ce6f3b
Run Code Online (Sandbox Code Playgroud)

现在我们可以实际计算c1 XOR c1'(错误)c1 XOR c1' = 0000007000000000并将其替换为无处不在:

    dec(      c2        ,k) XOR       c1'        =         p2       XOR 0000007000000000
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR 0000007000000000
Run Code Online (Sandbox Code Playgroud)

最后简化p2 XOR 0000007000000000 = p2':

    dec(      c2        ,k) XOR       c1'        =         p2'      
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231333336353837
Run Code Online (Sandbox Code Playgroud)

您会看到0x07第一个密文块的原始corruption()c1'被逐字传送到第二个明文块p2',但它保持原样(完全由图中的大多数白色块可视化,单个方块为红色).CBC的这种独特属性可能导致对现实世界系统的攻击,例如填充oracle攻击.

第三个块很无聊:解密和XOR没有输入,因此p1=p1'一切都很好.