算法的时间复杂度指什么(每天一算法什么是AES算法)

点击上方"java全栈技术"关注,每天学习一个java知识点

算法的时间复杂度指什么(每天一算法什么是AES算法)(1)

算法的时间复杂度指什么(每天一算法什么是AES算法)(2)

算法的时间复杂度指什么(每天一算法什么是AES算法)(3)

算法的时间复杂度指什么(每天一算法什么是AES算法)(4)

假设有一个发送方在向接收方发送消息。如果没有任何加密算法,接收方发送的是一个明文消息:“我是小灰”

算法的时间复杂度指什么(每天一算法什么是AES算法)(5)

如果消息被中间人截获到,即使中间人无法篡改消息,也可以窥探到消息的内容,从而暴露了通信双方的私密。

因此我们不再直接传送明文,而改用对称加密的方式传输密文,画风就变成了下面这样:

算法的时间复杂度指什么(每天一算法什么是AES算法)(6)

具体工作的步骤如下:

1.发送方利用密钥123456,加密明文“我是小灰”,加密结果为TNYRvx SNjZwEK ZXFEcDw==。

2.发送方把加密后的内容TNYRvx SNjZwEK ZXFEcDw==传输给接收方。

3.接收方收到密文TNYRvx SNjZwEK ZXFEcDw==,利用密钥123456还原为明文“我是小灰”。

算法的时间复杂度指什么(每天一算法什么是AES算法)(7)

算法的时间复杂度指什么(每天一算法什么是AES算法)(8)

算法的时间复杂度指什么(每天一算法什么是AES算法)(9)

算法的时间复杂度指什么(每天一算法什么是AES算法)(10)

算法的时间复杂度指什么(每天一算法什么是AES算法)(11)

1.密钥

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

AES支持三种长度的密钥:

128位,192位,256位

平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

算法的时间复杂度指什么(每天一算法什么是AES算法)(12)

算法的时间复杂度指什么(每天一算法什么是AES算法)(13)

2.填充

要想了解填充的概念,我们先要了解AES的分组加密特性。

什么是分组加密呢?我们来看看下面这张图:

算法的时间复杂度指什么(每天一算法什么是AES算法)(14)

AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。

这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。

但是这里涉及到一个问题:

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

算法的时间复杂度指什么(每天一算法什么是AES算法)(15)

算法的时间复杂度指什么(每天一算法什么是AES算法)(16)

NoPadding: 不做任何填充,但是要求明文必须是16字节的整数倍。

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} 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}

算法的时间复杂度指什么(每天一算法什么是AES算法)(17)

3.模式

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

ECB、CBC、CTR、CFB、OFB

模式之间的主题思想是近似的,在处理细节上有一些差别。我们这一期只介绍各个模式的基本定义。

ECB模式(默认):

电码本模式 Electronic Codebook Book

CBC模式:

密码分组链接模式 Cipher Block Chaining

CTR模式:

计算器模式 Counter

CFB模式:

密码反馈模式 Cipher FeedBack

OFB模式:

输出反馈模式 Output FeedBack

算法的时间复杂度指什么(每天一算法什么是AES算法)(18)

算法的时间复杂度指什么(每天一算法什么是AES算法)(19)

算法的时间复杂度指什么(每天一算法什么是AES算法)(20)

算法的时间复杂度指什么(每天一算法什么是AES算法)(21)

1. kgen.init传入的第一个参数128决定了密钥的长度是128bit

2. Cipher.getInstance("AES/CBC/NoPadding")决定了AES选择的填充方式是NoPadding,工作模式是CBC模式。

几点补充:

1.我们在调用封装好的AES算法时,表面上使用的Key并不是真正用于AES加密解密的密钥,而是用于生成真正密钥的“种子”。

2.填充明文时,如果明文长度原本就是16字节的整数倍,那么除了NoPadding以外,其他的填充方式都会填充一组额外的16字节明文块。

