CBC字节翻转攻击

  1. 引入
  2. 开始
    1. 预备知识
      1. 异或简介
      2. 异或运算律简介
    2. CBC加密解密及攻击方法

//资料来源:INFOSEC INSTITUTE

引入

CBC加密在大一的时候就接触过了,当时稍稍了解了下,但也是一知半解

正好最近刷题涉及到了这块内容,故写此篇记录一下

开始

预备知识

首先得了解一下什么是异或以及异或运算的各种性质

异或简介

异或的数学符号为,计算机符号为xor,编程时常用^

其运算步骤是(以3^5=6为例)

将字符或数字转为二进制

3 = 0011
5 = 0101

相同取0,不同取1

结果为

3 = 0011
5 = 0101
6 = 0110

异或运算律简介

异或满足交换律结合律自反性

交换律:a^b = b^a

结合律:a^(b^c) = (a^b)^c

还有一个性质是: a^b=c <=> a=b^c

自反性a^b^b = a (CBC主要用了这个性质)

(还有各种律我就不写了感兴趣可以自己查查)

CBC加密解密及攻击方法

先贴一下CBC加密和攻击的原理图

首先是加密原理图

解密原理图

攻击原理图

这里的key一般是用于解密各种对称加密的

图中剩下的名词对照英文字典翻译就好,这里就不多解释了

(一般以16位为一个Block)

根据解密原理图可得

/*
 * C1——Block1的密文 (可获得)
 * C1_build——经恶意更改后Block1的密文(可控)
 * E2——Block2经过key解密的密文 (不可控)
 * plain2——明文 (可获得)
 * plain2_build——你想更改的明文(攻击最终的目的就是更改这个)
 */


E2 xor C1 = plain2

E2 xor C1_build = plain2_build

由异或运算a^b=c <=> a=b^c可得

C1_build = plain2 xor C1 xor plain2_build

所以根据plain2(可控),C1(可控),plain2_build(可构造)就可以计算出C1_build

之后就可以更改Block2的内容了

那么问题来了

Block1中的C1被更改后,解密结果plain1一定会被‘迫害’,如何解决?

既然plain1IV的影响,那我们就从IV下手

思路跟上边更改plain2_build是一样的

/*
 * plain1_changed——被迫害的Block1中的明文
 * plain1_build——你想更改的明文
 * IV——初始向量
 * IV_build——构造出的初始向量
 */


E1 xor IV = plain1_changed

E1 xor IV_build = plain1_build

依然由a^b=c <=> a=b^c可得

IV_build = IV xor plain1_build xor plain1_changed

如果我的文章能帮到您的话我会很开心.如需转载记得注明出处:)
目录