void Cipher() {
int i,j,round=0;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
state[j][i] = in[i*4 + j]; } }
AddRoundKey(0); printf(\
for(round=1;round SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(round); printf(\ } SubBytes(); ShiftRows(); AddRoundKey(Nr); for(i=0;i<4;i++) { for(j=0;j<4;j++) { out[i*4+j]=state[j][i]; } } } 结果存入out数组中,再输出即可。 第 15 页 共 33 页 3.1.11解密 通过上面所写函数得到解密函数 关键代码如下: void InvCipher() { int i,j,round=0; for(i=0;i<4;i++) { for(j=0;j<4;j++) { state[j][i] = in[i*4 + j]; } } AddRoundKey(Nr); for(round=Nr-1;round>0;round--) { InvShiftRows(); InvSubBytes(); AddRoundKey(round); InvMixColumns(); printf(\ } InvShiftRows(); InvSubBytes(); AddRoundKey(0); for(i=0;i<4;i++) { for(j=0;j<4;j++) { out[i*4+j]=state[j][i]; } } } 第 16 页 共 33 页 结果存入out数组中. 3.2较高要求部分 3.2.1 密钥长度192,256的实现 通过输入不同的密钥长度计算出不同的Nk密钥列数和Nr加密轮数,将两者设为全局变量,在需要使用的函数中带入这两个变量替代原来的4和10即可拥有不同长度的密钥。这里专门提出了一个计算Nk和Nr的函数便于调用。 代码如下: void NkNr() { int len; while(len!=1 && len!=2 && len!=3) { printf(\输入想选择的密钥长度:\\n1 - 128\\n2 - 192\\n3 - 256\\n\ scanf(\ if(len==1) Nr=128; if(len==2) Nr=192; if(len==3) Nr=256; } Nk = Nr / 32; Nr = Nk + 6; } 3.2.2 密钥采用ASCII码 这个功能实现很简单,直接用fscanf函数按照格式读取即可,在txt中存入以空格分隔的ascii码便可 fscanf(fp, \读取为d,ascii码 第 17 页 共 33 页 3.2.3 明文分组和自动填充 为了方便输入和修改,采用了从TXT文件中读取字符的方法来得到明文。 首先,确认文件存在后用fopen函数打开,然后用fscanf函数按照自定格式从文本文件中读取字符,对于明文用%c读取,这样一个字符一个字符读入,然后存入相应的数组[i],用feof(fp)来判断是否到了文件末尾,到末尾后可以得到一个i值,这个值比实际长度还多一位,i-1即为实际的明文长度。 得到明文长度m后,m除以16向上取整得到轮数,因为数组下标大于m后面的都未赋值所以默认为0,然后16个一组进行加密,一轮完成后,把数组中后16个值付给0—15的元素,直到轮数达成,这样便实现了明文分组填充。 这里写了一个readtext函数来读取文本文件中的字符串。 代码如下: //type:判断是读密钥,明文还是密文,mingzi:文件名 //length:数组长度,shuzu:读完后要存入的数组 int readtext(int type,const char * mingzi,int length,unsigned char shuzu[]) { int i,j,x; unsigned char temp1[12345]; if(type==1){ MessageBox(NULL,\在弹出的记事本中确认密钥\\n 完成后按任意键继续\消息\ system(\ else if(type==2){ MessageBox(NULL,\在弹出的记事本中确认明文\\n 完成后按任意键继续\消息\ system(\ else{ MessageBox(NULL,\在弹出的记事本中确认密文\\n 完成后按任意键继续\消息\ system(\ getch(); if(type==1) printf(\密钥:\ else if(type==2) printf(\明文:\ else printf(\密文:\ FILE *fp; fp=fopen(mingzi,\ for(i=0;!feof(fp);i++) {if(type==1) fscanf(fp, \密钥是ASCII fscanf读整型即可 else if(type==2) fscanf(fp, \明文是字符 第 18 页 共 33 页
相关推荐: