大家好,欢迎来到IT知识分享网。
AES加密前准备
1. 需加密的16字节数据
只能是16字节,不足16字节会有相应的补位方法。超过16字节那就拆分成N块16字节,每块分别加密。
2.16字节密钥
AES完整流程
AES加密第一步:密轮钥加
先把要加密的明文16字节数据排列成4×4矩阵
再把16字节密钥也排列成4×4矩阵
然后两个4×4矩阵相加(每个字节相异或),这样就完成了轮密钥加,记住这个步骤,并把这个步骤编成模块,后面还要用。
加密第二步:字节代替
字节代替也叫做S盒变换 AES有个固定的S盒,下图即为S盒
把第一步轮密钥加后产生的每一个字节用十六进制表示 然后以十六进制的第一个数字为行,第二个数字为列,在S盒表中查找对应的数字,用这个数字来代替原先的数字,这样就完成了字节变换。(比如原字节为0x1a,就以1为行,a为列,找到表中对应的0xa2来代替0x1a的位置)
加密第三步:行移位
就是把上一步得到的矩阵每行左环移,第一行不变,第二行环移1位,第三行环移2位,第三行环移3位。
加密第四步:列混淆
将上一步得到的矩阵a左乘矩阵c,得到新的矩阵b。这里的矩阵c是固定的,如下,应该是AES标准规定的。
注意这个乘法不是通常的10进制乘法,观察这个矩阵,里面有三种数字1,2,3,假如一个数y左乘他们其中一个,下面分三种情况介绍:
· 1*y = y
· 2*y 时,如果 y 的首位为0,则 2*y = y << 2 , 如果 y 的首位为1,则 2*y = ( (y<<1) & ( (1<<8) – 1) ) ^ (0x1b)
· 3*y = (2*y) ^ y
(2*y 的计算方法在上面已经讲了,这里再异或一下 y 就行)
其他情况的数以此类推,都把乘数拆分成1,2,3的积或和形式再用乘法分配律,比如 9*y = (2*2*2 + 1)*y = (2*2*2*y) ^ (1*y)
加密第五步:再来一遍轮密钥加
步骤还是第一步那个步骤,把上一步产生的4×4矩阵与4×4密钥相加,但是这里要加的密钥不再是那个原始密钥了,新的密钥要通过那个原始密钥计算产生,下面讲一下计算方法。
用原始密钥生成扩展密钥的方法如下图所示
这里的K矩阵就是原始密钥,把每一列用4维向量w来表示,就拆分成了w0,w1,w2,w3,将w3进行g中的运算,先是把4个字节左环移,然后对这4个字节进行S盒变换,S盒变换在上面已经介绍过了,变换完后,最左面的字节与RCj相加,AES128加密要把以上步骤进行10轮,RCj在每一轮的计算中都不一样,具体如下
这里我们进行第一轮,就把RCj取01,相加完成后,将得到的w’与w0相加,产生w4,将w4与w1相加产生w5,将w5与w2相加产生w6,将w6与w3相加产生w7,这样,新一轮的密钥诞生了,他就是w4,w5,w6,w7
将新密钥与第四步得到的数据相加,就完成了这一步的轮密钥加。
这个计算后面还要用,编写成模块等待调用。
加密第六步
将以上步骤重复10轮,即可得到密文。
注意最后一轮不要再列混淆了,最后得到的结果就是16字节的密文。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/97195.html