⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes.c

📁 用于实现AES加密、解密
💻 C
📖 第 1 页 / 共 2 页
字号:


void IvMixColumn(unsigned char C[][4],unsigned char d[][4])               //逆混合列变换 
{
 int c;
 for(c=0;c<4;c++)
 d[0][c]=(unsigned char)((int)gfmultby0e(C[0][c]) ^ (int)gfmultby0b(C[1][c]) ^
 (int)gfmultby0d(C[2][c]) ^ (int)gfmultby09(C[3][c]));
 
 for(c=0;c<4;c++)
 d[1][c]=(unsigned char)((int)gfmultby09(C[0][c]) ^ (int)gfmultby0e(C[1][c]) ^
 (int)gfmultby0b(C[2][c]) ^ (int)gfmultby0d(C[3][c]));
 
 for(c=0;c<4;c++)
 d[2][c]=(unsigned char)((int)gfmultby0d(C[0][c]) ^ (int)gfmultby09(C[1][c]) ^
 (int)gfmultby0e(C[2][c]) ^ (int)gfmultby0b(C[3][c]));
 
 for(c=0;c<4;c++)
 d[3][c]=(unsigned char)((int)gfmultby0b(C[0][c]) ^ (int)gfmultby0d(C[1][c]) ^
 (int)gfmultby09(C[2][c]) ^ (int)gfmultby0e(C[3][c]));
}
 
void AddRoundKey(unsigned char d[][4],unsigned char key[][4],unsigned char e[][4])       //加循环密钥
{
 int r,c;
 for(r=0;r<4;r++)
  for(c=0;c<4;c++)
   e[r][c]=(unsigned char)((int)d[r][c]^(int)key[r][c]);
}  


void KeyProducing(unsigned char BaseK[4][4],unsigned char K[4][44])              //扩展初始密钥到44列
{
 int r,c,i;
 unsigned char temp[4]={0},temp2[4]={0};
 for(c=0;c<4;++c)
 {
  for(r=0;r<4;++r)
	  K[r][c]=BaseK[r][c];
 }
 for(c=4;c<44;c++)
 {
  if(c%4!=0)
	 for(r=0;r<4;r++) 
	  K[r][c]=(unsigned char)((int)K[r][c-4] ^ (int)K[r][c-1]);
  else
  {  for(r=0;r<4;r++)
		temp[r]=K[r][c-1];
     temp=SubWord(RotWord(temp));   //先移位,再代换,最后和轮常量异或
     temp[0] = (unsigned char)( (int)temp[0] ^ (int) AesRcon[c+0] );   
	 temp[1] = (unsigned char)( (int)temp[1] ^ (int) AesRcon[c+1] );
	 temp[2] = (unsigned char)( (int)temp[2] ^ (int) AesRcon[c+2] );
	 temp[3] = (unsigned char)( (int)temp[3] ^ (int) AesRcon[c+3] );
  


/*	 for(r=0;r<4;r++)         //移位
		temp2[r]=temp1[(r+1)%4];
	 for(r=0;r<4;r++)           //代换
	 {
		sc =(int)temp2[r] & 0x0F;
		sr =(int)(temp2[r]>>4);
		temp2[r]=(unsigned char)Sbox[sr][sc];		 
	 }
	 R=(unsigned char)0x01;
	 for(i=0;i<(c-4)/4;i++)
		R=gfmultby02(R);                                           //完成课本上所说的r(i)=00000010的(i-4)/4次方
	 temp2[0]=(unsigned char)((int)temp2[0] ^ (int)R);             //完成课本上所说的T(W[i-1])*/
	 for(r=0;r<4;r++)
		K[r][c]=(unsigned char)((int)K[r][c-4] ^ temp[r]);
  }
 }
}


/*void IKeyProducing(unsigned char K[4][44],unsigned char IK[4][44])
{
	int c;
	for(c=0;c<44;c++)
		IK[0][c]=(unsigned char)((int)gfmultby0e(K[0][c]) ^ (int)gfmultby0b(K[1][c]) ^
		(int)gfmultby0d(K[2][c]) ^ (int)gfmultby09(K[3][c]));
	
	for(c=0;c<44;c++)
		IK[1][c]=(unsigned char)((int)gfmultby09(K[0][c]) ^ (int)gfmultby0e(K[1][c]) ^
		(int)gfmultby0b(K[2][c]) ^ (int)gfmultby0d(K[3][c]));
	
	for(c=0;c<44;c++)
		IK[2][c]=(unsigned char)((int)gfmultby0d(K[0][c]) ^ (int)gfmultby09(K[1][c]) ^
		(int)gfmultby0e(K[2][c]) ^ (int)gfmultby0b(K[3][c]));
	
	for(c=0;c<44;c++)
		IK[3][c]=(unsigned char)((int)gfmultby0b(K[0][c]) ^ (int)gfmultby0d(K[1][c]) ^
		(int)gfmultby09(K[2][c]) ^ (int)gfmultby0e(K[3][c]));	
}*/


