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

时间:2014-10-11 19:28:01

标签: encryption cryptography cbc-mode

维基百科

  

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

编组示例:

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

3231343336353837  3231343336353837  3231343336353837  • • •

正确的密文是:

ef7c4bb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256 • • •

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

ef7c4cb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256  • • •

然后将其解密为:

efca61e19f4836f1  3231333336353837  3231343336353837  • • •

问题:

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

2 个答案:

答案 0 :(得分:12)

就个人而言,我发现解密图形对这类问题非常有帮助。 From the Wikipedia (public domain image)

Original CBC decryption

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

Corrupted CBC decryption

红点表示部分损坏的输入,而红线表示完整的块损坏。

我们开始之前的一些符号:我会将原始明文块编号为p1p3,将损坏的块编号为p1'到{{1 },正确的密文块阻为p3'c1,损坏的密文为c3c1'

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模式下只需要当前和前一个用于解密的块,因此密文中已更改字节的影响只会影响它所在的​​块以及后面的块(如果存在)。