【逆向】AES编码解码基础

序言

本文主要讲述AES加密算法的基础知识,其内容主要用于逆向分析算法部分的基础铺垫,如需文章以外的知识请自行查阅相关资料。

AES简介

AES(Advanced Encryption Standard)是取代其前任标准(DES)而成为新标准的一种对称加密算法
DES因为应用时间较早,密文已经可以在短时间内被破译,所以现在已经基本不再使用。
AES分组长度固定位128位(bit),而密钥长度分别是128、192、256位。

AES算法

AES使用Rijndael分组密码算法,它由多个轮构成,其中每一轮分为4个步骤:SubBytes、ShiftRows、MixColumns、AddRoundkey

1. SubBytes:将每一组16字节的明文数据以每个字节的值(0-255)为索引,从一张拥有256个值得表中查找对应值进行替换(类似Base64的查表替换)。
2. ShiftRows:将以4字节为单位的行按照一定的规则向左平移,且每一行平移的字节数不同。
3. MixColumns:对一个4字节的值进行位运算,将其变为另一个4字节的值。
4. AddRoundkey:将MixColumns的输出与轮密钥进行xor异或。
// 以上就是Rijndael算法一轮的计算操作,实际上在Rijndael算法中需要重复进行多轮这样的运算。

流密码

对数据流进行连续处理的密码算法,流密码一般以1bit、8bit、32bit等单位进行加密解密运算。
流密码需要对一串数据进行连续处理,因此需要保持内部状态。

分组密码

每次只能处理特定长度的一块数据的密码算法,一个分组的比特数(bit)就称为:分组长度。
AES的分组长度是128bit(16字节),因此AES一次可以加密128bit的明文,并生成128bit的密文
分组密码每次处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度。
DES、AES等多数对称加密算法都属于分组密码。

分组密码模式

分组密码算法只能加密固定长度的分组数据,但是如果需要加密的明文长度超过分组密码的分组长度,就需要对分组密码算法进行迭代(脑补for循环),以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式。AES常用的分组模式有:ECB、CBC、CFB、OFB、CTR。ECB模式存在明显弱点,因此不被推荐使用。因为笔者目前遇到的大多都是CBC模式,所以下面对该模式进行详细讲解,而其他模式原理基本相同,可以在遇到时查阅相关资料或自行变通,本文不再赘述。

CBC模式

CBC模式的全称是Cipher Block Chaining(密文分组链接)模式,因为密文分组会像链条一样相互连接在一起的。
在CBC模式中,会首先将密文分组与前一个密文分组进行XOR运算,然后再进行加密。
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个(长度为一个分组的随机数据)来代替“前一个密文分组”,这个随机数据就称为:初始化向量(IV)。通常每次加密时都会随机产生一个不同的随机数据来作为初始化向量。

CBC模式加密:加密解密均使用Rijndael分组密码算法。

CBC模式解密:加密解密均使用Rijndael分组密码算法。

参考:《图解密码技术》

posted @ 2019-08-11 02:17  SunsetR  阅读(1369)  评论(0编辑  收藏  举报