void Encode(unsigned char In[][4],unsigned char K[][44],unsigned char*out)
{
 int  round,r,c;
 unsigned char Ki[4][4]={0};
 unsigned char e[4][4]={0},b[4][4]={0},C[4][4]={0},d[4][4]={0};
 for(r=0;r<4;r++)
	 for(c=0;c<4;c++)
		 Ki[r][c]=K[r][c];                           //第0个循环密钥
 AddRoundKey(In,Ki,e);                               //ARK,使用第0个循环密钥  
 for(round=1;round<10;round++)
 {
  ByteSub(e,b);                                     //字节转换
  ShiftRow(b,C);                                    //移动行变换
  MixColumn(C,d);                                   //混合列变换
  for(r=0;r<4;r++)
   for(c=0;c<4;c++)
	   Ki[r][c]=K[r][4*round+c];                    //产生第round轮循环的密钥Ki
  AddRoundKey(d,Ki,e);                              //roundth循环加密  
 }
  ByteSub(e,b);                                        //第10次循环加密的字节转换
  ShiftRow(b,C);                                       //第10次循环加密的移动行变换
  for(r=0;r<4;r++)
   for(c=0;c<4;c++)
	   Ki[r][c]=K[r][4*10+c];                      //产生第10轮循环的密钥Ki
  AddRoundKey(C,Ki,e);                               //10th循环加密  
  for(c=0;c<4;c++)
  {
   for(r=0;r<4;r++)
   out[r+4*c]=e[r][c];                             //加密结果转换成输入
  }
}


void Decode(unsigned char In[][4],unsigned char K[][44],unsigned char*out)
{
 unsigned char Ki[4][4]={0};
 unsigned char e[4][4]={0},b[4][4]={0},C[4][4]={0},d[4][4]={0};
 int  round,r,c;
 for(r=0;r<4;r++)
   for(c=0;c<4;c++)
	   Ki[r][c]=K[r][4*10+c];                         //产生第10轮循环的密钥Ki
 AddRoundKey(In,Ki,e);                                //10th循环解密
  for(round=9;round>0;round--)
 {
  IvByteSub(e,b);                                     //字节转换
  IvShiftRow(b,C);                                    //移动行变换
  IvMixColumn(C,d);                                   //混合列变换
  for(r=0;r<4;r++)
	  for(c=0;c<4;c++)
		  Ki[r][c]=K[r][4*round+c];                    //产生第round轮循环的密钥Ki	  
  AddRoundKey(d,Ki,e);                                //roundth循环解密  
 }
  IvByteSub(e,b);                                     //字节转换
  IvShiftRow(b,C);                                    //移动行变换
  for(r=0;r<4;r++)
   for(c=0;c<4;c++)
	   Ki[r][c]=K[r][c];                              //产生第round轮循环的密钥Ki
  AddRoundKey(C,Ki,e);                                //ARK,使用第0个循环密钥  
 
  for(c=0;c<4;c++)
   for(r=0;r<4;r++)
    out[r+4*c]=e[r][c];                                               //加密结果转换成输入
}
//*****************************************************************************
void main()
{
 unsigned char BaseM[4][4]={0},BaseK[4][4]={0};
 unsigned char K[4][44]={0};
 unsigned char Mwen[]="My name is ReFXr";
 unsigned char key[]="1234567890123456";
 unsigned char outjiam[16]={0};
 unsigned char outjiem[16]={0};
 int i;

 chartomatrix(Mwen,BaseM);
 chartomatrix(key,BaseK);
 KeyProducing(BaseK,K);                   //加密前处理

 printf("the article before being coded:\n");
 puts(Mwen);
 printf("the key is:\n");
 puts(key);
 
 Encode(BaseM,K,outjiam);
 printf("\nthe article after being coded:\n");
 //puts(outjiam);
 
 printf("\n"); 
 for(i=0;i<16;i++)
 {
  // if(outjiam[i] >=128)
   // printf("%d",(outjiam[i]%128));
  // else
	printf("%02x",outjiam[i]); 
 }
 printf("\n");

//解密前处理 
 chartomatrix(outjiam,BaseM);
 Decode(BaseM,K,outjiem);
 printf("\nthe article after being decoded:\n");
// puts(outjiem);
 
 printf("\n"); 
 for(i=0;i<16;i++)
 {
	 if(outjiem[i] >=128)
		 printf("%c",(outjiem[i]%128));
	 else
		 printf("%c",outjiem[i]); 
 }
 printf("\n");
 
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -