sms4的S盒构造c实现

sms4的S盒构造c实现

sms4算法中的s盒的构造是由三个函数复合而成的,公式为S(x)=L(I(L(x))),其中L(x)是仿射变换,而I(x)是逆变换。

仿射变换较为简单,而在模2的伽罗瓦域上求多项式的逆则比较复杂。

基本的假设是:对于数字1011,表示的是x^3+x+1,即二进制数的第n位为1时表示x^(n-1)

S盒仿射变换实现

  int change(int x){
      int A1=0xA7;
      int flag;
      int result=0;
      int tem;
      int flag2;
      for(int i=0;i<8;i++){
          flag=(A1 & 0x80)>>7;
          tem=x & A1;
          flag2=0;
          for(int j=0;j<8;j++){
              flag2^=(tem & 1);
              tem>>=1;
          }
          result=result | (flag2<<i);
          A1=(A1<<1) | flag;
      }
      result^=0xd3;
      return result;
  }

模2的伽罗瓦域上求多项式的逆

  • 在模2的伽罗瓦域上的多项式的加法和减法都是异或运算

  • 在模2的伽罗瓦域上的多项式乘法实现

      
      int multiplication(int a,int b){ 
          int tem=0;
          int i=0;
          while(b){
              if(b&1){
                  tem^=a<<i;
              }
              i++;
              b>>=1;
          }   
          return tem;
      }
  • 在模2的伽罗瓦域上的多项式除法实现

      
      int length(int x){
          int i=0;
          int comp=1;
          while(1){
              if(comp>=x){
                  return i;
              }
              comp=(comp<<1)+1;
              i++;
          }
      }
      
      void division(int a,int b,int* round,int* left){
          *round=0;
          *left=0;
          int distance;
          while(1){
              distance=length(a)-length(b);
              if(distance>=0 && a){ 
                  a=a ^ (b<<distance);
                  *round=(*round) | (1<<distance);
              }else{
                  *left=a;
                  break;
              }
          }   
      }
  • 在模2的伽罗瓦域上的多项式求逆(采用扩展欧几里德算法)

      
      //该函数表示在模a的情况下,b的逆
      int inverse(int a,int b){
          int x2=1;
          int x1=0;
          int y2=0;
          int y1=1;
          int temX1,temY1;
          int q,r,x,y;
          int i;
          while(b){
              division(a,b,&q,&r);
              //x=x2^multiplication(q,x1);
              y=y2^multiplication(q,y1);
      
              a=b;
              b=r;
              //x2=x1;
              //x1=x;
              y2=y1;
              y1=y;
          }
          return y2;
      }

打印S盒的结果

  
  int main(void)
  {
      for(int i=0;i<=0xf;i++)
          printf("\t%x",i);
      printf("\n");
      for(int i=0;i<=0xf;i++){
          printf("%x",i);
          for(int j=0;j<=0xf;j++){
              printf("\t%x",change(inverse(0x1f5,change((i<<4)|j))));
          }
          printf("\n");
      }
  
      return 0;
  }

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