
AES加密算法实现流程.doc
4页由于AES的数学原理在网上有很多,所以在这里就不再说明,主要是加密流程先说明一下AES的几个必备参数的初始化typedef struct _AES{int Nb; //明文或密文的行数int Nr; //加密或解密时的轮数int Nk; 〃密钥的行数unsigned long *Word ; 〃指向密钥库的指针un sig ned long *State; //指向每一轮加密或解后的结果}AES;这里统一为4列n行,可以用unsigned long 数组表示Nb =明文或密文长度/4 ;Nk = 密钥长度/4;加密轮数 Nr = Nb < Nk ? Nk:Nb+6;一.密钥库的生成过程1. 计算库的行数并分配内存库行数=Nb*(Nr+1);2. 初始化密钥库库的第一个密钥为原密钥---直接将密钥拷贝到密钥库中;3. 开始计算轮密钥un sig ned long temp;for (int c = Nk; c < Nb * (Nr+1); ++c){〃把上一轮的最后一行放入 temptemp = w[c-1];〃判断是不是每一轮密钥的第一行if (c % Nk == 0){〃左旋8位temp = (temp<<8)|(temp>>24);〃查Sbox表SubWord((byte* )& temp);temp A= Rcon [c/Nk];}else if ( Nk > 6 && (c % Nk == 4)){SubWord((byte* )& temp);}〃w[c-Nk]为上一轮密钥的第一行w[c] = w[c-Nk] A temp;}二.State 生成为了实现快速列混淆(这里应该是行混淆),State需要多出三行作为缓冲区。
所以 State = new unsigned Iong[Nb+3];当解密时 State += 3;加密时不变AES算法中行混淆的实现:加密时第1,2,3列(从0开始)分别上旋(解密时下旋)1,2,3个字节先拷贝前三行到 State的最后三行(就是拷贝到多出来的那三行 )设temp(unsigned char temp[4]) 为行混淆后第 n行的数据设Nb = 4,那么加密时的逻辑结构为:(空白为无效数据)拷贝前: 拷贝后: 处理完后的结果:c0 c1 c2 c3 c0 c1 c2 c3 c0 c1 c2 c3| s0 | s1 | s2 | s3 || s0 | | | || t0 | t5 | ta | tf || s4 | s5 | s6 | s7 || s4 | s5 | | | | t4 | t9 | te | t3 || s8 | s9 | sa | sb | | s8 | s9 | sa | | | t8 | td | t2 | t7 || sc | sd | se | sf || sc | sd | se | sf | | tc | t1 | t6 | tb || | | | || | s1 | s2 | s3 || | | | || | | | || | | s6 |s7 || | | | || | | | | | | | |sb || | | | |则temp = {s0,s5,sa,sf};temp 值经其它运算后放入 State的第n行。
下面是解密时的情况拷贝前: 拷贝后: 处理完后的结果:cO ci c2c3 cO ci c2 c3 cO ci c2 c31 1 I I I II I Is7 I I I I I II I I I I II I sa I sb I I I I I II I I I I II sd I se I sf I I I I I I| sO | si | s2 | s3 || s0 | si | s2 | s3 | | t0 | td | ta | t7 |I s4 I s5 I s6 I s7 I I s4 I s5 I s6 II I t4 I ti I te I tb II s8 I s9 I sa I sb II s8 I s9 I II I t8 I t5 I t2 I tf II sc I sd I se I sf I I sc I I II I tc I t9 I t6 I t3 I三.开始加密1. 初始化第一轮State A=密钥库的第一轮密钥2. 共Nr-1轮(1) .先拷贝前三行到 State的最后三行(就是拷贝到多出来的那三行 )2) .temp = {Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};(3) .State 第 n 行第一个字节=Log_02[temp[0]]ALog_03[temp[1]]Atemp[2]Atemp[3];第二个字节=Log_02[temp[1]]ALog_03[temp[2]]Atemp[3]Atemp[0];第三个字节=Log_02[temp[2]]ALog_03[temp[3]]Atemp[0]Atemp[1];第四个字节=Log_02[temp[3]]ALog_03[temp[0]]Atemp[1]Atemp[2];(4) .State的当前行a=密钥库的第n轮密钥相应行;再跳到⑵,进行State的下一行计算3. 最后一轮(1) .先拷贝前三行到 State的最后三行(就是拷贝到多出来的那三行 )。
2) .State 的当前行={Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};(3) .State的当前行a=密钥库的最后一轮密钥相应行 ;再跳到⑵,进行State的下一行计算 四.开始解密与加密时相反,从最后一轮开始1. 初始化最后一轮State A=密钥库的最后一轮密钥2. 共 Nr-1 轮(Nr-仁>0)(1) .先拷贝State的最后三行到 State的前三行2) .temp = {iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};(3) .State的当前行a=密钥库的第n轮密钥的相应行;(4) .State 第 n 行第一个字节 =Log_0e[temp[0]] a Log_0b[temp[1]] aLog_0d[temp[2]] a Log_09[temp[3]];第二个字节 =Log_0e[temp[1]] a Log_0b[temp[2]] aLog_0d[temp[3]] a Log_09[temp[0]];第三个字节 =Log_0e[temp[2]] a Log_0b[temp[3]] aLog_0d[temp[0]] a Log_09[temp[1]];第四个字节 =Log_0e[temp[3]] a Log_0b[temp[0]] aLog_0d[temp[1]] a Log_09[temp[2]];再跳到⑵,进行State的下一行计算3. 最后一轮(1) .先拷贝State的最后三行到 State的前三行。
2) .State 的当前行={iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};(3) .State的当前行a=密钥库的第一轮密钥相应行 ; 再跳到⑵,进行State的下一行计算。
