des C语言源代码,更换数据类型

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
/********DES Encript by namgking*******"FileName:des_encode.h"*********/

/********compile on windows xp sp2,C-Free 3.5*******************************/

/********E-mail:  namg2000@163.com*****************************************/

/********Author:   namgking*****************************************************/

/********Note: if the code is of using,it's coded by namgking,*************/

/********or I don't know who did it!^_^****Modifyed date:2008-7-8*******/

void EncodeMain();                                                  //EncodeMain function

void DecodeMain();                                                 //Sorry ,it has not used

void Decode(unsigned char *str,unsigned char *keychar);                            //decode :input 8 chars,8 keychars

void Encode(unsigned char *str,unsigned char *keychar);                            //encode: input 8 chars,8 keychars

void keyBuild(unsigned char *keychar);                                     //create key array

void StrtoBin(unsigned char *midkey,unsigned char *keychar);                   //change into binary

void keyCreate(unsigned char *midkey2,int movebit,int i);         //call by keyBuild

void EncodeData(unsigned char *lData,unsigned char *rData,unsigned char *srt);        //encodedata function

void F(unsigned char *rData,unsigned char *key);                                       //F function

void Expand(unsigned char *rData,unsigned char *rDataP);                        //Expand function

void ExchangeS(unsigned char *rDataP,unsigned char *rData);                   //S-diagram change

void ExchangeP(unsigned char *rData);                                    //P change

void FillBin(unsigned char *rData,int n,int s);                             // data to binary;call by S-Diagram change function

void DecodeData(unsigned char *str,unsigned char *lData,unsigned char *rData);        //DecodeData from binary

unsigned char IP1[]={58, 50, 42, 34, 26, 18, 10, 2,  60, 52, 44, 36, 28, 20, 12, 4,    //initial change

           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,

 };

unsigned char IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,    //opp initial change

           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

 };

/*

unsigned char IP3[]= {40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,    //opp initial change

           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

 };*/

unsigned char s[][4][16]={{                                             //S-diagram array

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

                 },

                {

                 {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},

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

                }

};

unsigned char Ex[48]={  32,1,2,3,4,5,                                                               //Expand array

              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

 };

unsigned char P[32]={16,7,20,21,                                                                //P-change

           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

 };

unsigned char PC1[56]={57,49,41,33,25,17,9,                                                //PC-1 in keyBuild

             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,33,15,

             7,62,54,46,38,30,22,

             14,6,61,53,45,37,29,

             21,13,5,28,20,12,4

 };

unsigned char PC2[48]={14,17,11,24,1,5,                                                     //PC-2 in keyBuild

             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

 };
/********DES Encript by namgking*******"FileName:des_encode.cpp"************/

/********compile on windows xp sp2,C-Free 3.5*******************************/

/********E-mail:  namg2000@163.com******************************************/

/********Author:   namgking************************************************/

/********Note: if the code is of using,it's coded by namgking,*************/

/********or I don't know who did it!^_^****Modifyed date:2008-7-8**********/

#include<stdio.h>

#include<string.h>

#include"des_encode.h"

unsigned char key[16][48];

char str[8];

void main()                 //main function

{

    EncodeMain();

}





void EncodeMain()           //EncodeMain function

{

  int i;



  char keychar[8];



  unsigned char key2[8];

  unsigned char strkey[8];





  printf("请输入8个要加密的字符:/n");

  for(i=0;i<8;i++)

     scanf("%c",&str[i]);

  getchar();

  for(i=0;i<8;i++)

    strkey[i]=str[i];

  printf("/n输入明文的十六进制为:/n");

  for(i=0;i<8;i++)

    printf("%10x",strkey[i]);

  printf("/n请输入密钥(8个字符):/n");

  for(i=0;i<8;i++)

     scanf("%c",&keychar[i]);

  for(i=0;i<8;i++)

     key2[i]=keychar[i];

  getchar();

   // printf("%c",keychar[i]);

  Encode(strkey,key2);

  printf("/n加密后十六进制密文是:/n");

  for(i=0;i<8;i++)

     printf("%10x",strkey[i]);

  printf("/n/n清输入解密密码/n");

  for(i=0;i<8;i++)

    scanf("%c",&keychar[i]);

  for(i=0;i<8;i++)

     key2[i]=keychar[i];

  Decode(strkey,key2);

  for(i=0;i<8;i++)

    printf("%10x",strkey[i]);

  for(i=0;i<8;i++)

    str[i]=strkey[i];

  printf("/n明文为:/t");

  for(i=0;i<8;i++)

    printf("%c",str[i]);

  printf("/n/n");



}





