AES算法流程以及4种工作模式流程图教学文案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、AES加密算法基本流程
AES算法的数据分组长度为128比特、密钥长度为128/192/256比特。
AES加解密包括Nr轮,前面Nr-1轮包含S盒变换、行移位、列混淆、轮密钥加4个阶段,最后一轮则少了列混淆这个阶段。
Rijnadel(State,CipherKey)
{
//初始化
KeyExpansion(CipherKey,ExpandedKey);//生成子密钥
AddRoundKey(State,ExpandedKey);//与子密钥位与
//前Nr-1轮
for(i=1;i { ByteSub(State);//S-盒 ShiftRow(State);//行被移位 MixColumn(State);//列被混叠 AddRoundKey(State,ExpandedKey);//与子密钥位与 } //最后一轮 ByteSub(State); ShiftRow(State); AddRoundKey(State,ExpandedKey); } 2、AES加密算法 2.1、状态、密钥、轮数 状态: ○1解密过程中的中间数据。 ○2以字节为元素的矩阵,或二维数组。 所有的操作都在状态上进行。 状态可以用以字节为元素的矩阵阵列表示,如上图所示该阵列有4行,列数记为Nb,Nb等于分组长度除以4。 符号说明: Nb-明密文所含的数据字数。 Nk-密钥所含的数据字数。 Nr-迭代轮数。 ⎡y⎤⎡1 ⎢y⎥⎢1 y⎥ ⎢3=⎢1 ⎢y⎥⎢0 ⎢y⎥⎢0 0001111⎤⎡x⎤⎡1⎤ ⎥⎢x⎥⎢1⎥ 1110001⎥⎢x⎥⎢0⎥ + 1111100⎥⎢x⎥⎢1⎥ 0111110⎥⎢x⎥⎢1⎥ ⎣⎣⎦⎣⎣⎥ 2.1、S盒变换 S盒变换其实是一个查表的过程,分别取一个字节的高4位和低4位作为行值和列值(因此是),然后在S盒中找到对应的字节替换之。该变换是一个非线性变换。这个非线性就体现在S盒的构造上。S盒变换是AES的唯一非线性变换,是AES安全的关键。 关于S盒是按如下方式构造: 1)初始化S盒,按行升序排列的字节初始化。行x列y的字节是xy,行号和列号从0开始计数。 2)求出每一个元素在GF(2^8)中的逆。00被映射为它自身。 3)仿射变换。对上一步中的每一个字节的每一位作如下变换 yi=xi+x(i+4)mod8+x(i+5)mod8+x(i+6)mod8+x(i+7)mod8+ci,Ci是字节0x63的第i位。 该变换用矩阵表示如下所示: ⎢1⎥⎢ ⎢y⎥⎢1 ⎢2⎥⎢ ⎢y⎥⎢1 ⎢4⎥⎢ 5 ⎢6⎥⎢ ⎢y 7 ⎥⎦⎢0 1000111 ⎥⎢1⎥⎢⎥ 1100011⎥⎢x⎥⎢0⎥ ⎥⎢2⎥⎢⎥ 3 1111000⎥⎢x⎥⎢0⎥ ⎥⎢4⎥⎢⎥ 5 ⎥⎢6⎥⎢⎥ 0011111⎥⎢x 7 ⎥⎦⎢0⎦ 2.2、行移位变换 在行移位变换中,状态的第一行没有任何变化,第二行循环移位C1字节,第三行循环移位C2字节,第四行循环移位C3字节。位移量C1、C2和C3与分组长度Nb有关,如下表: 行移位举例如下所示: 2.3、列混合变换 列混淆即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。 2.4、轮密钥加变换 状态与轮密钥(16byte)异或相加。轮密钥由种子密钥通过密钥调度算法产生得到,轮密钥长度等于分组长度Nb。 3、密钥调度算法 轮密钥是通过密钥调度算法从密钥中产生的,这其中包括两个部分:密钥扩展和轮密钥选取。基本原理如下: 1、所有轮密钥比特的总数等于轮数加1乘以分组长度(如128比特的分组长度 和10轮迭代,共需要1408比特的密钥); 2、将密钥扩展成一个扩展密钥; 3、轮密钥按下述方式从扩展密钥中选取:第一个轮密钥由一开始的N b个字组 成,第二个轮密钥由接下来的Nb个字组成,如此继续下去。 3.1密钥扩展 扩展密钥用数组W[Nb*(Nr+l)]表示,前Nk个字是种子密钥,其它的密钥字通过递归定义生成。由于密钥扩展函数取决于Nk的值,我们分了Nk≤6和Nk>6两种情况。对于密钥扩展,用类C语言描述如下: KeyExpansion(byte key[4*Nk],word w[Nb*(Nr+1)],Nk) begin word temp i=0 while(i w[i]=word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3]) i=i+1 end while i=Nk while(i temp=w[i-1] if(i mod Nk=0) temp=SubWord(RotWord(temp))xor Rcon[i/Nk] else if(Nk>6and i mod Nk=4) temp=SubWord(temp) end if w[i]=w[i-Nk]xor temp i=i+1 end while end 扩展算法如下: ①最前面的Nk个字是由种子密钥填充的。 ②之后的每一个字W[j]等于前面的字W[j-1]的与Nk个位置之前的字W[j-Nk]的异或。 ③而且对于Nk的整数倍的位置处的字,在异或之前,对W[j-1]的进行如下变换: 1、字节的循环移位RotByte,即当输入字为(a,b,c,d)时,输出字为(b,c,d,a) 2、用S盒进行变换字中的每个字节 3、异或轮常数Rcon[i/Nk] 轮常量是一个字,这个字最右边三个字节总是0。每轮的轮常量均不同,其定义为Rcon[j] =(RC[j],0,0,0),其中RC[1]=1,RC[j]=2*RC[j-1],且乘法定义在域GF(2^8)上。 j1234567810 9 RC[j](HEX)041036 0102082040801B 3.2轮密钥的选择 在进行密钥加时,密钥长必须与分组长相等,所以第i轮的密钥与分组长度有关,并