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

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

红点代表部分损坏的输入,而红色实线代表完整的块损坏.
一些符号在我们开始之前我会为数字原始明文块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'一切都很好.