茅房总监吧 关注:1贴子:43
  • 5回复贴,共1
实验二:
#include <stdio.h>
#include <string.h>
#include <memory.h>
/*密钥置换选择表PC_1*/
const char PC_1[56]={
     57, 49, 41, 33, 25, 17,   9,   1, 58, 50, 42, 34, 26, 18,
     10,   2, 59, 51, 43, 35, 27, 19, 11,   3, 60, 52, 44, 36,
     63, 55, 47, 39, 31, 23, 15,   7, 62, 54, 46, 38, 30, 22,
     14,   6, 61, 53, 45, 37, 29, 21, 13,   5, 28, 20, 12,   4
};
/*左移循环表Left_loop*/
const char Left_loop[16]={
     1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
/*密钥置换选择表PC_2*/
const char PC_2[48]={
      14, 17, 11, 24,   1,   5,
       3, 28, 15,   6, 21, 10,
      23, 19, 12,   4, 26,   8,
      16,   7, 27, 20, 13,   2,
      41, 52, 31, 37, 47, 55,
      30, 40, 51, 45, 33, 48,
      44, 49, 39, 56, 34, 53,
      46, 42, 50, 36, 29, 32
};
/*数据初始变换表*/
const char IP[64]=
{
     58, 50, 42, 34, 26, 18, 10, 2,
     60, 52, 44, 36, 28, 20, 12, 4,
     62, 54, 46, 38, 30, 22, 14, 6,
     64, 56, 48, 40, 32, 24, 16, 8,
     57, 49, 41, 33, 25, 17,   9, 1,
     59, 51, 43, 35, 27, 19, 11, 3,
     61, 53, 45, 37, 29, 21, 13, 5,
     63, 55, 47, 39, 31, 23, 15, 7
};
/*扩展表*/
const char Exp[48]={
     32, 1,   2,   3,   4,   5,
     4,   5,   6,   7,   8,   9,
     8,   9, 10, 11, 12, 13,
     12, 13, 14, 15, 16, 17,
     16, 17, 18, 19, 20, 21,
     20, 21, 22, 23, 24, 25,
     24, 25, 26, 27, 28, 29,
     28, 29, 30, 31, 32, 1
};
/*S_Box*/
const static char S[8][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,



IP属地:浙江1楼2010-10-28 22:34回复
         15, 12,   8,   2,   4,   9,   1,   7,   5, 11,   3, 14, 10,   0,   6, 13,
      
         15,   1,   8, 14,   6, 11,   3,   4,   9,   7,   2, 13, 12,   0,   5, 10,
          3, 13,   4,   7, 15,   2,   8, 14, 12,   0,   1, 10,   6,   9, 11,   5,
          0, 14,   7, 11, 10,   4, 13,   1,   5,   8, 12,   6,   9,   3,   2, 15,
         13,   8, 10,   1,   3, 15,   4,   2, 11,   6,   7, 12,   0,   5, 14,   9,
      
         10,   0,   9, 14,   6,   3, 15,   5,   1, 13, 12,   7, 11,   4,   2,   8,
         13,   7,   0,   9,   3,   4,   6, 10,   2,   8,   5, 14, 12, 11, 15,   1,
         13,   6,   4,   9,   8, 15,   3,   0, 11,   1,   2, 12,   5, 10, 14,   7,
         1, 10, 13,   0,   6,   9,   8,   7,   4, 15, 14,   3, 11,   5,   2,   12,
       
          7, 13, 14,   3,   0,   6,   9, 10,   1,   2,   8,   5, 11, 12,   4, 15,
         13,   8, 11,   5,   6, 15,   0,   3,   4,   7,   2, 12,   1, 10, 14,   9,
         10,   6,   9,   0, 12, 11,   7, 13, 15,   1,   3, 14,   5,   2,   8,   4,
          3, 15,   0,   6, 10,   1, 13,   8,   9,   4,   5, 11, 12,   7,   2, 14,
        
          2, 12,   4,   1,   7, 10, 11,   6,   8,   5,   3, 15, 13,   0, 14,   9,
         14, 11,   2, 12,   4,   7, 13,   1,   5,   0, 15, 10,   3,   9,   8,   6,
    


    IP属地:浙江2楼2010-10-28 22:34
    回复
            4,   2,   1, 11, 10, 13,   7,   8, 15,   9, 12,   5,   6,   3,   0, 14,
           11,   8, 12,   7,   1, 14,   2, 13,   6, 15,   0,   9, 10,   4,   5,   3,
         
           12,   1, 10, 15,   9,   2,   6,   8,   0, 13,   3,   4, 14,   7,   5, 11,
           10, 15,   4,   2,   7, 12,   9,   5,   6,   1, 13, 14,   0, 11,   3,   8,
            9, 14, 15,   5,   2,   8, 12,   3,   7,   0,   4, 10,   1, 13, 11,   6,
            4,   3,   2, 12,   9,   5, 15, 10, 11, 14,   1,   7,   6,   0,   8, 13,
          
            4, 11,   2, 14, 15,   0,   8, 13,   3, 12,   9,   7,   5, 10,   6,   1,
           13,   0, 11,   7,   4,   9,   1, 10, 14,   3,   5, 12,   2, 15,   8,   6,
            1,   4, 11, 13, 12,   3,   7, 14, 10, 15,   6,   8,   0,   5,   9,   2,
            6, 11, 13,   8,   1,   4, 10,   7,   9,   5,   0, 15, 14,   2,   3, 12,
          
           13,   2,   8,   4,   6, 15, 11,   1, 10,   9,   3, 14,   5,   0, 12,   7,
            1, 15, 13,   8, 10,   3,   7,   4, 12,   5,   6, 11,   0, 14,   9,   2,
            7, 11,   4,   1,   9, 12, 14,   2,   0,   6, 10, 13, 15,   3,   5,   8,
            2,   1, 14,   7,   4, 10,   8, 13, 15, 12,   9,   0,   3,   5,   6, 11
         };
      /*把从S盒中得到的数据重新排列的表*/
      const char PP[32]={
           16, 7, 20, 21,
           29, 12, 28, 17,
           1,   15, 23, 26,
      


      IP属地:浙江3楼2010-10-28 22:34
      回复
             5,   18, 31, 10,
             2,   8, 24, 14,
             32, 27, 3,   9,
             19, 13, 30, 6,
             22, 11, 4,   25
        };
            
        /*逆IP置换*/
        const char FP[64]={
             40, 8, 48, 16, 56, 24, 64, 32,
             39, 7, 47, 15, 55, 23, 63, 31,
             38, 6, 46, 14, 54, 22, 62, 30,
             37, 5, 45, 13, 53, 21, 61, 29,
             36, 4, 44, 12, 52, 20, 60, 28,
             35, 3, 43, 11, 51, 19, 59, 27,
             34, 2, 42, 10, 50, 18, 58, 26,
             33, 1, 41,   9, 49, 17, 57, 25    
        };
        /* 密钥定义*/
        static unsigned char DesKey[8];
        static unsigned char SubKey[16][48];
        static unsigned char tmp[128];
        void trans_table(unsigned char * Out ,unsigned char * In ,   const char * Table , int len)
        {
             int i;
             for(i=0;i!=len;i++)
                  tmp[i]=In[Table[i]-1];
             memcpy(Out , tmp , len);
        }
        void Bytes_to_Bits(unsigned char * Out , const unsigned char * In , int len)
        {
             int i;
             for(i=0;i!=len;i++)
             {
                
                 Out[i]=(In[i>>3]>>(i&7)) & 1;       
                
             }
        }
        void Bits_to_Bytes(unsigned char * Out , const unsigned char * In , int len)
        {
              int i;
              memset(Out, 0,len>>3);
              for(i=0;i!=len;i++)
              {
                  Out[i>>3] |= (In[i]<<(i&7));
              }
        }
        void Xor(unsigned char * Out , unsigned char * In , int len)
        {
              int i;
              for(i=0;i!=len;i++)
              if(Out[i]!=In[i]) Out[i]=1;
              else Out[i]=0;
        }
        void Rotate(unsigned char * In , int len , int loop)//此处有一句需更正
        {  
            memcpy(tmp,In,loop);        //In指向的地址的loop长的值拷贝到tmp
            memcpy(In,In+loop,len-loop);
            memcpy(In+len-loop,tmp,loop);
        }
        void Set_Subkey(unsigned char * key)
        {
             int i=strlen((const   char*)key);
             if(i>8)
             memcpy(DesKey,key,8);
             else
        


        IP属地:浙江4楼2010-10-28 22:34
        回复
               {
                  memset(DesKey,0,8);
                  memcpy(DesKey,key,i);
               }
               unsigned char tk[64];
               Bytes_to_Bits(tk,DesKey,64);
               trans_table(tk,tk,PC_1,56);
              // char C[2],D[2];
               for(i=0;i!=16;i++)
               {
                  Rotate(&tk[0],28,Left_loop[i]);
                  Rotate(&tk[28],28,Left_loop[i]);
                  trans_table(SubKey[i],tk,PC_2,48);
               }
          }
          void S_func(unsigned char E[48],unsigned char B[32])
          {
               int i,j,k;
               for(i=0;i!=8;i++,E+=6,B+=4)
               {
                 
                   j=(E[0]<<1)+E[5];
                   k=(E[1]<<3)+(E[2]<<2)+(E[3]<<1)+E[4];
                   Bytes_to_Bits(B,(const unsigned char *)&S[i][j][k],4);
               }
          }
          void F_func(unsigned char RL[32], unsigned char key[48] ,unsigned char B[32])
          {
               unsigned char E[48];
               trans_table(E,RL,Exp,48);
               Xor(E,key,48);
               S_func(E,B);
               trans_table(B,B,PP,32);
          }
          void Des_E(unsigned char In[8] , unsigned char Out[8] )
          {
               unsigned char tt[64],B[32] , * L=&tt[0] , *R=&tt[32] ;
               int i;
               Bytes_to_Bits(tt,In,64);
               trans_table(tt,tt,IP,64);
               for(i=0;i!=16;i++)
               {
                   F_func(R,SubKey[i],B);
                   Xor(B,L,32);
                   memcpy(L,R,32);
                   memcpy(R,B,32);
               }
               trans_table(tt,tt,FP,64);
               Bits_to_Bytes(Out,tt,64);
          }
          void Des_D(unsigned char In[8] , unsigned char Out[8] )
          {
               unsigned char tt[64],B[32],*L=&tt[0],*R=&tt[32];
               int i;
               Bytes_to_Bits(tt,In,64);
               trans_table(tt,tt,IP,64);
               for(i=15;i>=0;i--)
               {
                   F_func(L,SubKey[i],B);
                   Xor(B,R,32);
                   memcpy(R,L,32);
                   memcpy(L,B,32);
          


          IP属地:浙江5楼2010-10-28 22:34
          回复
                 }
                 trans_table(tt,tt,FP,64);
                 Bits_to_Bytes(Out,tt,64);
            }
            int main()
            {
                 int i,j,len;
                 unsigned char key[16];
                 printf("请输入密钥(8位):");
                 scanf("%s",&key);
                 printf("%s\n",key);
                 Set_Subkey(key);
                 unsigned char In[128];
                 unsigned char Out[128];
                 unsigned char D_Out[128];
                 memset(In,0,128);
                 memset(Out,0,128);
                 printf("请输入要加密的内容(100位以内):\n");
                 scanf("%s",In);
                 len=strlen((const char *)In);
                 printf("\n输入字符串长为:   %d\n",len);
                 j=len>>3;
                 for(i=0;i!=j+1;i++)
                 {
                     Des_E(In+(i*8),Out+(i*8));
                 }
                 printf("加密结果用ASCII码形式表示为:\n");
                 for(i=0;i!=len>>3;i++)
                 {
                     for(j=0;j!=8;j++)
                         printf("%c   ",Out[(i<<3)+j]);
                     printf("\n");
                 }
                 for(i=(len>>3)<<3;i!=len;i++)
                     printf("%c ",Out[i]);
                 printf("\n");
                 printf("\n");
                 printf("加密结果用二进制形式表示为:\n");
                 for(i=0;i!=len>>2;i++)
                 {
                     Bytes_to_Bits(tmp,Out+(i<<2),32);
                     for(j=0;j!=32;j++)
                     {            
                         printf("%d ",tmp[j]);
                     }
                     printf("\n");
                 }
                 for(i=(len>>3)<<3;i!=len;i++)
                 {
                     Bytes_to_Bits(tmp,Out+i,8);
                     for(j=0;j!=8;j++)
                     {            
                         printf("%d ",tmp[j]);
                     }
                 }
                 printf("\n");
                 printf("\n");
                 printf("加密结果用十六进制形式表示为:\n");
                 for(i=0;i!=(len>>3);i++)
                 {
                     for(j=0;j!=8;j++)
                     printf("%2x ",Out[(i<<3)+j]);
                     printf("\n");
                 }
                 for(i=(len>>3)<<3;i!=len;i++)
                     printf("%2x ",Out[i]);
                 printf("\n\n");
                 printf("解密后结果为:\n");
                 for(i=0;i!=j+1;i++)
                 {
                     Des_D(Out+(i*8),D_Out+(i*8));
                 }
                 for(i=0;i!=len;i++)
                     printf("%c ",D_Out[i]);
                 printf("\n\n\n");
                
                 return 0;}


            IP属地:浙江6楼2010-10-28 22:34
            回复