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;
  }

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