• 大小: 8KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-23
  • 语言: C/C++
  • 标签: AES  S盒  费马定理  

资源简介

AES的S盒可以用扩展的欧几里德和费马定理来写,这里我采用费马定理。要注意的是S盒的求逆过程是在加瓦罗域下进行的,所以里面的所有乘法、除法、加法、减法都是在加瓦罗域下进行。

资源截图

代码片段和文件信息

#include
#include
#include
#include
using namespace std;
#define DBYTE  short unsigned int   /*因为m(x)的最高项是8次方,所以总共有9项,所以就用2个字节来表示 */
#define BYTE   unsigned char

DBYTE  mx=0x011b;  /* m(x)的那个多项式,表示成16进制 */


/*********************************确定一个字节的某一位是否为1***********************************/

int seekat7(BYTE temp)
{
    if(temp &  0x80)  return 1;
    else   return 0;
}
int seekat6(BYTE temp)
{
    if(temp &  0x40)  return 1;
    else   return 0;
}
int seekat5(BYTE temp)
{
    if(temp &  0x20)  return 1;
    else   return 0;
}
int seekat4(BYTE temp)
{
    if(temp &  0x10)  return 1;
    else   return 0;
}
int seekat3(BYTE temp)
{
    if(temp &  0x08)  return 1;
    else   return 0;
}
int seekat2(BYTE temp)
{
    if(temp &  0x04)  return 1;
    else   return 0;
}
int seekat1(BYTE temp)
{
    if(temp &  0x02)  return 1;
    else   return 0;
}
int seekat0(BYTE temp)
{
    if(temp &  0x01)  return 1;
    else   return 0;
}
/*******************************************************************************************************/




/*********************************一个用两个字节表示的数它的最高非0位是第几位***********************************/

int length(DBYTE  temp)


  int i=0;
  while(1)
  { 
   
    if(temp==0)  break;
    temp=temp>>1;
    i++;
  }
  
  return i;
  
}
/*******************************************************************************************************/



/*一个字节在伽瓦罗域下自乘,返回自乘结果(这个是经过简化后的结果,有些位直接是等于0,有些位就看原来的那个字节在某一位是否为1.)*/
/*自己可以在草稿子上列一些每一位是等于哪些位的乘,有些项是可以消去的(相同的一项异或的结果为0)。总共有14位,自己列一下就清楚了*/
DBYTE mul(BYTE temp)
{
   DBYTE  out=0;
   if(seekat7(temp))  out+=0x4000;
   if(seekat6(temp))  out+=0x1000;
   if(seekat5(temp))  out+=0x0400;
   if(seekat4(temp))  out+=0x0100;
   if(seekat3(temp))  out+=0x0040;
   if(seekat2(temp))  out+=0x0010;
   if(seekat1(temp))  out+=0x0004;
   if(seekat0(temp))  out+=0x0001;
   
   return out;
   
   
}
/*******************************************************************************************************/



/****两个字节在伽瓦罗域下的乘积,事实上和上面那个函数是一样的,只不过上面的那个函数是两个相同的字节相乘,结果可以简化********/
/**********************************在这里没办法化简,所以只能老老实实一位一位的列出来****************************/
DBYTE  multwo(BYTE temp1BYTE temp2)
{
  DBYTE  out=0;
  if(seekat7(temp1)*seekat7(temp2)) out+=0x4000;
  if( (seekat7(temp1)*seekat6(temp2))^(seekat6(temp1)*seekat7(temp2))) out+=0x2000;
  if( (seekat7(temp1)*seekat5(temp2))^(seekat6(temp1)*seekat6(temp2))^(seekat5(temp1)*seekat7(temp2))) out+=0x1000;
  if( (seekat7(temp1)*seekat4(temp2))^(seekat6(temp1)*seekat5(temp2))^(seekat5(temp1)*seekat6(temp2))^(seekat4(temp1)*seekat7(temp2))) out+=0x0800;
  if( (seekat7(temp1)*seekat3(temp2))^(seekat6(temp1)*seekat4(temp2))^(seekat5(temp1)*seekat5(temp2))^(seekat4(temp1)*seekat6(temp2))^(seekat3(temp1)*seekat7(temp2))) out+=0x0400;
   if( (seekat7(temp1)*seekat2(temp2))^(seekat6(temp1)*seekat3(temp2))^(seekat5(temp1)*seekat4(temp2))^(seekat4(temp1)*seekat5(temp2))^(seekat3(temp1)*seekat6(temp2))^(seekat2(temp1)*seekat7(t

评论

共有 条评论