茅房总监吧 关注:1贴子:41
  • 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-29 01:45回复
         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,
          4,   2,   1, 11, 10, 13,   7,   8, 15,   9, 12,   5,   6,   3,   0, 14,
    


    IP属地:浙江2楼2010-10-29 01:45
    回复
      2025-08-18 09:45:27
      广告
      不感兴趣
      开通SVIP免广告
           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,
           5,   18, 31, 10,
           2,   8, 24, 14,
           32, 27, 3,   9,
           19, 13, 30, 6,
           22, 11, 4,   25
      


      IP属地:浙江3楼2010-10-29 01:45
      回复
        };
        /*逆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
             {
                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++)
        


        IP属地:浙江4楼2010-10-29 01:45
        回复
               {
                  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;
               static int flag = 0;
               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);
                   if(flag==0)
                   {    printf("第一把子钥匙为:");
                       for(int j=0;j<48;j++)
                           printf("%d ",SubKey[i][j]);
                       printf("\n明文加密一轮后的L1为:");
                       for(int j=0;j!=32;j++)
                           printf("%d ",L[j]);
                       printf("\n");
                       printf("明文加密一轮后的R1为:");
                       for(int j=0;j!=32;j++)
                           printf("%d ",R[j]);
                       printf("\n");
          


          IP属地:浙江5楼2010-10-29 01:45
          回复
                         flag = 1;
                     }
                 }
                 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);
                 }
                 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-29 01:45
            回复