AES加密算法 (上)介绍

 

AES简介

AES(Advanced Encryptim Standard,AES),又称Rijndeal加密法,汉译为 高级加密标准。AES算法是由比利时密码学家Joan Daemen和Vincent Rijmen共同设计,AES算法起初用于替换原先的DES(Data Encryptim Standard,数据加密标准),并在21世纪初期成为最流行的加密算法之一。AES解决了之前大多数加密的问题,例如攻击加密标准,或者暴力破解密码等,在AES算法上的效果并不好。

AES过程

先放加密流程图。

如上图所示,是一段明文经过完整的AES形成的最终密文流程图。整个AES一共分为这几个步骤:

  1. 将一段完整的明文分成若干块128bit(16bytes)大小的明文块。
  2. 按照所选择的填充方式来将最后一块明文块填充完整。
  3. 将每个明文块利用AES加密器和密钥加密成密文块。
  4. 拼接好由若干明文块加密后所得的密文块,成为最终的完整密文。

看到这里我们可能有些疑惑,什么是AES加密器,他的算法是怎样的,AES加密又与其他加密有何不同,为什么要将明文分成128位的明文块?等等,下面将会一一解答。

AES加密原理

  • 1.所属加密类型

众所周知,加密算法有很多种,例如哈希,MD5,SHA等等,在这些加密算法中,AES属于典型的对称加密算法。像MD5这种属于哈希摘要算法,而AES是真正意义上的加密算法。举个例子,AES可以在发送端将明文加密,在接受端也可以通过密钥来解密,而所用的密钥是一致的,换言之,密文到明文的过程是可逆的,这就是所谓的对称加密算法。而在文章摘要算法中,明文被分块再用哈希函数提取随机值整合成一段由明文字组成的密文字段,而这个过程是不可逆的,所以大多数时候文章摘要算法常用来校验一致性。

  • 2.密钥

密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。AES支持三种长度的密钥,128位,192位,256位。平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。所以说,从安全性的角度看,256位密钥最安全,从性能上来看,128位密钥最好。

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES密钥长度加密轮数
12810
19212
25614
  • 3.填充方式

上面我们提到了AES的第一步就是将明文划分成规定大小的明文块,但是不是所有的明文都能正好装下的,所以,针对会剩余的部分采用填充方式进行补全。有以下几种补全规定:

  1. No padding:不做填充。明文块大小正好为128的倍数,没有剩余或者溢出部分。
  2. PKCS5Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数
  3. ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数

比如剩余明文{a,b,c,d,e,f,g,h,i,j,k}缺少六个字节,按照第2种填充方式该明文块则可以补充为{a,b,c,d,e,f,g,h,i,j,k,6,6,6,6,6,6};按照第3种填充方式该明文块则可以补充为{a,b,c,d,e,f,g,h,i,j,k,2,z,!,s,c,6};

16字节的明文块在每一个处理步骤中都被排列成4X4的二维数组,如下图所示为明文块。

  • 4.AES加密器

这个是整个AES的算法核心,AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。加密时,各轮AES加密循环均包含4个步骤即四种对明文块的变换,分别是字节替换(SubBytes)、行移位(ShiftRows)、列混淆(MixColumn)、加轮密钥(AddRoundKey)。

上文提倒,在整个加密过程中分为了很多轮数,每种加密的方式是相似的,第一轮改变为初始轮,加密器只会产生密钥,即只会进行加轮密钥。最后一轮中有三个变换为字节代替,行移位,加轮密钥。剩余轮数中四个变换都要执行。

函数剖析

  • 1.字节替代

所谓字节替代,就是把明文块的每一个字节都替代成另外一个字节。替代的依据是什么呢?依据一个被称为S盒(Subtitution Box)的16X16大小的二维常量数组。假设明文块当中a[2,2] = 5B(一个字节是两位16进制),那么输出值b[2,2] = S[5][11]。(示例只是一种较好理解的字节替换方式)

  • 2.行移位

第一行循环左移0个字节,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节。

  • 3.列混淆

这一步,输入数组的每一列要和一个名为修补矩阵(fixed matrix)的二维常量数组做矩阵相乘,得到对应的输出列。

具体的修补矩阵如下图所示

  • 4.加轮密钥

这一步是唯一利用到密钥的一步,128bit的密钥也同样被排列成4X4的矩阵。让输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,就生成了输出值b[i,j]

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

扩展密钥(KeyExpansions)

AES源代码中用长度 4 * 4 *(10+1) 字节的数组W来存储所有轮的密钥。W{0-15}的值等同于原始密钥的值,用于为初始轮做处理。后续每一个元素W[i]都是由W[i-4]和W[i-1]计算而来,直到数组W的所有元素都赋值完成。W数组当中,W{0-15}用于初始轮的处理,W{16-31}用于第1轮的处理,W{32-47}用于第2轮的处理 ......一直到W{160-175}用于最终轮(第10轮)的处理。

具体地,W矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为"abcdefghijklmnop",则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。


接着,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归方式产生:
1.如果i不是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁W[i-1]
2.如果i是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。

轮常量T如下图所示。

这四个函数是AES加密中最重要的四个操作函数,至于解密,上面我们也说了,AES是对称加密的,所以加密只需要得到上面函数的逆操作即可由密文转换成明文。比如字节替换函数,在解密时换成字节逆替换函数即可。

AES加密模式

AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:

1.ECB(Electronic Code Book电子密码本)模式

ECB模式是最早采用和最简单的模式,在该模式下,每一个明文块的加密都是完全独立,互不干涉的。

优点:简单有利于并行计算。

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

 

2.CBC模式

CBC模式(Cipher Block Chaining)引入了一个新的概念:初始向量IV(Initialization Vector)。IV是做什么用的呢?它的作用和MD5的“加盐”有些类似,目的是防止同样的明文块始终加密成同样的密文块。

CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。这样以来,相同的明文块加密出的密文块显然是不一样的。

优点:安全性更高。

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

3.CFB(Cipher FeedBack Mode,加密反馈)模式.

4.OFB(Output FeedBack,输出反馈)模式.

5.CTR(Counter,计数)模式.CTR 模式被广泛用于 ATM 网络安全和 IPSec应用中.

最后,献上几篇不错的AES加密详解,有具体的实现示例和算法分析。我也只是站在巨人的肩膀上。

https://blog.csdn.net/qq_28205153/article/details/55798628

https://www.sohu.com/a/201169795_466846

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值