密码学之CBC字节翻转攻击

0x01

最近在看内部赛的题目时第一次接触到了CBC翻转字节攻击这个概念吧,写一篇文章记录做个笔记

0x02

必备知识:

CBC(密码分组链接模式)实际上就是将前一个分组的加密后的密文与当前分组的明文进行XOR操作,然后在经过加密,从而得到下一个
分组加密需要的密文,加密的密文(打个比方,第一次加密后的数据作为第二次加密的基础与第二个明文分组进行XOR操作,以此类推),所以要引入一个长度等于一个分组长度的比特序列来充当前一个分组加密后的密文,这个序列被称为初始化向量 ,一般用IV表示。

加密示意图:

Plaintext: 要加密的明文
IV:初始化向量
Key:加密需要用到的的算法
Ciphertext:加密后的密文
解密示意图:

如图,我们改变Ciphertext-N-1(密文-N-1)的一个字节,然后与下一个解密后的组块异或,我们就可以得到一个不同的明文了,这样就能达到预期的效果。有些不好理解。。。举个实例说明一下

example

有这么一个明文序列: a=’abcdefg’
我想要改变第五个字节,也就是e 改成h
假设每个分组的固定长度是2,a可以分成这么几组:

  • ab
  • cd
  • ef
  • g
    可以分成这么四组,由前面的知识可以知道,前一个分组的密文m要跟明文分组进行XOR以后再加密得到下一个密文分组n,解密的时候反过来,先把密文解密,然后再与前一个密文分组进行XOR操作,得到明文,
    拿这个例子来说的话,想要改变的字节再第三个分组,我们需要改变第二个分组的第一个位置的密文,也就是偏移量为1
    大体流程如下:
    1.加密这个明文: str=encrypt(a)
    2.异或操作: str[2] = chr(ord(str[2]^ord(‘e’)^ord(‘h’)))(下标从零开始)
    3.解密密文,查看结果: decrypt(str)
    第二部异或的原理(参考dalao文章):
    A = Decrypt(密文)与B = 前一个密文分组异或后最终得到C =e 等价C=A XOR B
    由异或性质可知,A = B XOR C
    而且,A XOR B XOR C等于0
    所以,我们可以在XOR运算的末尾处设置我们自己的值,就像这样:A XOR B XOR C XOR “h”会在第三个分组的明文当中,偏移量为1的字节处得到h。

    0x03

    这一部分东西感觉刚开始看有点懵逼==、看了一会才有点理解了,在此奉上参考的大佬的文章。
    传送门一
    传送门二

本文标题:密码学之CBC字节翻转攻击

文章作者:tkcharlotte

发布时间:2017年07月11日 - 21:07

最后更新:2018年02月07日 - 18:02

原始链接:boombao.net/2017/07/11/CBC字节翻转/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------