首页 > 代码库 > DES加密解密的C++源程序

DES加密解密的C++源程序

                                                                 DES加密解密的C++源程序

                                             --测试版本,希望大家多多交流

#include<iostream.h>

#include"stdio.h"

#include"math.h"

#include "string.h"

 

static char key[16][48];

static char Hex[16][4];

 

////IP置换。

int 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\

};

//IP-1置换。可根据IP表生成

int IP_1[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 \

};

//E扩展

int E[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

};

//PC-1置换。

int 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

};

//PC-2置换。

int 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

};

//P置换

int P[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 S[8][4][16] =

//S盒1。   S盒都可以自己设置

{

                   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,

//S盒2

                   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,

//S盒3

                   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,

//S盒4

                   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,

//S盒5

                   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,

//S盒6

                   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,

//S盒7

                   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,

//S盒8

                   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

};

void Init_Hex()

{

}

void LS(char src[28],char dist[28],int n)

//将28比特的字符串循环左移n位

{

         for(inti=0;i<28;i++)

                   dist[i]= src[(28-n+i)%28];

}

void Decompose_56(char src[56],chardist1[28],char dist2[28])

//将56比特的字符串分解为2个28比特的字符串

{

 

}

void Decompose_64(char src[64],chardist1[32],char dist2[32])

//将一个64比特的字符串分解为两个32位的字符串

{}

void Combine_56(char src1[28],charsrc2[28],char dist[56])

//将两个28比特的字符串合并成一个56比特的字符串

{}

void Combine_64(char src1[32],charsrc2[32],char dist[64])

//将两个32比特的字符串合并成一个64比特的字符串

{

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

                   dist[i]= src1[i];

         for(intj=32;j<64;j++)

                   dist[j]= src2[j-32];

}

void PC_1_Permutation(char src[64],chardist[56])

//PC-1置换

{

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

                   dist[i]= src[PC_1[i]-1];

}

void PC_2_Permutation(char src[56],chardist[48])

//PC-2置换

{

         for(inti=0;i<64;i++)

                   dist[i]= src[PC_2[i]-1];

}

void IP_Permutation(char src[64],chardist[64])

//IP置换

{

         for(inti=0;i<64;i++)

                   dist[i]= src[IP[i]-1];

}

void IP_1_Permutation(char src[64],chardist[64])

//IP的逆置换

{

         for(inti =0;i<64;i++)

                   dist[i]=src[IP_1[i]-1];

}

void E_Permutation(char src[32],chardist[48])

//E置换

{

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

                   dist[i]= src[E[i]-1];

}

void P_Permutation(char src[32],chardist[32])

//P置换

{

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

                   dist[i]= src[P[i]-1];

}

void StrCpy(char src[],char dist[],int n)

//字符串的复制

{

         for(inti=0;i<n;i++)

                   dist[i]= src[i];

}

void S_Permutation(char src[6],chardist[4],int n)

//第n个S盒的置换

{

         Init_Hex();

         inti,j,k,m[4];

         i=n;

         if((src[0]==‘0‘)&&(src[5]==‘0‘))

                   j= 0;

         elseif((src[0]==‘0‘)&&(src[5]==‘1‘))

                   j= 1;

         elseif((src[0]==‘1‘)&&(src[5]==‘0‘))

                   j= 2;

         else

                   j= 3;

         for(inttemp_i=1;temp_i<5;temp_i++)

         {

                   if(src[temp_i]==‘1‘)

                            m[temp_i-1]= 1;

                   else

                            m[temp_i-1]= 0;

         }

         k= m[3]+2*m[2]+4*m[1]+8*m[3];

         StrCpy(Hex[(S[i][j][k])],dist,4);

}

 

void Make_Key(char k[64])

//产生密钥

{

         charTemp_Key[56];

         PC_1_Permutation(k,Temp_Key);

         charTemp_C[28],Temp_D[28],Temp_C0[28],Temp_D0[28];

         Decompose_56(Temp_Key,Temp_C0,Temp_D0);

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

         {

                   if((i==0)||(i==1)||(i==8)||(i==15))

                   {

                   LS(Temp_C0,Temp_C,1);

                   LS(Temp_D0,Temp_D,1);

                   }

                   else

                   {

                            LS(Temp_C0,Temp_C,2);

                            LS(Temp_D0,Temp_D,2);

                   }

                   Combine_56(Temp_C,Temp_D,key[i]);

                   StrCpy(Temp_C0,Temp_C,28);

                   StrCpy(Temp_D0,Temp_D,28);

         }

}

void XOR(char src[48],char dist[48])

//将两个48比特的字符串进行异或

{

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

         {

                   if(src[i]== dist[i])

                            dist[i]= ‘0‘;

                   else

                            dist[i]= ‘1‘;

         }

}

void F_Function(char R[32],chardist[32],int n)

//第n次轮函数

{

         chartemp[48],A[8][6],C[8][4],temp_dist[32];

         E_Permutation(R,temp);

         XOR(key[n],temp);

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

         {

                   for(intj=0;j<6;j++)

                   {

                            A[i][j]= temp[8*i+j];

                   }

         }

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

         {

                   S_Permutation(A[i],C[i],i);

         }

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

         {

                   temp_dist[i]= C[0][i];

         }

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

         {

                   temp_dist[i]= C[1][i+4];

         }

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

         {

                   temp_dist[i]= C[2][i+8];

         }

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

         {

                   temp_dist[i]= C[3][i+12];

         }

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

         {

                   temp_dist[i]= C[4][i+16];

         }

         for(i=20;i<24;i++)

         {

                   temp_dist[i]= C[5][i+20];

         }

         for(i=24;i<28;i++)

         {

                   temp_dist[i]= C[6][i+24];

         }

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

         {

                   temp_dist[i]= C[7][i+28];

         }

         P_Permutation(temp_dist,dist);

}       

void Char2bitchar(char src[8],chardist[64])

//将一个任意的8字符串转换为比特串

{

         inttemp;

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

         {

                   temp= (int)src[i];

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

                   {

                            if((temp%2)== 1)

                                     dist[8*(i+1)-(j+1)]= ‘1‘;

                            else

                                     dist[8*(i+1)-(j+1)]= ‘0‘;

                            temp= int(temp/2);

                   }

         }

}

void Bitchar2char(char src[64],chardist[8])

//将一个8字符串转换为一个64比特字符串

{

         inttemp =0;

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

         {

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

                   {

                            if(src[8*i+j]== ‘1‘)

                                     temp+= int(pow(2,7-j));

                   }

                   dist[i]= char(temp);

                   temp= 0;

         }

}

void Encryption(char temp_src[8],chartemp_dist[8],char temp_key[8])

//DES加密过程

{

         charsrc[64],dist[64],Key[64];

         Char2bitchar(temp_src,src);

         Char2bitchar(temp_key,Key);

         Make_Key(Key);

         chartemp[64],temp_L[32],temp_R[32],L[32],R[32];

         IP_Permutation(src,temp);    

         /*for(intj=0;j<64;j++)

                   cout<<temp[j];

         cout<<endl;*/

         Decompose_64(temp,temp_L,temp_R);

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

         {

                   StrCpy(temp_R,L,32);

                   F_Function(temp_R,R,i);

                   XOR(temp_L,R);

                   StrCpy(R,temp_R,64);

                   StrCpy(L,temp_L,64);

         }

         Combine_64(temp_R,temp_L,temp);

         IP_1_Permutation(temp,dist);

         Bitchar2char(dist,temp_dist);

}

void DeMake_Key(char k[64])

//产生密钥

{

         chartemp = ‘0‘;

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

         {

                   for(intj=0;j<48;j++)

                   {

                            temp= key[i][j];

                            key[i][j]= key[15-i][j];

                            key[15-i][j]= temp;

                   }

         }

}

void Decryption(char temp_src[8],chartemp_dist[8],char temp_key[8])

//DES解密过程

{

         charsrc[64],dist[64],Key[64];

         Char2bitchar(temp_src,src);

         Char2bitchar(temp_key,Key);

         DeMake_Key(Key);

         chartemp[64],temp_L[32],temp_R[32],L[32],R[32];

         IP_Permutation(src,temp);    

         /*for(intj=0;j<64;j++)

                   cout<<temp[j];

         cout<<endl;*/

         Decompose_64(temp,temp_L,temp_R);

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

         {

                   StrCpy(temp_R,L,32);

                   F_Function(temp_R,R,i);

                   XOR(temp_L,R);

                   StrCpy(R,temp_R,64);

                   StrCpy(L,temp_L,64);

         }

         Combine_64(temp_R,temp_L,temp);

         IP_1_Permutation(temp,dist);

         Bitchar2char(dist,temp_dist);