专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

安全算法——AES加密流程

ins518 2025-05-24 14:37:16 技术文章 1 ℃ 0 评论

AES加密前准备

1. 需加密的16字节数据

只能是16字节,不足16字节会有相应的补位方法。超过16字节那就拆分成N块16字节,每块分别加密。

2.16字节密钥

AES完整流程


AES加密第一步:密轮钥加

先把要加密的明文16字节数据排列成4x4矩阵

再把16字节密钥也排列成4x4矩阵

然后两个4x4矩阵相加(每个字节相异或),这样就完成了轮密钥加,记住这个步骤,并把这个步骤编成模块,后面还要用。


加密第二步:字节代替

字节代替也叫做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)


加密第五步:再来一遍轮密钥加

步骤还是第一步那个步骤,把上一步产生的4x4矩阵与4x4密钥相加,但是这里要加的密钥不再是那个原始密钥了,新的密钥要通过那个原始密钥计算产生,下面讲一下计算方法。

用原始密钥生成扩展密钥的方法如下图所示

这里的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字节的密文。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表