首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CBC (密码块链)自愈性的解释

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

Stack Overflow用户
提问于 2014-10-11 19:28:00
回答 2查看 5.2K关注 0票数 3

维基百科

CBC模式具有自愈性:如果修改密码的一个块,错误最多会传播两个块。

编写的示例:

将块大小设为64位。原来的明文如下:

代码语言:javascript
复制
3231343336353837  3231343336353837  3231343336353837  • • •

正确的密码文本是:

代码语言:javascript
复制
ef7c4bb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256 • • •

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

代码语言:javascript
复制
ef7c4cb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256  • • •

然后将其解密为:

代码语言:javascript
复制
efca61e19f4836f1  3231333336353837  3231343336353837  • • •

问题:

我很难理解CBC (密码块链)的自愈特性,我认为一个虚构的例子可能会有所帮助,但我现在更困惑了。任何帮助都会很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-11 22:26:02

就我个人而言,我发现解密图形对于这类问题非常有用。来自维基百科(公共领域图像)

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

红色点表示部分损坏的输入,而实心红线表示完全块损坏。

在启动之前,我将把原始明文块通过p3编号为p1,通过p3'将损坏的块编号为p1',通过c3将正确的密文块编号为c1,通过c3'将损坏的块编号为c1' >

代码语言:javascript
复制
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)不可区分--我们得到一个完全(伪)随机块作为解密函数的输出:

代码语言:javascript
复制
    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,所以我们以

代码语言:javascript
复制
    dec(      c1        ,k) XOR IV =         p1       
<=> dec(ef7c4bb2b4ce6f3b,k) XOR IV = 3231343336353837 
    dec(      c1'       ,k) XOR IV =         p1'      
<=> dec(ef7c4cb2b4ce6f3b,k) XOR IV = efca61e19f4836f1 

这表明整个街区已经被摧毁(底部是完全红色的)。

现在转到第二个块:我们重新开始解密密文块,因为在这个块中没有发生任何损坏,所以效果很好:

代码语言:javascript
复制
    dec(      c2        ,k) =         p2       XOR         c1
<=> dec(f6266e3a97af0e2c,k) = 3231343336353837 XOR ef7c4bb2b4ce6f3b
                                                    ^

注意,这个公式在任何地方都使用未损坏的块。提醒您,在加密过程中,这样生成了这个块:

代码语言:javascript
复制
             c2      = enc(        p2       XOR         c1      ,k)
<=> f6266e3a97af0e2c = enc(3231343336353837 XOR ef7c4bb2b4ce6f3b,k)

下一步是使用前面的块(这次不是IV,而是c1')的XOR应用程序。前一个块c1‘已损坏:

代码语言:javascript
复制
    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,并在任何地方替换它:

代码语言:javascript
复制
    dec(      c2        ,k) XOR       c1'        =         p2       XOR 0000007000000000
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR 0000007000000000

最后简化了p2 XOR 0000007000000000 = p2'

代码语言:javascript
复制
    dec(      c2        ,k) XOR       c1'        =         p2'      
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231333336353837

您可以看到,第一个密文块c1'的原始损坏(c1')被逐字传输到第二个明文块p2',但它在其他方面保持完整(就像图形中的大部分白色块所显示的,其中一个方块是红色的)。CBC的这一特殊特性可能导致对现实世界系统(如填充甲骨文攻击 )的攻击。

第三个块非常无聊:没有对解密和异或的输入,因此p1=p1'和那里的一切都很好。

票数 14
EN

Stack Overflow用户

发布于 2014-10-11 21:35:16

CBC模式下解密时,首先使用密钥解密所讨论的块,然后用密文中的前一个块对其进行异或解密。看看CBC模式维基上的绘制

由于您只需要在CBC模式下解密当前和以前的块,密文中更改的字节的效果只会影响它所在的块,以及下面的块(如果存在的话)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26318430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档