本文转自先知社区:
https://xz.aliyun.com/t/4552
现在无论你是google还是百度,"字节反转攻击"的搜索结果整整几页都是"CBC字节反转攻击",看来字节反转攻击和CBC模式结合的想法已经可以说是深入人心,毕竟它的名字就叫"CBC反转字节攻击",但是不是这种攻击只有CBC分组模式才有呢?如果不用CBC分组模式,是不是就不存在这种重放攻击呢?笔者就这个问题进行了研究。
CBC模式下的字节反转攻击想必大家都不陌生了,这种攻击方式和分组加密的加密算法无关,是在处理明文加密后的密文块时出现了漏洞:前一块的密文可以影响后一块的明文。
这种图引用自国外一个大佬的文章,攻击手法是简单明了的:
C1 xor D(C2) = P2
那么我们令C1=C1 xor P2 xor P发送给服务器,其中P是我们想要篡改的明文,那么服务器会计算:
(C1 xor P2 xor P) xor D(C2) = (P2 xor D(C2)) xor P2 xor P xor D(C2) = P
也就达到了篡改的效果,下面是作者自己写的测试demo
运行结果为:
前16个字节乱码是因为我们篡改了C1后,对应的D(C1)也发生了改变
上实验室做实验:《CBC字节翻转攻击》
http://www.hetianlab.com/expc.do?ec=ECIDf328-1dc9-464c-918b-543b4a2d6590
通过实验了解CBC模式实现流程、异或运算的高级应用、python中crypto库的使用以及cbc字节翻转攻击的原理与代码实现
CFB模式可以将块密码转换为同步的流密码。流密码通俗点讲就是将明文逐字节的进行加密,它生成密钥流块,然后与明文块进行异或,然后获得密文。
先来看一下CFB的加解密模式吧,图片选自wikipedia:
那么按道理说,我们如果将密文的第一块反转,那么明文的第一块也应该被对应篡改,但事实并非如此,我们看这个测试demo
运行结果如下:
一片乱码?但是如果你仔细观察的话,会发现其实第一个字符已经被改成了2,那为什么后面的都是乱码呢?
我们修改一下代码,只更改第一个字符:
ct = strxor(strxor(cipher[:1], '1'*1), '2'*1)+cipher[1:]
程序运行结果如下:
第一个字符依然是2,但是为什么后面有15个字符没有被篡改呢?
其实,wikipedia的图并不能很好的展示CFB的工作模式 ,真实的CFB模式是这样的:
图中的Shift register代表的是移位寄存器,图中的s一般代表的是8bit也就是1字节,同时,如果我们更改了Ci,那么Ci是要被存放到下一个移位寄存器里的,并且这个Ci会一直保存在寄存器里,直到它慢慢从寄存器移出去,所以这个Ci会影响128/8=16个字节的明文,故最后有32-1-16=15个字节的明文没有受影响,所以,CFB模式也是有字节反转攻击的,只是我们每次只能改动一个字节,完整的攻击demo如下:
程序运行结果为:
OFB和CFB类似,也是将块密码转换为流密码的一种分组模式,加解密图示如下:
可以从解密模式发现,OFB模式和CBC模式比较相似,并且如果其中一块的密文进行了改变的话,并不会影响它后面的密文
所以类似的,OFB模式也存在字节反转攻击,同时由于流密码的性质,我们可以很简单的做到对明文任意长度字符的篡改
demo如下:
运行结果如下
虽然名字叫做"CBC字节反转攻击",但并不是只有CBC模式才会有这种攻击手法,CFB和OFB模式都是不能抵御这种攻击的,不能认为如果不用CBC模式以后就能完全避免这种密文重放攻击了。
大家有好的技术原创文章
欢迎投稿至邮箱:[email protected]
合天会根据文章的时效、新颖、文笔、实用等多方面评判给予200元-800元不等的稿费哦
有才能的你快来投稿吧!
了解投稿详情点击——重金悬赏 | 合天原创投稿涨稿费啦!