密碼學作業二:AES

 

#include <stdio.h>
#include 
<stdlib.h>

int sub[16],key[16];

int S_BOX[256]={  //S盒表  
    99 ,124,119,123,242,107,111,194,48 ,1  ,103,43 ,254,215,171,118,
                
202,130,201,125,250,89 ,71 ,240,173,212,162,175,156,164,114,192,
                
183,253,147,38 ,54 ,63 ,247,204,52 ,165,229,241,113,216,49 ,21 ,
                
4  ,199,35 ,195,24 ,150,5  ,154,7  ,19 ,128,226,235,39 ,178,117,
                
9  ,131,44 ,26 ,27 ,110,90 ,160,82 ,59 ,214,179,41 ,227,47 ,132,
                
83 ,209,0  ,237,32 ,252,177,91 ,106,203,190,57 ,74 ,76 ,88 ,207,
                
208,239,170,251,67 ,77 ,51 ,133,69 ,249,2  ,127,80 ,60 ,159,168,
                
81 ,163,64 ,143,146,157,56 ,245,188,182,218,33 ,16 ,255,243,210,
                
205,12 ,19 ,236,95 ,151,68 ,23 ,196,167,126,61 ,100,93 ,25 ,115,
                
96 ,129,79 ,220,34 ,42 ,144,136,70 ,238,184,20 ,222,94 ,11 ,219,
                
224,50 ,58 ,10 ,73 ,6  ,36 ,92 ,194,211,172,98 ,145,149,228,121,
                
231,200,55 ,109,141,213,78 ,169,108,86 ,244,234,101,122,174,8  ,
             
186,120,37 ,46 ,28 ,166,180,198,232,221,116,31 ,75 ,189,139,138,
             
112,62 ,181,102,72 ,3  ,246,14 ,97 ,53 ,87 ,185,134,193,29 ,158,
                
225,248,152,17 ,105,217,142,148,155,30 ,135,233,206,85 ,40 ,223,
                
140,161,137,13 ,191,230,66 ,104,65 ,153,45 ,15 ,176,84 ,187,22
                }

                   
int InS_BOX[256]={  //逆S盒表 
    82 ,9  ,106,213,48 ,54 ,165,56 ,191,64 ,163,158,129,243,215,251,
       
124,227,57 ,130,155,47 ,255,135,52 ,142,67 ,68 ,196,222,233,203,
       
84 ,123,148,50 ,166,194,35 ,61 ,238,76 ,149,11 ,66 ,250,195,78 ,
       
8  ,46 ,161,102,40 ,217,36 ,178,118,91 ,162,73 ,109,139,209,37 ,
       
114,248,246,100,134,104,152,22 ,212,164,92 ,204,93 ,101,182,146,
       
108,112,72 ,80 ,253,237,185,218,94 ,21 ,70 ,87 ,167,141,157,132,
       
144,216,171,0  ,140,188,211,10 ,247,228,88 ,5  ,184,179,69 ,6  ,
       
208,44 ,30 ,143,202,63 ,15 ,2  ,193,175,189,3  ,1  ,19 ,138,107,
       
58 ,145,17 ,65 ,79 ,103,220,234,151,242,207,206,240,180,230,115,
       
150,172,116,34 ,231,173,53 ,133,226,249,55 ,232,28 ,117,223,110,
       
71 ,241,26 ,113,29 ,41 ,197,137,111,183,98 ,14 ,170,24 ,190,27 ,
       
252,86 ,62 ,75 ,198,210,121,32 ,154,219,192,254,120,205,90 ,244,
       
31 ,221,168,51 ,136,7  ,199,49 ,177,18 ,16 ,89 ,39 ,128,236,95 ,
       
96 ,81 ,127,169,25 ,181,74 ,13 ,45 ,229,122,159,147,201,156,239,
       
160,224,59 ,77 ,174,42 ,245,176,200,235,187,60 ,131,83 ,153,97 ,
       
23 ,43 ,4  ,126,186,119,214,38 ,225,105,20 ,99 ,85 ,33 ,12 ,125     
    }
 ;    
             