以上就是AES的基本概念。但我们是有追求的程序员,不能知其然不知其所以然。下面来给大家讲一讲AES算法的底层原理

算法的时间复杂度指什么(每天一算法什么是AES算法)(22)

算法的时间复杂度指什么(每天一算法什么是AES算法)(23)

算法的时间复杂度指什么(每天一算法什么是AES算法)(24)

在这里我们重新梳理一下:

1.把明文按照128bit拆分成若干个明文块。

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

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

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

算法的时间复杂度指什么(每天一算法什么是AES算法)(25)

算法的时间复杂度指什么(每天一算法什么是AES算法)(26)

算法的时间复杂度指什么(每天一算法什么是AES算法)(27)

算法的时间复杂度指什么(每天一算法什么是AES算法)(28)

算法的时间复杂度指什么(每天一算法什么是AES算法)(29)

算法的时间复杂度指什么(每天一算法什么是AES算法)(30)

具体分成多少轮呢?

初始轮(Initial Round) 1次

普通轮(Rounds) N次

最终轮(Final Round) 1次

上一期我们提到,AES的Key支持三种长度:AES128,AES192,AES256。Key的长度决定了AES加密的轮数。

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

AES128:10轮

AES192:12轮

AES256:14轮

不同阶段的Round有不同的处理步骤。

初始轮只有一个步骤:

加轮密钥(AddRoundKey)

普通轮有四个步骤:

字节代替(SubBytes)

行移位(ShiftRows)

列混淆(MixColumns)

加轮密钥(AddRoundKey)

最终轮有三个步骤:

字节代替(SubBytes)

行移位(ShiftRows)

加轮密钥(AddRoundKey)

算法的时间复杂度指什么(每天一算法什么是AES算法)(31)

算法的时间复杂度指什么(每天一算法什么是AES算法)(32)

1.字节替代(SubBytes)

算法的时间复杂度指什么(每天一算法什么是AES算法)(33)

首先需要说明的是,16字节的明文块在每一个处理步骤中都被排列成4X4的二维数组。

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

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

2.行移位(ShiftRows)

算法的时间复杂度指什么(每天一算法什么是AES算法)(34)

这一步很简单,就像图中所描述的:

第一行不变

第二行循环左移1个字节

第三行循环左移2个字节

第四行循环左移3个字节

3.列混淆(MixColumns)

算法的时间复杂度指什么(每天一算法什么是AES算法)(35)

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

4.加轮密钥(AddRoundKey)

算法的时间复杂度指什么(每天一算法什么是AES算法)(36)

这一步是唯一利用到密钥的一步,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轮)的处理。

算法的时间复杂度指什么(每天一算法什么是AES算法)(37)

算法的时间复杂度指什么(每天一算法什么是AES算法)(38)

算法的时间复杂度指什么(每天一算法什么是AES算法)(39)

算法的时间复杂度指什么(每天一算法什么是AES算法)(40)

算法的时间复杂度指什么(每天一算法什么是AES算法)(41)

1.ECB模式

ECB模式(Electronic Codebook Book)是最简单的工作模式,在该模式下,每一个明文块的加密都是完全独立,互不干涉的。

算法的时间复杂度指什么(每天一算法什么是AES算法)(42)

这样的好处是什么呢?

1.简单

2.有利于并行计算

缺点同样也很明显:

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

2.CBC模式

CBC模式(Cipher Block Chaining)引入了一个新的概念:初始向量IV(Initialization Vector)。

IV是做什么用的呢?它的作用和MD5的“加盐”有些类似,目的是防止同样的明文块始终加密成同样的密文块。

算法的时间复杂度指什么(每天一算法什么是AES算法)(43)

从图中可以看出,CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。

这样以来,相同的明文块加密出的密文块显然是不一样的。

CBC模式的好处是什么呢?

安全性更高

坏处也很明显:

1.无法并行计算,性能上不如ECB

2.引入初始化向量IV,增加复杂度。

算法的时间复杂度指什么(每天一算法什么是AES算法)(44)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页