void keyBuild(unsigned char *keychar){            //create key array

    int i,j;

    int movebit[]={1,1,2,2,2,2,2,2,

                   1,2,2,2,2,2,2,1};

    unsigned char midkey2[56];

    unsigned char midkey[64];

    StrtoBin(midkey,keychar);

    for(i=0;i<56;i++)

      midkey2[i]=midkey[PC1[i]-1];

    for(i=0;i<16;i++)

      keyCreate(midkey2,movebit[i],i);

   }

void StrtoBin(unsigned char *midkey,unsigned char *keychar){     //change into binary

    int trans[8],i,j,k,n;

    n=0;

    for(i=0;i<8;i++){

        j=0;

        while(keychar[i]!=0){

            trans[j]=keychar[i]%2;

            keychar[i]=keychar[i]/2;

            j++;

        }

        for(k=j;k<8;k++)trans[k]=0;

        for(k=0;k<8;k++)

           midkey[n++]=trans[7-k];

    }

   }

void keyCreate(unsigned char *midkey2,int movebit,int n){

    int i,temp[4];

    temp[0]=midkey2[0];

    temp[1]=midkey2[1];

    temp[2]=midkey2[28];

    temp[3]=midkey2[29];

   if(movebit==2){

       for(i=0;i<26;i++){

         midkey2[i]=midkey2[i+2];

         midkey2[i+28]=midkey2[i+30];

       }

       midkey2[26]=temp[0];midkey2[27]=temp[1];

       midkey2[54]=temp[2];midkey2[55]=temp[3];  }

     else

     { for(i=0;i<27;i++){

        midkey2[i]=midkey2[i+1];

        midkey2[i+28]=midkey2[i+29];

       }

       midkey2[27]=temp[0];midkey2[55]=temp[2];

     }

    for(i=0;i<48;i++)

      key[n][i]=midkey2[PC2[i]-1];

}

void EncodeData(unsigned char *lData,unsigned char *rData,unsigned char *str){   //encodedata function

    int i,j,temp[8],lint,rint;//int h;

    int data[64];

    lint=0,rint=0;

    for(i=0;i<4;i++){

       j=0;

       while(str[i]!=0){

         temp[j]=str[i]%2;

         str[i]=str[i]/2;

         j++;

       }

       while(j<8)temp[j++]=0;

       for(j=0;j<8;j++)

        lData[lint++]=temp[7-j];

       j=0;

       while(str[i+4]!=0){

        temp[j]=str[i+4]%2;

        str[i+4]=str[i+4]/2;

        j++;

       }

       while(j<8)temp[j++]=0;

       for(j=0;j<8;j++)rData[rint++]=temp[7-j];

    }

    for(i=0;i<32;i++){

       data[i]=lData[i];

       data[i+32]=rData[i];

    }



    for(i=0;i<32;i++){

       lData[i]=data[IP1[i]-1];//printf("P1:%5d:%5d,%5d/n",IP1[i],lData[i],data[IP1[i]-1]);

       rData[i]=data[IP1[i+32]-1];

    }

    }

void F(unsigned char *rData,unsigned char *key){                   //F function

    int i;

    unsigned char rDataP[48];

    Expand(rData,rDataP);





    for(i=0;i<48;i++){

      rDataP[i]=rDataP[i]^key[i];// printf("%10d",rDataP[i]);if((i+1)%6==0)printf("/n");

      }



    ExchangeS(rDataP,rData);



    ExchangeP(rData);





   }

