跳至主要內容

2.对称加密算法

Someijam大约 7 分钟CTFCryptography

对称加密算法

DES

Data Encryption Standard是上世纪70年代开始广泛采用的对称加密算法。

DES的加密过程是将64bit的明文用56bit的密钥加密生成64bit的密文,解密过程恰好相反。因为加密解密使用的是相同的密钥,所以称为“对称加密算法”。

在加密的过程中,明文会经历多次加密变成密文,每次称为“一轮”,下面详细地介绍一下过程。

  • 第一轮:输入64bit的明文,均分为左右两侧,各32bit。

    右32bit发送至轮函数,轮函数根据右32bit和此轮的密钥来生成一个神秘的32bit数据

    左32bit与刚刚生成的神秘32bit数据异或运算,作为输出的左侧

    输入的右侧32bit不处理,直接作为输出右侧

  • 后续的轮:对调输入的左右32bit数据,各轮分别使用新的密钥,与第一轮类似处理。

  • 最后一轮:同之前的轮,输出后的结果不再对调,作为最终结果。

这样就生成了密文,解密时,我们注意到对于单轮操作,把密文当成明文再进行一次加密,便可得到明文,那么对于DES,按照反过来的顺序对密文进行加密操作即可找回明文。

三重DES

顾名思义,是由3次DES加密的步骤构成。

3DES的加密过程是:将明文使用3个DES加密的密钥进行这三次操作:

  • 使用密钥1对明文执行加密步骤,得到密文1
  • 使用密钥2对密文1执行解密步骤,得到密文2
  • 使用密钥3对密文2执行加密步骤,得到密文3
  • 将密文3作为输出密文

为什么不直接加密3次呢?这是为了对上面谈到的普通DES作兼容,当3个密钥相同时,3DES就退化为了DES,也就是说3DES兼容DES。

与DES相似,3DES解密过程和加密过程正好相反,密钥也都是之前的密钥。

在人们的生产实践中,随着近来计算机技术的发展,由于DES密钥长度过短,很容易通过枚举的方式暴力破解,现在已经不再推荐使用。

AES

在DES无法满足现在的加密安全性要求时,AES诞生了,正如其名,A(Advance)即为“高级”的意思,那么高级在哪些地方呢?

以AES-128为例,使用了128bit(16B)的密钥来加密单位明文(也是128bit,16B),密钥空间大大增加,现代计算机通过暴力枚举几乎覆盖不了多少。当然也具有一定的量子抗性,Grover's algorithmopen in new window可以用O(N)的时间搜索O(N)级别的空间,所以未来的AES-256在这种情况下也可以提供到当前AES-128的安全性。

(不要觉得随机枚举很厉害,讨论这种问题,要认为大家都是天弃之子,我不信你的运气一直都很好)

AES加密算法由密钥扩展和多轮加密两部分构成。此处暂时略去密钥扩展算法的过程。

多轮加密中会用到以下几种操作:

  • AddRoundKey:单位明文和当前轮的密钥进行异或运算。
  • SubBytes:单位明文中的每一个字节都替换为表(即S盒)中对应的字节。
  • ShiftRows:单位明文的后三以字节为单位进行循环移动,分别移动1次、2次和3次。
  • MixColumns:单位明文和给定的矩阵在Rijndael‘s Galois Field进行矩阵乘法。

每一轮加密进行的操作如图所示:

AES加密过程(CryptoHack)
AES加密过程(CryptoHack)

以上就是AES对单位明文加密的操作流程。当然,每一步具体的细节比较复杂就不打算讲了,推荐一个网站https://formaestudio.com/rijndaelinspector/archivos/Rijndael_Animation_v4_eng-html5.html,这里生动形象地给大家讲了AES的加密过程,看完之后手写一个AES似乎也不难了。

对明文的分组操作

当处理长消息时,需要把长消息进行分组,每组长度要等于单位明文(16B),对于由长消息产生的一大坨明文分组,我们有以下的操作进行加密。

ECB:

ECB Mode
ECB Mode

这种分组模式比较容易理解,一次加密一组明文,可以并行操作,效率很高。但是有个很致命的问题,也是各自独立加密的缺陷。假如对一张图片上像素数据进行加密,很有可能会加密成这个样子……

ECB示例1示例1原图

加密成这样,相信大家都看出来原图画的是啥了,作为一名资深iKun这个问题显然不难回答。

也许还有同学不认识他,比如我,那再举一个例子吧:

ECB示例2
ECB示例2
示例2原图
示例2原图

虽然被加密成这样,但是还是可以看出来是一个男孩子正在朝右边看,漏出来上半身,似乎还打着一把伞,上面的发型虽然模糊,但是还是很容易看得出来图片里的是森岛帆高(天气之子怎么能不认识?)。

上面举的例子图片色彩都比较丰富,但是如果是白底黑字写着flag的图片呢?大家可以自己尝试一下然后给其他人看看能不能看出flag是多少。

所以ECB分组加密由于各块独立加密的特点,对于图片这样有着很强整体特征的信息,加密后还是会暴露出不少信息的。

CBC:

CBC Mode
CBC Mode

对于CBC模式,我们可以看到,除了第一组是有一个初始向量(就是乱搓的16字节),后面所有的分组加密都依赖着前面组加密后的数据,这样,前面的内容就会被“扩散”到后面,影响后面的加密。这样的方式对于图片之类的信息而言,加密后就会变得难以辨认。比如上面森岛帆高的照片经过CBC模式的加密后就会变成这个样子:

CBC示例
CBC示例

看得出来,这已经算是把帆高“搅拌均匀了”,再也看不到一个人影。

当然这种方法最大的缺点就是慢,必须挨个挨个地加密。

其实不知道大家发现没有,CBC的初始向量iv往往是已知的,知道了iv,我们可以发现如果任意修改第一组明文,但是iv配合得好,第一组可以产生和之前一样的密文。这其实是字节翻转攻击的一种简单形式,在某些需要用户加密Cookie传输到网页服务端时可以通过修改,让不是Admin的用户跟Admin用户产生相同的Cookie,进而伪装身份。

其他明文分组操作

除了ECB和CBC,常见的操作还有OFB、CTR和CFB。碍于篇幅这里只做一点简单介绍。

OFB Mode
OFB Mode
CTR Mode
CTR Mode

OFB Mode将密钥进行一次次地加密,CTR Mode将“随机数+计数“用密钥加密,这样每一个明文分组都用上了不同的密钥。

仔细观察的话,这些模式其实都将之前的块加密模式变成了流密码模式。值得注意的是,这些加密都是“对称”的,此处的“对称”不是指对称密钥,而是将明文加密后得到密文,再将密文加密就会得到明文。所以如果攻击者手里有想破解的密文,此刻他又可以访问到加密机器的话……