📄 code.c
字号:
//AES加密程序,将原始数组1~12进行aes加密,得到一个新的矩阵
#include<stdio.h>
#include<math.h>
//#include<conio.h>
#define A 10
#define B 11
#define C 12
#define D 13
#define E 14
#define F 15
#define N 10
#define Nb 4
#define Nk 4
void ByteSub(int (*pinfo)[Nb]);
void ShiftRow(int (*pinfo)[Nb]);
void MixColumn(int (*pinfo)[Nb]);
void AddRoundKey(int (*pinfo)[Nb],int (*pRoundKey)[N*Nb+Nb],int round);
void KeyExpansion(int (*pKey_Original)[Nk],int (*pRoundKey)[N*Nb+Nb]);
int SearchSbox(int info);
int upper_sbox[16][16]={{6,7,7,7,F,6,6,C,3,0,6,2,F,D,A,7},
{C,8,C,7,F,5,4,F,A,D,A,A,9,A,7,C},
{B,F,9,2,3,3,F,C,3,A,E,F,7,D,3,1},
{0,C,2,C,1,9,0,9,0,1,8,E,E,2,B,7},
{0,8,2,1,1,6,5,A,5,3,D,B,2,E,2,8},
{5,D,0,E,2,F,B,5,6,C,B,3,4,4,5,C},
{D,E,A,F,4,4,3,8,4,F,0,7,5,3,9,A},
{5,A,4,8,9,9,3,F,B,B,D,2,1,F,F,D},
{C,0,1,E,5,9,4,1,C,A,7,3,6,5,1,7},
{6,8,4,D,2,2,9,8,4,E,B,1,D,5,0,D},
{E,3,3,0,4,0,2,5,C,D,A,6,9,9,E,7},
{E,C,3,6,8,D,4,A,6,5,F,E,6,7,A,0},
{B,7,2,2,1,A,B,C,E,D,7,1,4,B,8,8},
{7,3,B,6,4,0,F,0,6,3,5,B,8,C,1,9},
{E,F,9,1,6,D,8,9,9,1,8,E,C,5,2,D},
{8,A,8,0,B,E,4,6,4,9,2,0,B,5,B,1}};
int lower_sbox[16][16]={{3,C,7,B,2,B,F,5,0,1,7,B,E,7,B,6},
{A,2,9,D,A,9,7,0,D,4,2,F,C,4,2,0},
{7,D,3,6,6,F,7,C,4,5,5,1,1,8,1,5},
{4,7,3,3,8,6,5,A,7,2,0,2,B,7,2,5},
{9,3,C,A,B,E,A,0,2,B,6,3,9,3,F,4},
{3,1,0,D,0,C,1,B,A,B,E,9,A,C,8,F},
{0,F,A,B,3,D,3,5,5,9,2,F,0,C,F,8},
{1,3,0,F,2,D,8,5,C,6,A,1,0,F,3,2},
{D,C,3,C,F,7,4,7,4,7,E,D,4,D,9,3},
{0,1,F,C,2,A,0,8,6,E,8,4,E,E,B,B},
{0,2,A,A,9,6,4,C,2,3,C,2,1,5,4,9},
{7,8,7,D,D,5,E,9,C,6,4,A,5,A,E,8},
{A,8,5,E,C,6,4,6,8,D,4,F,B,D,B,A},
{0,E,5,6,8,3,6,E,1,5,7,9,6,1,D,E},
{1,8,8,1,9,9,E,4,B,E,7,9,E,5,8,F},
{C,1,9,D,B,6,2,8,1,9,D,F,0,4,B,6}};
void main()
{int info[4][Nb]={{0,4,8,12},
{1,5,9,13},
{2,6,10,14},
{3,7,11,15}};
int round=0;
int i,j;
int Key_Original[4][Nk]={{0,4,8,12},
{1,5,9,13},
{2,6,10,14},
{3,7,11,15}};
int RoundKey[4][N*Nb+Nb]={0};
KeyExpansion(Key_Original,RoundKey);
AddRoundKey(info,RoundKey,round);
for(round=1;round<N;round++)
{ByteSub(info);
ShiftRow(info);
MixColumn(info);
AddRoundKey(info,RoundKey,round);
if(round==N)
goto end;
}
ByteSub(info);
ShiftRow(info);
AddRoundKey(info,RoundKey,round);
end:
for(i=0;i<4;i++)
{for(j=0;j<Nb;j++)
printf(" %d ",info[i][j]);
printf("\n");
}
// getch();
}
void ByteSub(int (*pinfo)[Nb])
{int i,j;
for(i=0;i<4;i++)
for(j=0;j<Nb;j++)
*(*(pinfo+i)+j)=SearchSbox(*(*(pinfo+i)+j));
}
int SearchSbox(int info)
{int tens,ones,temp_tens,temp_ones;
tens=info/16;
ones=info%16;
temp_tens=upper_sbox[tens][ones];
temp_ones=lower_sbox[tens][ones];
info=temp_tens*16+temp_ones;
return (info);
}/*查表求出S盒变换,其中两个表中分别对应高位和低位*/
void ShiftRow(int (*pinfo)[Nb])
{int temp;
int i,j,k;
for(i=0;i<4;i++)
for(j=0;j<i;j++)
{temp=*(*(pinfo+i)+0);
for(k=0;k<Nb-1;k++)
*(*(pinfo+i)+k)=*(*(pinfo+i)+k+1);
*(*(pinfo+i)+Nb-1)=temp;
}
}/*左移*/
void MixColumn(int (*pinfo)[Nb])
{int j,k;
int sum=0;
int a0[8],a1[8],a2[8],a3[8];
int b0[8],b1[8],b2[8],b3[8];
for(j=0;j<Nb;j++)
{for(k=0;k<8;k++)
{a0[k]=(*(*(pinfo+0)+j)/(int)pow(2,7-k))%2;
a1[k]=(*(*(pinfo+1)+j)/(int)pow(2,7-k))%2;
a2[k]=(*(*(pinfo+2)+j)/(int)pow(2,7-k))%2;
a3[k]=(*(*(pinfo+3)+j)/(int)pow(2,7-k))%2;
}
b0[0]=a0[1]+a2[0]+a3[0]+a1[1]+a1[0];
b0[1]=a0[2]+a2[1]+a3[1]+a1[2]+a1[1];
b0[2]=a0[3]+a2[2]+a3[2]+a1[3]+a1[2];
b0[3]=a0[0]+a0[4]+a2[3]+a3[3]+a1[0]+a1[4]+a1[3];
b0[4]=a0[0]+a0[5]+a2[4]+a3[4]+a1[0]+a1[5]+a1[4];
b0[5]=a0[6]+a2[5]+a3[5]+a1[6]+a1[5];
b0[6]=a0[0]+a0[7]+a2[6]+a3[6]+a1[0]+a1[7]+a1[6];
b0[7]=a0[0]+a2[7]+a3[7]+a1[0]+a1[7];
b1[0]=a2[1]+a2[0]+a1[1]+a0[0]+a3[0];
b1[1]=a2[2]+a2[1]+a1[2]+a0[1]+a3[1];
b1[2]=a2[3]+a2[2]+a1[3]+a0[2]+a3[2];
b1[3]=a2[0]+a2[4]+a2[3]+a1[0]+a1[4]+a0[3]+a3[3];
b1[4]=a2[0]+a2[5]+a2[4]+a1[0]+a1[5]+a0[4]+a3[4];
b1[5]=a2[6]+a2[5]+a1[6]+a0[5]+a3[5];
b1[6]=a2[0]+a2[7]+a2[6]+a1[0]+a1[7]+a0[6]+a3[6];
b1[7]=a2[0]+a2[7]+a1[0]+a0[7]+a3[7];
b2[0]=a0[0]+a3[1]+a3[0]+a2[1]+a1[0];
b2[1]=a0[1]+a3[2]+a3[1]+a2[2]+a1[1];
b2[2]=a0[2]+a3[3]+a3[2]+a2[3]+a1[2];
b2[3]=a0[3]+a3[0]+a3[4]+a3[3]+a2[0]+a2[4]+a1[3];
b2[4]=a0[4]+a3[0]+a3[5]+a3[4]+a2[0]+a2[5]+a1[4];
b2[5]=a0[5]+a3[6]+a3[5]+a2[6]+a1[5];
b2[6]=a0[6]+a3[0]+a3[7]+a3[6]+a2[0]+a2[7]+a1[6];
b2[7]=a0[7]+a3[0]+a3[7]+a2[0]+a1[7];
b3[0]=a2[0]+a1[0]+a0[1]+a0[0]+a3[1];
b3[1]=a2[1]+a1[1]+a0[2]+a0[1]+a3[2];
b3[2]=a2[2]+a1[2]+a0[3]+a0[2]+a3[3];
b3[3]=a2[3]+a1[3]+a0[0]+a0[4]+a0[3]+a3[0]+a3[4];
b3[4]=a2[4]+a1[4]+a0[0]+a0[5]+a0[4]+a3[0]+a3[5];
b3[5]=a2[5]+a1[5]+a0[6]+a0[5]+a3[6];
b3[6]=a2[6]+a1[6]+a0[0]+a0[7]+a0[6]+a3[0]+a3[7];
b3[7]=a2[7]+a1[7]+a0[0]+a0[7]+a3[0];
for(k=0;k<8;k++)
{a0[k]=b0[k]%2;
a1[k]=b1[k]%2;
a2[k]=b2[k]%2;
a3[k]=b3[k]%2;
}
sum=0;
for(k=0;k<8;k++)
sum=sum+a0[k]*(int)pow(2,7-k);
*(*(pinfo+0)+j)=sum;
sum=0;
for(k=0;k<8;k++)
sum=sum+a1[k]*(int)pow(2,7-k);
*(*(pinfo+1)+j)=sum;
sum=0;
for(k=0;k<8;k++)
sum=sum+a2[k]*(int)pow(2,7-k);
*(*(pinfo+2)+j)=sum;
sum=0;
for(k=0;k<8;k++)
sum=sum+a3[k]*(int)pow(2,7-k);
*(*(pinfo+3)+j)=sum;
}
}
/*实现矩阵相乘的变换*/
void AddRoundKey(int (*pinfo)[Nb],int (*pRoundKey)[Nb*N+Nb],int round)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -