大家好,欢迎来到IT知识分享网。
学习密码学的同学可以看过来 😃😃😃😃😃
文章目录
【1】什么是AES加密
AES加密简单来说就是应用 明文 和 密钥 在字节上的多次 位移 与 字节 间的 加 和 减 去加密数据的算法。AES加密有好几种模式,下文所说的是ECB模式,这个模式最简单可以看作是其它模式的基础,学过之后再看其它模式就事半功倍。
【2】AES加密的过程
1、明文的分组
AES算法是将 明文 按照128个 ’ bit ’ 也就是十六字节分为多个矩阵组(一个矩阵组可以理解为4×4字节的行列式),最后分下来如果不足128 ’ bit ’ 就会进行填充。
- 填充的方法有如下几类
- 1、Nopadding
故名思意就是没有填充,不过选择这种填充方式要保证明文的数据是128bit的整数倍。 - 2、Zeropadding
这种填充模式下,若明文数据不是128bit的整数倍则会将余下的数据后补充足量的00,直到是128bit。若正好是128bit的整数倍,则补充128bit的00。 - 3、PKCS #5
这种模式就是缺几个字节填充几个字节的数,这个数就是缺少的字节数(比如缺10个字节,填充10个字节的10),如果不需要填充,则添加一个分组,分组中填充的数是分组大小,比如分组大小为128bit,则填充16个字节的16。分好组之后,每一组都会经过数轮运算,直到所有的分组都被加密完。 - 4、PKCS #7
这种模式和PKCS #5几乎是一模一样,为一不同的是它没有block必须是16byte的要求。 - 5、ISO 10126
这种模式下,会将余下不足16byte的数据之后补充随机数,但是在最后一位会标明补充的数的的个数。 - 6、ANSI X9.23
和ISO 10126类似,不过不是补充随机数而是补充00。
2、密钥的扩展
密钥有三种规格128 ’ bit ‘(理解起来还是按照4×4字节的行列式理解),192 ’ bit ‘ ,256 ’ bit ’ 这几种类型,每一种类型的加密对明文的加密轮数都不同,密钥长度为128 ’ bit ‘对明文的分组加密10轮,192 ’ bit ‘则是12轮,256 ’ bit ‘则是14轮。初始密钥也要经过运算进行扩充,使其扩充成新的行列式,128 ’ bit ’ 要扩充为160个 ’ byte ’ 也就是 1280 ’bit‘ 。192 ’ bit ’ 则是 ,2304 ’ bit ‘,288 ’ byte ‘。256个 ’ bit ’ 的密钥则是变成,3584’ bit ‘,448 ’ byte ‘的矩阵。具体怎么算可以看之后的扩展内容,这里同学们还是暂且死记一下。
上面的两个东西的理解可以如下图理解
-
明文分组
-
密钥扩充
-
密钥与明文(这个图片转载自一个大佬的)
3、加密的细节
明文和密钥分好组并做了运算,明文经过加密如上面的图一样,那么密钥为128bit时所说的十轮加密中具体都有哪些步骤呢,它的步骤有轮密钥加,字符代换,行移位,列混合。在加密时先对明文分组做轮密钥加,然后执行九轮的字符代换->行移位->列混合->轮密钥加,之后在第十轮只执行,字符代换->行移位->轮密钥加,最后输出加密之后的明文。其加密的过程如下图。
上图中的w指的是扩展后的矩阵组,其中的[0,3]或者[40,43]说的是该扩展的矩阵组的哪些元素参加轮密钥加。
【3】加密时各步骤的细节
1、一切的前提—字节间的加法和乘法
这一部分属于信息安全里的内容
-
1、字节间的加法最好理解其实就是字节中每一 ‘bit’ 的相加。
-
2、字节间的乘法运算是可以理解为byte中的bit位移之后做加法,这里不多做。
2、轮密钥加实现
轮密钥加其实就是一个4×4的密钥行列式(比如w[0,3]、w[4,7]等)和4×4的明文分组行列式进行矩阵间的乘法运算,每一个元素按照上一块提到的字节间的加法和乘法运算进行计算
3、字符代换
在AES中会自动生成一个‘S盒’,S盒是什么?其实就是一个16×16的数组,为什么是16×16的数组?它又是怎么使用的呢?要知道一个8 bit的字节可以用一个2位的十六进制数表示,这是按照先学的行再确定列的方式找到对应元素,最后代换到文件对应的位置上。
S盒的样子如下图
4、行移位
行移位是将4×4行列式自上而下第一行不位移,第二行位移一位,第三行位移两位,第四行位移三位,的方式改变行列式。
5、列混合
列混合其实就是将明文分组矩阵和一个确定好的矩阵按照字节间的加和乘进行相乘,这个矩阵是如下的样子
02 | 01 | 01 | 03 |
---|---|---|---|
01 | 02 | 01 | 01 |
01 | 01 | 02 | 01 |
03 | 01 | 01 | 02 |
【4】解密的步骤
按照密钥为128bit来说(也就是加密十轮的情况),其实就是加密的步骤倒着来一遍,还是先来逆轮密钥加,再开始每一轮的计算,最后一轮依旧少一步——–少了逆列混合。
【5】解密时各步骤的细节
1、逆轮密钥加
这个运算是和轮密钥加相同的运算规则,因为异或的逆运算是它本身
2、逆行移位
这个不难理解就是将行列式最底层的一行向由移三位,倒数第二行移两位,第二行移动一位,最上面还是不动
3、逆字符代换
在生成S盒时也生成了逆S盒,被加密的行列式组按照十六进制确定逆S盒中的元素替换之后就是没有加密前的数据,下图是逆行列式
4、列混合
逆列混合的操作也是乘一个确定的行列式,这是按照数学发现推到出的行列式,我在刚学的时候,就好奇这个行列式是怎么来的,也有这个问题的同学可以自己验证一下,这个确定的行列式如下图
0E | 0B | 0D | 09 |
---|---|---|---|
09 | 0E | 0B | 0D |
0D | 09 | 0E | 0B |
0B | 0D | 09 | 0E |
拓展部分
密钥的扩展是通过两个方程式,如下
- 1.w[i]=w[i-1]异或w[i-4] 这个方程是用于i不是4的整数倍时的情况
- 2.w[i]=w[i-1]异或T(w[i-4])这个方程用于i是4的整数的情况,T是一个函数
其中的T函数的运算规则是
- 1.将该行列式中的一列4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
- 2.字节代换:对字循环的结果使用S盒进行字节代换。
- 3.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
其中的Rcon[j]是一个32bit的常量,其值如下
密钥的解密,就是将以上的三步逆着来一遍 - 1.显示再异或一下Rcon[j]常量因为异或的逆运算是其本身
- 2.再用逆S盒代换
- 3.最后再将每一个字节循环右移一位
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11514.html