DES一轮加密(C语言)

来源:互联网 发布:中国移动有什么软件 编辑:程序博客网 时间:2024/05/18 02:53
DES一轮加密算法,假设8个S盒一样,都为S1盒。输出每一步
的结果。
已知R0=00000000 11111111 00000110 10000011,
子密钥K1=00111101 10001111 11001101 00110111 00111111 00000110
实现E盒扩展、与轮密钥异或加、S盒代换(8个一样的S盒,都为S1盒)和P盒置换。

#include
#include
    intR0[32]={0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,1,1};
    intK1[48]={0,0,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,0,1,1,0,1,0,0,1,1,0,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,0};
    intE[48];
    intS[4][16]={{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
              {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
                 {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
                 {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}};
    intP[32]={16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,
            8,24,14,32,27,3,9,19,13,30,6,22,11,4,25};

    int i,j;
    intR1[48],R2[32],R3[32];

int kuozhan_E()
{

    int a=1,b=2,c=3,d=4;
    intcount0=1;
    intcount1=1;

    for(i=0;i<48;i=i+6)
    {
     E=R0[(4*count0+27)2];
     count0++;
    }

    for(i=5;i<48;i=i+6)
    {
     E=R0[(4*count1+32)2];
     count1++;
    }

  for(i=0;i<32;i++)
    {
    if(i%4==0)
    {
      E[a]=R0;
      a=a+6;
    }

   else if(i%4==1)
    {
      E=R0;
      b=b+6;
    }

   else if(i%4==2)
    {
      E[c]=R0;
      c=c+6;
    }

  else if(i%4==3)
    {
      E[d]=R0;
      d=d+6;
    }
    }
    for(i=0;i<48;i++)
    {
    printf("%d",E);
    if(i%6==5)
    printf("n");
    }
}

int yihuo()
        
       for(j=0;j<48;j++)
        {
             R1[j]=E[j]^K1[j];
             printf("%d",R1[j]);
       if(j%6==5)
       printf("n");
        }

   }
   
int S_bianhuan()
   {
        inth,l,n=0;  //h l表示行列
        intp,q,k=0,S1[8];
    printf("s盒代换十进制:n");
    
   for(p=0;p<47;p+=6)
    {
           h=1*R1[p+5]+2*R1[p];
           l=8*R1[p+1]+4*R1[p+2]+2*R1[p+3]+1*R1[p+4];
           S1[k]=S[h][l];
      printf("%d ",S1[k]);
      int x;
           x=n+3;
      for(int i=0;i<4;i++)
      {
            R2[x]=S1[k]%2;
            S1[k]/=2;
             x--;
         n++;
      }
         k++;
    }
    printf("n");
    printf("s盒代换结果:n");
    for(intj=0;j<32;j++)
    {
     printf("%d ",R2[j]);
      if(j%4==3)
      printf("n");
    }
   }
   
   
int P_bianhuan()
{
    for (i=0;i<32;i++)
    {
      R3=R2[P-1];
      printf("%d ",R3);
       if(i%4==3)
       printf("n");
    }


}
   
int main()
{
    printf("扩展En");
    kuozhan_E();

   printf("扩展E变换后与K1异或结果:n");
    yihuo();
    
    printf("S盒变换:n");
    S_bianhuan();
    
    printf("P盒变换:n");
    P_bianhuan();
}
0 0
原创粉丝点击