什么是AES算法?(整合版)

转载自 玻璃猫 程序员小灰

 

 

 

 

 

 

 

 

 

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

 

 

 

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

 

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

 

 

 

 

具体工作的步骤如下:

 

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

 

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.密钥

 

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

 

AES支持三种长度的密钥:

128位,192位,256位

 

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

 

 

 

 

 

 

 

2.填充

 

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

 

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

 

 

 

 

 

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

 

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

 

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

 

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

 

 

 

 

 

 

 

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}
 

 

 

 

3.模式

 

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

 

ECB、CBC、CTR、CFB、OFB

 

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

 

ECB模式(默认):

电码本模式    Electronic Codebook Book

 

 

CBC模式:

密码分组链接模式    Cipher Block Chaining

 

 

CTR模式:

计算器模式    Counter

 

 

CFB模式:

密码反馈模式    Cipher FeedBack

 

 

OFB模式:

输出反馈模式    Output FeedBack

 

 

 

 

 

 

 

 

 

 

 

 

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

 

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

 

 

 

几点补充:

 

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

 

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

 

 

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

 

 

 

 

 

 

 

 

 

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

 

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

 

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

 

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

具体分成多少轮呢?

初始轮(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)

 

 

 

 

 

 

1.字节替代(SubBytes)

 

 

 

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

 

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

 

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

 

 

2.行移位(ShiftRows)

 

 

 

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

第一行不变

第二行循环左移1个字节

第三行循环左移2个字节

第四行循环左移3个字节

 

 

3.列混淆(MixColumns)

 

 

 

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

 

 

4.加轮密钥(AddRoundKey)

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

1.ECB模式

 

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

 

 

 

 

 

这样的好处是什么呢?

1.简单

2.有利于并行计算

 

缺点同样也很明显:

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

 

 

2.CBC模式

 

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

 

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

 

 

 

 

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

 

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

 

CBC模式的好处是什么呢?

安全性更高

 

坏处也很明显:

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

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

 

 

 

 

 

 

—————END—————

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

soapui 测试soap_使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第二部分

soapui 测试soap在本系列的第一篇文章中,我们创建了一个基本的身份验证服务,以使用SoapUI进行调用。 因此,在第二篇文章中,我们将逐步演示如何使用此工具成功调用这种服务。 使用SoapUI的1-Basic WCF SOAP –创建新的SOAP项目 首…

如何获得即时编译器(JIT)的汇编代码(linux环境下)

【0】README0.1)本文主要解决如何在linux下获取即时编译器的汇编代码问题;0.2)本文部分内容转自:http://psy-lob-saw.blogspot.jp/2013/01/java-print-assembly.html1)给定java源代码// 单例模式(分析volat…

漫画:什么是SHA系列算法

转载自 玻璃猫 程序员小灰 SHA-1 SHA-1算法可以从明文生成160bit的信息摘要,示例如下: 给定明文:abcd SHA-1摘要:81FE8BFE87576C3ECB22426F8E57847382917ACF SHA-1 与 MD5的主要区别是什么呢? 1.摘要长度不同。 …

apache ignite_Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序

apache ignite在之前的一系列博客中,我们在Kubernetes集群上启动了一个Ignite集群。 在本教程中,我们将使用先前在Spring Boot Application上创建的Ignite集群。 让我们使用Spring Boot创建我们的项目。 Spring Boot应用程序将连接到Ignite集群。 让我…

tomcat(1)一个简单的web server

【0】README 0.1)本文部分描述转自“深入剖析tomcat”, 旨在学习 一个简单的web server 的基础知识; 0.2)for complete source code, please visit https://github.com/pacosonTang/HowTomcatWorks/tree/master/chapter1 【1】…

漫画:什么是MD5算法

转载自 玻璃猫 程序员小灰 摘要哈希生成的正确姿势是什么样呢?分三步: 1.收集相关业务参数,在这里是金额和目标账户。当然,实际应用中的参数肯定比这多得多,这里只是做了简化。 2.按照规则,把参数名和参数…

idea快速生成crud_Java / Spring:如何快速生成完整的Swagger文档CRUD REST API

idea快速生成crud作为开发人员,我们在日常生活中经常面临的最繁琐的任务之一就是编写良好且易于理解的文档。 无论我们的文档只有几行来解释功能的核心功能,还是表明系统的来龙去脉的成熟文章都没关系。 重要的是,我们试图通过文档传达的信息…

漫画:如何破解MD5算法

转载自 玻璃猫 程序员小灰 在之前的漫画中,我们介绍了MD5算法的基本概念和底层原理,没看过的小伙伴们可以点击下面的链接:《漫画:什么是MD5算法?》 这一次,我们来讲解如何破解MD5算法。 设MD5的哈希函数是…

自定义类加载器(ClassLoader + URLClassLoader)

【0】README 0.1)本文主要对类加载器进行分析,且 URLClassLoader是 ClassLoader的子类; 0.2)关于如何设置类加载器的加载路径,参见 对servlet容器的补充 【1】URLClassLoader类加载器 1.1)URLClassLoad…

fork/join和线程池_从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存...

fork/join和线程池问题: 启用了Spring且其范围设置为Request的缓存需要由不在请求范围内的singleton bean访问。 解: Spring使您能够创建缓存,该缓存为请求范围保留数据。 例如 import org.springframework.cache.concurrent.ConcurrentMapC…

tomcat(2)一个简单的servlet容器

【0】README 0.1)本文部分文字转自 “深入剖析Tomcat”,旨在学习 一个简单的servlet容器 的基础知识; 0.2)for complete source code, please visit https://github.com/pacosonTang/HowTomcatWorks/tree/master/chapter2 0…

漫画:什么是Base64算法

转载自 玻璃猫 程序员小灰 ValueChar ValueChar ValueChar ValueChar0A16Q32g48w1B17R33h49x2C18S34i50y3D19T35j51z4E20U36k5205F21V37l5316G22W38m5427H23X39n5538I24Y40o5649J25Z41p57510K26a42q58611L27b43r59712M28c44s60813N29d45t61914O30e46u6215P31f47v63/控制字符&am…

soapui 测试soap_使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第一部分

soapui 测试soap在这个分为三部分的系列中,我将演示如何使用SoapUI API工具来调用安全的WCF SOAP服务。 第一篇文章将着重于创建将要测试的系统的服务。 第二篇文章将介绍在基本身份验证机制保护的情况下调用它所需的步骤。 在最后一部分中,我将对初始服…

dmn是大脑中哪个区域_DMN中的函数式编程:感觉就像再次重读我的大学课程一样...

dmn是大脑中哪个区域在本文中,我想分享有关DMN中递归支持的有趣见解,并重点介绍FEEL语言的特定属性如何使功能性编程结构能够在DMN中建模。 我们将从一个基本示例开始,以演示FEEL语言和DMN构造的“商业友好”性质如何使我们能够解决一个通常…

对Servlet容器的补充

【0】README 0.1)本文是对 一个简单的servlet容器 的补充; 【1】Servlet容器 1.1)通过一个简单的servlet容器这篇博文,我们看到:其中的核心代码是 类加载器, 然而,在我follow 其代码&#xf…

漫画:什么是A*寻路算法

转载自 玻璃猫 程序员小灰比如像这样子:第一步:把起点放入OpenList第二步:找出OpenList中F值最小的方格,即唯一的方格Node(1,2)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并…

apache ignite_Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署

apache ignite以前,我们已经成功创建了第一个由Apache Ignite支持的Spring boot Application。 在此博客上,我们将重点介绍Kubernetes方面需要做的事情,以便能够启动我们的应用程序。 如先前博客所述,我们需要制定我们的Kuberne…

漫画:什么是布隆算法

转载自 玻璃猫 程序员小灰两周之前——爬虫的原理就不细说了,无非是通过种子URL来顺藤摸瓜,爬取出网站关联的所有的子网页,存入自己的网页库当中。但是,这其中涉及到一个小小的问题......URL去重方案第一版:HashSet 创…

2016第11届四川省高校计算机(软件)院长论坛纪要(旁听)

​【0】README 0.1)该论坛与16年4月8日在西南交大召开,为贺西南交大120周年华诞; 0.2)以下内容是小生在该论坛上的部分旁听内容(仅仅是部分), 感觉很新鲜,故分享之; 0…

selenium自动化测试_为什么在生产中进行Selenium自动化测试对于您的下一个版本至关重要?...

selenium自动化测试您是否认为仅仅是因为您的Web应用程序在过渡环境中以飞快的速度通过,它对于生产环境也将是相同的? 您可能需要重新考虑! 特别是,如果我们指的是跨浏览器测试 ,则需要确保跨各种操作系统&#xff0c…