int Inlog_Table[256]={  //生成元爲03的反對數表      
                1  ,3  ,5  ,15 ,17 ,51 ,85 ,255,26 ,46 ,114,150,161,248,19 ,53 ,
                
95 ,225,56 ,72 ,216,115,149,164,247,2  ,6  ,10 ,30 ,34 ,102,170,
                
229,52 ,92 ,228,55 ,89 ,235,38 ,106,190,217,112,144,171,230,49 ,
                
83 ,245,4  ,12 ,20 ,60 ,68 ,204,79 ,209,104,184,211,110,178,205,
                
76 ,212,103,169,224,59 ,77 ,215,98 ,166,241,8  ,24 ,40 ,120,136,
                
131,158,185,208,107,189,220,127,129,152,179,206,73 ,219,118,154,
                
181,196,87 ,249,16 ,48 ,80 ,240,11 ,29 ,39 ,105,187,214,97 ,163,
                
254,25 ,43 ,125,135,146,173,236,47 ,113,147,174,233,32 ,96 ,160,
                
251,22 ,58 ,78 ,210,109,183,194,93 ,231,50 ,86 ,250,21 ,63 ,65 ,
                
195,97 ,226,61 ,71 ,201,64 ,192,91 ,237,44 ,116,156,191,218,117,
    
159,186,213,100,172,239,42 ,126,130,157,188,223,122,142,137,128,
                
155,182,193,88 ,232,35 ,101,175,234,37 ,111,177,200,67 ,197,84 ,
                
252,31 ,33 ,99 ,165,244,7  ,9  ,27 ,45 ,119,153,176,203,70 ,202,
                
69 ,207,74 ,222,121,139,134,145,168,227,62 ,66 ,198,81 ,243,14 ,
                
18 ,54 ,90 ,238,41 ,123,141,140,143,138,133,148,167,242,13 ,23 ,
                
57 ,75 ,221,124,132,151,162,253,28 ,36 ,108,180,199,82 ,246,1
                }
;

int Log_Table[256]={  //生成元爲03的對數表 
                0  ,0  ,25 ,1  ,50 ,2  ,26 ,198,75 ,199,27 ,104,51 ,238,223,3  ,
                
100,4  ,224,14 ,52 ,141,129,239,76 ,113,8  ,200,248,105,28 ,193,
                
125,194,29 ,181,249,185,39 ,106,77 ,228,166,114,154,201,9  ,120,
                
101,47 ,138,5  ,33 ,15 ,225,36 ,18 ,240,130,69 ,53 ,147,218,142,
                
150,143,219,189,54 ,208,206,148,19 ,92 ,210,241,64 ,70 ,131,56 ,
                
102,221,253,48 ,191,6  ,139,98 ,179,37 ,226,152,34 ,136,145,16 ,
                
126,110,72 ,195,163,182,30 ,66 ,58 ,107,40 ,84 ,250,133,61 ,186,
                
43 ,121,10 ,21 ,155,159,94 ,202,78 ,212,172,229,243,115,167,87 ,
                
175,88 ,168,80 ,244,234,214,116,79 ,174,233,213,231,230,173,232,
                
44 ,215,117,122,235,22 ,11 ,245,89 ,203,95 ,176,156,169,81 ,160,
                
127,12 ,246,111,23 ,196,73 ,236,216,67 ,31 ,45 ,164,118,123,183,
                
204,187,62 ,90 ,251,96 ,177,134,59 ,82 ,161,108,170,85 ,41 ,157,
                
151,178,135,144,97 ,190,220,252,188,149,207,205,55 ,63 ,91 ,209,
                
83 ,57 ,132,60 ,65 ,162,109,71 ,20 ,42 ,158,93 ,86 ,242,211,171,
                
68 ,17 ,146,217,35 ,32 ,46 ,137,180,124,184,38 ,119,153,227,165,
                
103,74 ,237,222,197,49 ,254,24 ,13 ,99 ,140,128,192,247,112,7
                }

/*
S盒變換SubByte,按照字節進行的代替變換。 
*/
 
void SubBytes(){
 
int i ;
 
for (i=0;i<16;i++)
 sub[i]
=S_BOX[sub[i]];

}

/*
行移位變換ShiftRow, 對狀態行的循環移位變換。在ShiftRow變換中, 狀態的後三行以
不同的移位值循環右移。行0不移位, 行1移1字節,行2移2字節,行3移3字節。 
*/
 