void Expand(unsigned char *rData,unsigned char *rDataP){          //Expand function

    int i;

    for(i=0;i<48;i++)

      rDataP[i]=rData[Ex[i]-1];

   }

void ExchangeS(unsigned char *rDataP,unsigned char *rData){          //S-diagram change

    int i,n,linex,liney;

    linex=liney=0;

    for(i=0;i<48;i+=6){

        n=i/6; //printf("%10d/n",(rDataP[i]<<1));

        linex=(rDataP[i]<<1)+rDataP[i+5];

        liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4];



        FillBin(rData,n,s[n][linex][liney]);

    }

   }

void ExchangeP(unsigned char *rData){                     //P change

    int i,temp[32];

    for(i=0;i<32;i++)

      temp[i]=rData[i];



    for(i=0;i<32;i++)

      rData[i]=temp[P[i]-1];

  }

void FillBin(unsigned char *rData,int n,int s){         // data to binary;call by S-Diagram change function

    int temp[4],i;

    for(i=0;i<4;i++){

        temp[i]=s%2;

        s=s/2;

        }

    for(i=0;i<4;i++)

        rData[n*4+i]=temp[3-i];

    }

void DecodeData(unsigned char *str,unsigned char *lData,unsigned char *rData){    //DecodeData from binary

    int i;int a,b;int data[64];

    a=0,b=0;

    for(i=0;i<32;i++){

        data[i]=lData[i];

        data[i+32]=rData[i];

    }

    for(i=0;i<32;i++){

        lData[i]=data[IP2[i]-1];

        rData[i]=data[IP2[i+32]-1];

    }

    for(i=0;i<32;i++){

        a=(lData[i]&0x1)+(a<<1);

        b=(rData[i]&0x1)+(b<<1);

        if((i+1)%8==0){

            str[i/8]=a;a=0;//printf("%d",i/8);

            str[i/8+4]=b;b=0;//printf("%d",i/8+4);

        }

    }



    }

   

void Encode(unsigned char *str,unsigned char *keychar){           //encode: input 8 chars,8 keychars

   unsigned char lData[32],rData[32],temp[32],rDataP[48];

   int i,j;

   keyBuild(keychar);



   EncodeData(lData,rData,str);

   for(i=0;i<16;i++){

     for(j=0;j<32;j++)

        temp[j]=rData[j];

     F(rData,key[i]);

     for(j=0;j<32;j++){

        rData[j]=rData[j]^lData[j];

     }



     for(j=0;j<32;j++)

        lData[j]=temp[j];

   }



   DecodeData(str,rData,lData);



}

void Decode(unsigned char *str,unsigned char *keychar){           //decode :input 8 chars,8 keychars

   unsigned char lData[32],rData[32],temp[32],rDataP[48];

   int i,j;

   keyBuild(keychar);

   EncodeData(lData,rData,str); //这个位置

   for(i=0;i<16;i++){

     for(j=0;j<32;j++)

        temp[j]=rData[j];

     F(rData,key[15-i]);

     for(j=0;j<32;j++){

        rData[j]=rData[j]^lData[j];

     }



     for(j=0;j<32;j++){

        lData[j]=temp[j];

        }

   }

   DecodeData(str,rData,lData);

}
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
DES算法的C语言代码及实现 首先新建头文件des_encode.H 内容如下: void EncodeMain(); //EncodeMain function void DecodeMain(); //Sorry ,it has not used void Decode(int *str,int *keychar); //decode :input 8 chars,8 keychars void Encode(int *str,int *keychar); //encode: input 8 chars,8 keychars void keyBuild(int *keychar); //create key array void StrtoBin(int *midkey,int *keychar); //change into binary void keyCreate(int *midkey2,int movebit,int i); //call by keyBuild void EncodeData(int *lData,int *rData,int *srt); //encodedata function void F(int *rData,int *key); //F function void Expand(int *rData,int *rDataP); //Expand function void ExchangeS(int *rDataP,int *rData); //S-diagram change void ExchangeP(int *rData); //P change void FillBin(int *rData,int n,int s); // data to binary;call by S-Diagram change function void DecodeData(int *str,int *lData,int *rData); //DecodeData from binary int IP1[]={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, //initial change 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, }; int IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, //opp initial change 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 }; int s[][4][16]={{ //S-diagram array {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} }, { {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}, {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} } }; int Ex[48]={ 32,1,2,3,4,5, //Expand array 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 }; int P[32]={16,7,20,21, //P-change 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 PC1[56]={57,49,41,33,25,17,9, //PC-1 in keyBuild 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,33,15, 7,62,54,46,38,30,22, 14,6,61,53,45,37,29, 21,13,5,28,20,12,4 }; int PC2[48]={14,17,11,24,1,5, //PC-2 in keyBuild 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 }; 再创建des.cpp 内容如下: #include<stdio.h> #include<string.h> #include"des_encode.h" int key[16][48]; char str[8]; void main() //main function { EncodeMain(); } void EncodeMain() //EncodeMain function { int i; char keychar[8]; int key2[8]; int strkey[8]; printf("请输入8个要加密的字符:\n"); for(i=0;i<8;i++) scanf("%c",&str[i]); getchar(); for(i=0;i<8;i++) strkey[i]=str[i]; printf("\n输入明文的十六进制为:\n"); for(i=0;i<8;i++) printf("%10x",strkey[i]); printf("\n请输入密钥(8个字符):\n"); for(i=0;i<8;i++) scanf("%c",&keychar[i]); for(i=0;i<8;i++) key2[i]=keychar[i]; getchar(); // printf("%c",keychar[i]); Encode(strkey,key2); printf("\n加密后十六进制密文是:\n"); for(i=0;i<8;i++) printf("%10x",strkey[i]); printf("\n\n清输入解密密码\n"); for(i=0;i<8;i++) scanf("%c",&keychar[i]); for(i=0;i<8;i++) key2[i]=keychar[i]; Decode(strkey,key2); for(i=0;i<8;i++) printf("%10x",strkey[i]); for(i=0;i<8;i++) str[i]=strkey[i]; printf("\n明文为:\t"); for(i=0;i<8;i++) printf("%c",str[i]); printf("\n\n"); } void keyBuild(int *keychar){ //create key array int i,j; int movebit[]={1,1,2,2,2,2,2,2, 1,2,2,2,2,2,2,1}; int midkey2[56]; int midkey[64]; StrtoBin(midkey,keychar); for(i=0;i<56;i++) midkey2[i]=midkey[PC1[i]-1]; for(i=0;i<16;i++) keyCreate(midkey2,movebit[i],i); } void StrtoBin(int *midkey,int *keychar){ //change into binary int trans[8],i,j,k,n; n=0; for(i=0;i<8;i++){ j=0; while(keychar[i]!=0){ trans[j]=keychar[i]%2; keychar[i]=keychar[i]/2; j++; } for(k=j;k<8;k++)trans[k]=0; for(k=0;k<8;k++) midkey[n++]=trans[7-k]; } } void keyCreate(int *midkey2,int movebit,int n){ int i,temp[4]; temp[0]=midkey2[0]; temp[1]=midkey2[1]; temp[2]=midkey2[28]; temp[3]=midkey2[29]; if(movebit==2){ for(i=0;i<26;i++){ midkey2[i]=midkey2[i+2]; midkey2[i+28]=midkey2[i+30]; } midkey2[26]=temp[0];midkey2[27]=temp[1]; midkey2[54]=temp[2];midkey2[55]=temp[3]; } else { for(i=0;i<27;i++){ midkey2[i]=midkey2[i+1]; midkey2[i+28]=midkey2[i+29]; } midkey2[27]=temp[0];midkey2[55]=temp[2]; } for(i=0;i<48;i++) key[n][i]=midkey2[PC2[i]-1]; } void EncodeData(int *lData,int *rData,int *str){ //encodedata function int i,j,temp[8],lint,rint;//int h; int data[64]; lint=0,rint=0; for(i=0;i<4;i++){ j=0; while(str[i]!=0){ temp[j]=str[i]%2; str[i]=str[i]/2; j++; } while(j<8)temp[j++]=0; for(j=0;j<8;j++) lData[lint++]=temp[7-j]; j=0; while(str[i+4]!=0){ temp[j]=str[i+4]%2; str[i+4]=str[i+4]/2; j++; } while(j<8)temp[j++]=0; for(j=0;j<8;j++)rData[rint++]=temp[7-j]; } for(i=0;i<32;i++){ data[i]=lData[i]; data[i+32]=rData[i]; } for(i=0;i<32;i++){ lData[i]=data[IP1[i]-1];//printf("P1:%5d:%5d,%5d\n",IP1[i],lData[i],data[IP1[i]-1]); rData[i]=data[IP1[i+32]-1]; } } void F(int *rData,int *key){ //F function int i,rDataP[48]; Expand(rData,rDataP); for(i=0;i<48;i++){ rDataP[i]=rDataP[i]^key[i];// printf("%10d",rDataP[i]);if((i+1)%6==0)printf("\n"); } ExchangeS(rDataP,rData); ExchangeP(rData); } void Expand(int *rData,int *rDataP){ //Expand function int i; for(i=0;i<48;i++) rDataP[i]=rData[Ex[i]-1]; } void ExchangeS(int *rDataP,int *rData){ //S-diagram change int i,n,linex,liney; linex=liney=0; for(i=0;i<48;i+=6){ n=i/6; //printf("%10d\n",(rDataP[i]<<1)); linex=(rDataP[i]<<1)+rDataP[i+5]; liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4]; FillBin(rData,n,s[n][linex][liney]); } } void ExchangeP(int *rData){ //P change int i,temp[32]; for(i=0;i<32;i++) temp[i]=rData[i]; for(i=0;i<32;i++) rData[i]=temp[P[i]-1]; } void FillBin(int *rData,int n,int s){ // data to binary;call by S-Diagram change function int temp[4],i; for(i=0;i<4;i++){ temp[i]=s%2; s=s/2; } for(i=0;i<4;i++) rData[n*4+i]=temp[3-i]; } void DecodeData(int *str,int *lData,int *rData){ //DecodeData from binary int i;int a,b;int data[64]; a=0,b=0; for(i=0;i<32;i++){ data[i]=lData[i]; data[i+32]=rData[i]; } for(i=0;i<32;i++){ lData[i]=data[IP2[i]-1]; rData[i]=data[IP2[i+32]-1]; } for(i=0;i<32;i++){ a=(lData[i]&0x1)+(a<<1); b=(rData[i]&0x1)+(b<<1); if((i+1)%8==0){ str[i/8]=a;a=0;//printf("%d",i/8); str[i/8+4]=b;b=0;//printf("%d",i/8+4); } } } void Encode(int *str,int *keychar){ //encode: input 8 chars,8 keychars int lData[32],rData[32],temp[32],rDataP[48]; int i,j; keyBuild(keychar); EncodeData(lData,rData,str); for(i=0;i<16;i++){ for(j=0;j<32;j++) temp[j]=rData[j]; F(rData,key[i]); for(j=0;j<32;j++){ rData[j]=rData[j]^lData[j]; } for(j=0;j<32;j++) lData[j]=temp[j]; } DecodeData(str,rData,lData); } void Decode(int *str,int *keychar){ //decode :input 8 chars,8 keychars int lData[32],rData[32],temp[32],rDataP[48]; int i,j; keyBuild(keychar); EncodeData(lData,rData,str); //这个位置 for(i=0;i<16;i++){ for(j=0;j<32;j++) temp[j]=rData[j]; F(rData,key[15-i]); for(j=0;j<32;j++){ rData[j]=rData[j]^lData[j]; } for(j=0;j<32;j++){ lData[j]=temp[j]; } } DecodeData(str,rData,lData); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值