http://ting.tyblog.com/index.shtml
站点公告
站点日历
<<  < 2011 - 12 >  >>
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
站点信息
用户登陆
最新日志
最新评论
最新留言
群组圈子
友情链接
我的相册
AES[ 2006-12-12 13:34:00 | By: Eric ]

/*
*This program is about the AES algorithm.
*Author : Ting
*E-mail:kilvdn@yahoo.com.cn 
*Addr: China Unversity of Geoscience ( WuHan )
*/


#i nclude <stdio.h>
#i nclude <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
*/

阅读全文 | 回复(0) | 引用通告 | 编辑
  • 标签:Cryptography AES 
  • 发表评论:

     

    天涯博客欢迎您!