编辑: 学冬欧巴么么哒 | 2019-07-03 |
2 加密函数 void cipherfun
3 解密函数 void invcipherfun
4 密钥加 Void addroundkey
5 加密字节替换 void bytesub
6 加密行位移 void shiftrow
7 加密列混合 void mixcolumm
8 解密列混合 void invmixcolumm
9 解密字节替换 void invbytesub
10 解密行位移 void invshiftrow 3.3系统功能程序设计 3.3.1密钥设置模块 用来设置产生扩展密钥的,只有128位长的密钥. void keyexpansion(unsigned char *key, unsigned char *expkey) { int i, j, k;
unsigned char rcon[11][4] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00 };
unsigned char temp[4];
unsigned char subtype(unsigned char ch);
void rotbyte(unsigned char ch[4]);
/*扩展密钥时产生的前四列密钥*/ for(i = 0;
i <
Nk;
i++) { for(j = 0;
j <
Nk;
j++) { *((expkey + 4*i) + j) = *((key + 4*i) + j);
} } /*第四列后的扩展密钥生成*/ for(i = Nk;
i <
44;
i++) { for(k = 0;
k <
4;
k++) { /*先把前一列的密钥取出,放到零时数组temp中*/ temp[k] = *((expkey + 4*(i - 1)) + k);
} if(i % Nk == 0) { /*扩展密钥的列数等于Nk的倍数时*/ /*先对temp数组移位*/ rotbyte(temp);
for(k = 0;
k <
4;
k++) { /*对temp数组中的每一个数做字节替换*/ temp[k] = subtype(temp[k]);
/*字节替换后再与rcon数组中对应的值异或*/ temp[k] = temp[k] ^ rcon[i/Nk][k];
/*再与密钥的相应列做异或*/ *((expkey + 4*i) + k) = *((expkey + 4*(i - Nk)) +k) ^ temp[k];
} } Else /*扩展密钥的列数不是Nk的倍数时*/ { for(k = 0;
k <
4;
k++) { /*直接与对应的密钥列相异或*/ *((expkey + 4*i) + k) = (*((expkey + 4*(i - Nk)) + k)) ^ temp[k];
} } } } /*密钥扩展时的字节替换函数*/ unsigned char subtype(unsigned char ch) { /*取两个特殊数据,高八位为一的数240,低八位为一的数15 用于与传入的值相与,得到相应的行于列*/ unsigned char number1 = 15, number2 = 240;
int i = 0;
int row, columm;
/*求行值,与240相与再右移四位就可得到*/ row = ch &
number2;
row = row >
>
4;
/*取列值,直接与15相与就可得到*/ columm = ch &
number1;
ch = sbox[row][columm];
return ch;
} /*密钥扩展时的移位操作*/ void rotbyte(unsigned char ch[4]) { int i = 0, j = 0;
unsigned char array[4];
/*定义临时数组array[]*/ for(i = 0;
i <
4;
i++) { array[i] = ch[i];
} for(i = 0;
i <
4;
i++) { /*移位时对坐标的操作*/ j = i - 1;
if(j <
0) j = j +4;
ch[j] = array[i];
} } 根据密钥编排的原理,算法设计如下:由于此程序只能对明文分组长为128比特,用密钥长度为128比特的密钥进行加密.(密钥扩展时的字的编号记为i)扩展密钥的时候,前十六字(即i值0-15)密钥即为输入的密钥.从第二个十六字(即i=16时),先把前四个字的数据存储与数组temp中,之后对扩展的密钥处理分为两种情况.1.当字节号i为4的倍数时,处理如下:先对temp数组作一次循环位移,实现函数是rotbyte.再与数组rcon中对应的行作异或,对应关系为密钥i/4=0时.之后再用subbyte函数处理,subbyte函数的功能是字节替换,即从sbox盒中找对应的数据. 3.3.2解密函数 用来解密文本信息,通过判断k_len的长度,进行不同轮的加密,当k_len>