AES加密算法

1、明文拆分:AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。
在这里插入图片描述这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。

2、密钥长度:密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

AES支持三种长度的密钥:128位,192位,256位

平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。数字越大表示加密轮数越多。

所以,AES128性能最好,AES256安全性最高。

3、填充:假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

常见的填充方式有以下几种:
1)、NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍。

2)、PKCS5Padding(默认):如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

3)、ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

值得注意的是,加密时使用了某种填充方式,那么解密时也必须使用同种填充方式。

4、加密过程
1)把明文按照128bit拆分成若干个明文块。

2)按照选择的填充方式来填充最后一个明文块。

3)每一个明文块利用AES加密器和密钥,加密成密文块。

4)拼接所有的密文块,成为最终的密文结果

5、AES加密器
在这里插入图片描述
加密轮数分为:
初始轮(Initial Round):1次
普通轮(Rounds): N次
最终轮(Final Round): 1次

除去初始轮,各种Key长度对应的轮数如下:

AES128:10轮

AES192:12轮

AES256:14轮

初始轮只有一个步骤

——加轮密钥(AddRoundKey)

普通轮有四个步骤

——字节代替(SubBytes)

——行移位(ShiftRows)

——列混淆(MixColumns)

——加轮密钥(AddRoundKey)

最终轮有三个步骤

——字节代替(SubBytes)

——行移位(ShiftRows)

——加轮密钥(AddRoundKey)

即最终轮相比普通轮少了列混淆。

6、加密步骤的具体含义

1)字节替代(SubBytes):
在这里插入图片描述
16字节(128bit)的明文块在每一个处理步骤中都被排列成4X4的二维数组。

所谓字节替代,就是把明文块的每一个字节都替代成另外一个字节。替代的依据是什么呢?依据一个被称为S盒(Subtitution Box)的16X16大小的二维常量数组。

假设明文块当中a[2,2] = 5B(一个字节是两位16进制)(1bit是一位二进制数),那么输出值b[2,2] = S[5][11]。

即根据字节内容的4X4数组 对应S盒中的数据 转换为另一个4X4数组。

2)行移位(ShiftRows)
在这里插入图片描述
如图所示,
第一行不变,
第二行整体左移 1 个字节,
第三行整体左移 2 个字节,
第四行整体左移 3 个字节

即第 x 行整体左移 x-1 个字节,最左边的移动到最右。

3)列混淆(MixColumns)
在这里插入图片描述
这一步,输入数组的每一列要和一个名为修补矩阵(fixed matrix)的二维常量数组矩阵相乘,得到对应的输出列。

4)加轮密钥(AddRoundKey):
在这里插入图片描述
这一步是唯一利用到密钥的一步,128bit的密钥也同样被排列成4X4的矩阵

输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,就生成了输出值b[i,j]

需要补充一点,加密的每一轮所用到的密钥并不是相同的。这里涉及到一个概念:扩展密钥(KeyExpansions)。

5)扩展密钥(KeyExpansions):

AES源代码中用长度 4 * 4 *(10+1) 字节的数组W来存储所有轮的密钥。W{0-15}的值(16字节,128bit)等同于原始密钥的值,用于为初始轮做处理

后续每一个元素W[i]都是由W[i-4]和W[i-1]计算而来(W[16] = W[12] 运算 W[15]),直到数组W的所有元素都赋值完成。

W数组当中,W{0-15}用于初始轮的处理,
W{16-31}用于第1轮的处理(以16字节为单位),
W{32-47}用于第2轮的处理 …
一直到W{160-175}用于最终轮(第10轮)的处理。

6)解密过程:
解密过程就是把加密过程倒置过来,
最终轮->普通轮->初始轮。
扩展密钥W[x]的使用顺序和加密相反

7、加密模式:

AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:
1)ECB模式(默认):
电码本模式 Electronic Codebook Book

2)CBC模式:
密码分组链接模式 Cipher Block Chaining

3)CTR模式:
计算器模式 Counter

4)CFB模式:
密码反馈模式 Cipher FeedBack

5)OFB模式:
输出反馈模式 Output FeedBack

注意:加解密需要使用同一种加密模式。

8、加密模式详解

1)ECB模式(Electronic Codebook Book)是最简单的工作模式,在该模式下,每一个明文块的加密都是完全独立,互不干涉的
在这里插入图片描述
优点:
1.简单
2.有利于并行计算

缺点:
相同的明文块经过加密会变成相同的密文块,因此安全性较差。

2)CBC模式(Cipher Block Chaining)引入了一个新的概念:初始向量IV(Initialization Vector)。
IV的作用和MD5的“加盐”有些类似,目的是防止同样的明文块始终加密成同样的密文块。
在这里插入图片描述
从图中可以看出,CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或
这样一来,相同的明文块加密出的密文块显然是不一样的。

优点:
安全性更高

缺点:
1.无法并行计算,性能上不如ECB
2.引入初始化向量IV,增加复杂度。

3)计算器模式(Counter (CTR))

计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出 和 明文异或 的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是 在计算器不能维持很长的情况下,密钥只能使用一次 。CTR的示意图如下所示:
Plaintext:明文
Ciphertext:密文
Encrypt:加密
在这里插入图片描述
即与CBC不同的是,将初始向量IV变为了自增算子,自增算子和加密密钥进行加密组合,使密钥变化,再将变化后的密钥与明文(Plaintext)异或,得到密文块。

优点:
简单快速,安全可靠
利于并行计算

缺点:
在计算器不能维持很长的情况下,密钥只能使用一次

4)CFB模式:全称Cipher FeedBack模式(密文反馈模式)。在CFB模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。
在这里插入图片描述
在ECB模式和CBC模式中,明文分组都是通过密码算法进行加密的,然而,在CFB模式中,明文分组并没有通过密码算法来直接进行加密。

明文分组和密文分组之间并没有经过“加密”这一步骤。在CFB模式中,明文分组和密文分组之间只有一个XOR。

CBC和CFB的区别:
在这里插入图片描述
在生成第一个密文分组时,由于不存在前一个输出的数据,因此需要使用初始化向量(IV)来代替。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。

5)OFB模式(输出反馈模式Output FeedBack )
在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
OFB模式不是通过密码算法对明文直接加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。
在这里插入图片描述
OFB模式和CFB模式的区别仅仅在于密码算法的输入。
CFB模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,因此有了“密文反馈算法”这个名字。
OFB模式中,密码算法的输入则是密码算法前一个输出,也就是将输出反馈给密码算法,因此就有了“输出反馈模式”这个名字。

CFB模式和OFB模式对比图:
在这里插入图片描述
CFB模式中是对密文分组进行反馈,因此必须从第一个明文分组开始按顺序进行加密,也就是说无法跳过明文分组1而先对明文分组2进行加密。

OFB模式中,XOR所需要的比特序列(密钥流)可以事先通过密码算法生成,和明文分组无关。只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就完全不需要动用密码算法了,只要将明文与密钥流进行XOR就可以了和AES等密码算法相比,XOR运算是非常快的。这就意味着只要提前准备好密钥流就可以快速完成加密。换个角度来看,生成密钥流的操作和进行XOR运算的操作是可以并行的

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值