void ShiftRows(){
 
int temp , temp2 ; 
 temp
=sub[4];
 sub[
4]=sub[5] , sub[5]=sub[6] , sub[6]=sub[7] , sub[7]=temp;
 temp2
=2;
 
while (temp2--){
  temp
=sub[8];
  sub[
8]=sub[9] , sub[9]=sub[10] , sub[10]=sub[11] , sub[11]=temp;
 }

 temp2
=3;
 
while (temp2--){
  temp
=sub[12];
  sub[
12]=sub[13] , sub[13]=sub[14] , sub[14]=sub[15] , sub[15]=temp;
 }

}


/*
列混淆變換MixColumn 
*/
 
void MixColumns(){
 
int Mix[4][4]={25,1,0,0,0,25,1,0,0,0,25,1,1,0,0,25};
 
/*
 矩陣Mix是矩陣{02,03,01,01,01,02,03,01,01,01,02,03,03,01,01,02} 生成元爲03的
 對數 ,經查對數表得來。 
 
*/
 
 
for ( int i=0;i<4;i++){
  
int a , b , c , d;
  a
=sub[4*0+i];
  b
=sub[4*1+i];
  c
=sub[4*2+i];
  d
=sub[4*3+i];
  
for (int j=0;j<4;j++){
   sub[j
*4+i]=Inlog_Table[(Log_Table[a]+Mix[j][0])%255];
   sub[j
*4+i]^=Inlog_Table[(Log_Table[b]+Mix[j][1])%255];
   sub[j
*4+i]^=Inlog_Table[(Log_Table[c]+Mix[j][2])%255];
   sub[j
*4+i]^=Inlog_Table[(Log_Table[d]+Mix[j][3])%255];
  }

 }

}


void Key_Schedule();
/*
圈密鑰加變換 
*/
 
void AddRoundKey(){
 
for (int i=0;i<16;i++)
  sub[i]
^=key[i];  
 Key_Schedule(); 
}


void Round(){
 SubBytes();
 ShiftRows();
 MixColumns();
 AddRoundKey(); 
}


void FinalRound(){
 SubBytes();
 ShiftRows();
 AddRoundKey(); 
}


/*
Key Schedule 
*/

int rcon=1;
void Key_Schedule(){
 
int tem[4];
 
/*
 取出密鑰的最後一列,並移位 
 
*/

 tem[
0]=S_BOX[key[7]]; 
 tem[
1]=S_BOX[key[11]];
 tem[
2]=S_BOX[key[15]];
 tem[
3]=S_BOX[key[3]];
 
 key[
0]=(key[0]^tem[0]^rcon)%256;
 key[
4]=key[4]^tem[1]%256;
 key[
8]=key[8]^tem[2]%256;
 key[
12]=key[12]^tem[3]%256;

 
int i,j;
 
for (i=0;i<4;i++)
 
for (j=1;j<4;j++){
  key[i
*4+j]^=key[i*4+j-1];
  key[i
*4+j]%=256;
 }
 
 rcon
*=2
}


/**********************************************************************
加密過程 
**********************************************************************
*/

void Encrypt(){
 AddRoundKey();    
//首先是一個初始密鑰加 
 for (int i=0;i<9;i++)  //其次是九輪的圈變換 
 Round();
 FinalRound();    
//最後一輪圈變換,跟前面的圈變換不同的是,
        
//最後一輪沒有列混淆變換   
 printf("the cipher is:"); //輸出密文 
 for (int i=0;i<16;i++){
  
if (i%4==0) printf(" ");  
  printf(
"%x ", sub[i]);
 }

 printf(
" ");
}


int main(){
 
int i ;
// freopen("keysec.txt","w",stdout);
 for (i=0;i<16;i++)
 scanf(
"%x",sub+i);
 
for (i=0;i<16;i++)
 scanf(
"%x",key+i);
 Encrypt();
// system("pause:");
 return 0
}
 
/*
input:
 32 88 31 e0
 43 5a 31 37
 f6 30 98 07
 a8 8d a2 34

 2b 28 ab 09
 7e ae f7 cf 
 15 d2 15 4f 
 16 a6 88 3c
output:
 the cipher is:
 cf 4b f7 bb 
 95 5f 73 5a 
 23 2e ae 25 
 7f 10 9c 42 
*/

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章