DES加密解密算法C语言代码实现

时间:2021-02-20 12:40:27

代码:

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*------------------------
定义枚举型全局变量
------------------------*/
typedef enum
{
false = ,
true =
} bool; // 十六*密钥
static bool SubKey[][]={}; /*---------------------*/
/*-------------------------------------------------------------
各种置换表
-------------------------------------------------------------*/
// IP置换表
const char IP_Table[]={
,,,,,,, ,,,,,,,, ,
,,,,,,, ,,,,,,,, ,
,,,,,, , ,,,,,,,, ,
,,,,,,, ,,,,,,,,
};
// IP-1置换表
const char IPR_Table[]={
, ,,,,,,,, ,,,,,,,
, ,,,,,,,, ,,,,,,,
, ,,,,,,,, ,,,,,,,
, ,,,,,,,, ,, ,,,,
}; // E扩展表
static char E_Table[]={
, , , , , , , , , , , ,
, ,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,
};
// PC1置换表
static char PC1_Table[]={
,,,,,, , ,,,,,,,
, ,,,,,,,, ,,,,,
,,,,,,, ,,,,,,,
, ,,,,,,,, ,,,,
}; // pc2表
static char PC2_Table[]={
,,,, , , ,,, ,,,
,,, ,, ,, ,,,, ,
,,,,,,,,,,,,
,,,,,,,,,,,
};
// 移位表
static char Move_Table[]={
, , , , , , , , , , , , , , ,
};
// S盒
static char S_Box[][][]={
//S1
, ,, , ,,, , ,, ,, , , , ,
,, , ,, ,, ,, ,,, , , , ,
, ,, ,, , ,,,, , , ,, , ,
,, , , , , , , ,, ,,, , ,,
//S2
, , ,, ,, , , , , ,,, , ,,
,, , ,, , ,,, , ,, , ,, ,
,, ,,, ,, , , ,, , , , ,,
, ,, , ,, , ,, , ,, , ,, ,
//S3
, , ,, , ,, , ,,, ,, , , ,
, , , , , , ,, , , ,,,,, ,
, , , , ,, , ,, , ,, ,,, ,
,,, , , , , , ,,, ,, , ,,
//S4
,,, , , , ,, , , , ,,, ,,
, ,, , ,, , , , , ,, ,,, ,
, , , ,,, ,,, , ,, , , , ,
,, , ,, ,, , , , ,,, , ,,
//S5
,, , , ,,, , , , ,,, ,, ,
,, ,, , ,, , , ,,, , , , ,
, , ,,,, , ,, ,, , , , ,,
, ,, , ,, ,, ,, , ,, , , ,
//S6
, ,,, , , , , ,, , ,, , ,,
,, , , ,, , , , ,,, ,, , ,
,,, , , ,, , , , ,, ,,, ,
, , ,, , ,,,,, , , , , ,,
//S7
,, ,,, , ,, ,, , , ,, , ,
, ,, , , , ,,, , ,, ,, , ,
, ,,,, , ,,,, , , , , , ,
,,, , , ,, , , , ,,, , ,,
//S8
, , , , ,,, ,, , ,, , ,, ,
,,, ,, , , ,, , ,, ,, , ,
,, , , ,,, , , ,,,, , , ,
, ,, , ,, ,,,, , , , , ,
};
//P置换表
static char P_Table[]={
, ,,,,,,, ,,,, ,,,,
, ,,,,, , ,,,, ,,, ,
};
/*-------------------------------------------------------------------*/ /*-----------------------------自定义函数-----------------------------*/
void SetKey(char My_key[]); //生成16轮的子密钥;
void ByteToBit(bool * Data_out,char * Data_in,int Num); //字节转换成位;
void Change_bit(bool * Data_out,int Num);//二进制的位置进行转换;
void BitToByte(char My_message[],bool * Message_in,int Num); //位转换成字节;
void TableReplace(bool *Data_out,bool *Data_in,const char *Table,int Num); //各种表的置换算法;
void Bitcopy(bool * Data_out,bool * Data_in,int Num); //二进制数组的拷贝
void Loop_bit(bool * Data_out,int movstep,int len); //左移位;
void Run_Des(char My_message[],char HexMssage[]);//des的轮加密算法
void Xor(bool * Message_out, bool * Message_in,int Num); //执行异或
void S_change(bool * Data_out, bool * Data_in); // S盒变换;
void HexToBit(bool * Data_out,char * Data_in,int Num); // 十六进制转二进制
void BitToHex(char * Data_out,bool * Data_in,int Num); //二进制转换成十六进制;
void Run_desDes(char My_message[],char HexMessage[]);// DES轮解密算法; /*--------------------------*/ /*--------------------------主函数----------------------------------*/
int main()
{
int i=,j;
char My_key[]={}; //记录加密密钥;
char You_key[]={}; //解密密钥
char My_message[]={}; //明文
char Message_hex[]={};//16进制的密文
printf("请输入你要加密的内容(8 Byte):\n");
gets(My_message);
printf("请输入你的加密密钥:\n");
gets(My_key);
i=strlen(My_key);
while(i!=)
{
printf("请输入加密密钥(8 Byte)\n");
gets(My_key);
i=;
i=strlen(My_key);
}
SetKey(My_key); //生成16轮的加密子密钥;
Run_Des(My_message,Message_hex); //des的轮加密过程
printf("经过加密的密文为:\n");
for(i=;i<;i++)
{
printf("%c ",Message_hex[i]);
}
printf("\n");
printf("请输入你的解密密钥(8 Byte):\n");
gets(You_key);
i=strlen(You_key);
while(i!=)
{
printf("请输入解密密钥(8 Byte)\n");
gets(You_key);
i=;
i=strlen(You_key);
}
SetKey(You_key); //生成16轮的解密子密钥;
Run_desDes(My_message,Message_hex);//解密;
printf("解密结果为:\n");
for(i=;i<;i++)
{
printf("%c ",My_message[i]);
}
printf("\n");
return ;
} /*--------------------具体函数定义----------------------*/
void Bitcopy(bool * Data_out, bool * Data_in,int Num) //二进制数组拷贝
{
int i=;
for(i=;i<Num;i++)
{
Data_out[i]=Data_in[i];
} }
void Change_bit(bool * Data_out,int Num) //二进制的位置进行转换;
{
int i,j;
static bool Temp[]={};
for(i=;i<Num/;i++)
{
Bitcopy(Temp,Data_out,Num/);
for(j=;j<Num/;j++)
{
Data_out[j]=Temp[Num/--j];
}
Data_out+=Num/;
}
}
void ByteToBit( bool * Data_out,char * Data_in,int Num) //字节转位
{
int i,j;
for(i=;i<Num;i++)
{
Data_out[i]=(Data_in[i/]>>(i%))&0x01;
}
//Change_bit(Data_out,Num);
}
void BitToHex(char * Data_out, bool * Data_in,int Num) //二进制转十六进制
{
int i;
for(i=;i<Num/;i++)
{
Data_out[i]=;
}
for(i=;i<Num/;i++)
{
Data_out[i]=Data_in[*i]+Data_in[*i+]*+Data_in[*i+]*+Data_in[*i+]*;
if(Data_out[i]%>)
{
Data_out[i]=Data_out[i]%+'';
}
else
Data_out[i]=Data_out[i]%+'';
}
}
void HexToBit(bool * Data_out,char * Data_in,int Num) //十六进制转二进制
{
int i;
for(i=;i<Num;i++)
{
if(Data_in[i/]<='')
{
Data_out[i]=((Data_in[i/]-'')>>(i%))&0x01;
}
else
{
Data_out[i]=((Data_in[i/]-'')>>(i%))&0x01;
}
}
}
void BitToByte(char My_message[],bool * Message_in,int Num) //位转换成字节
{
int i=;
for(i=;i<(Num/);i++)
{
My_message[i]=;
}
for(i=;i<Num;i++)
{
My_message[i/]|=Message_in[i]<<(i%);
}
}
void TableReplace( bool *Data_out, bool * Data_in,const char *Table ,int Num) // 置换算法
{
int i=;
static bool Temp[]={};
for(i=;i<Num;i++)
{
Temp[i]=Data_in[Table[i]-];
}
Bitcopy(Data_out,Temp,Num);
}
void Loop_bit(bool * Data_out,int movstep,int len)
{
static bool Temp[]={};
Bitcopy(Temp,Data_out,movstep);
Bitcopy(Data_out,Data_out+movstep,len-movstep);
Bitcopy(Data_out+len-movstep,Temp,movstep);
/*Temp=Data_out;
Temp[movstep]='\0';
Data_out=Data_out+movstep;
Data_out+(len-movstep)=Temp;*/
}
void Xor(bool * Message_out,bool * Message_in,int Num)//执行异或
{
int i;
for(i=;i<Num;i++)
{
Message_out[i]=Message_out[i]^Message_in[i];
}
}
void SetKey(char My_key[])
{
int i,j;
static bool Key_bit[]={}; //Key的二进制缓存;
static bool *Key_bit_L,*Key_bit_R;
Key_bit_L=&Key_bit[]; //key的左边28位;
Key_bit_R=&Key_bit[]; //key的右边28位;
ByteToBit(Key_bit,My_key,);
/* Change_bit(Key_bit,64) ;//二进制的位置进行转换;
for(i=0;i<64;i++)
{
printf("%d ",Key_bit[i]);
}
printf("\n");
printf("\n");*/
TableReplace(Key_bit,Key_bit,PC1_Table,);//pc-1 置换
for(i=;i<;i++)
{
Loop_bit(Key_bit_L,Move_Table[i],);
Loop_bit(Key_bit_R,Move_Table[i],);
TableReplace(SubKey[i],Key_bit,PC2_Table,);//pc-2置换
}
}
void S_change(bool * Data_out, bool * Data_in) //S盒变换
{
int i;
int r=,c=;//S盒的行和列;
for(i=;i<;i++,Data_in=Data_in+,Data_out=Data_out+)
{
r=Data_in[]*+Data_in[]*;
c=Data_in[]*+Data_in[]*+Data_in[]*+Data_in[]*;
ByteToBit(Data_out,&S_Box[i][r][c],);
}
}
void F_change(bool Data_out[],bool Data_in[]) // f函数;
{
int i;
static bool Message_E[]={}; //存放E置换的结果;
TableReplace(Message_E,Data_out,E_Table,);//E表置换
Xor(Message_E,Data_in,);
S_change(Data_out,Message_E); // S盒变换
TableReplace(Data_out,Data_out,P_Table,); //P置换
}
void Run_Des(char My_message[],char HexMssage[])//des轮加密算法;
{
int i;
static bool Message_bit[]={};
static bool *Message_bit_L=&Message_bit[],*Message_bit_R=&Message_bit[];
static bool Temp[]={};
ByteToBit(Message_bit,My_message,);
/*Change_bit(Message_bit,64) ;//二进制的位置进行转换;
for(i=0;i<64;i++)
{
printf("%d ",Message_bit[i]);
}
printf("\n");
printf("\n");*/
TableReplace(Message_bit,Message_bit,IP_Table,);
for(i=;i<;i++)
{
Bitcopy(Temp,Message_bit_R,);
F_change(Message_bit_R,SubKey[i]);
Xor(Message_bit_R,Message_bit_L,);
Bitcopy(Message_bit_L,Temp,);
}
TableReplace(Message_bit,Message_bit,IPR_Table,);
BitToHex(HexMssage,Message_bit,);//二进制转换成十六进制;
}
void Run_desDes(char My_message[],char HexMessage[])// DES轮解密算法;
{
int i=;
static bool Message_bit[]={};
static bool * Message_bit_L=&Message_bit[], * Message_bit_R=&Message_bit[];
static bool Temp[]={};
HexToBit(Message_bit,HexMessage,);
TableReplace(Message_bit,Message_bit,IP_Table,);
for(i=;i>=;i--)
{
Bitcopy(Temp,Message_bit_L,);
F_change(Message_bit_L,SubKey[i]);
Xor(Message_bit_L,Message_bit_R,);
Bitcopy(Message_bit_R,Temp,);
}
TableReplace(Message_bit,Message_bit,IPR_Table,);
BitToByte(My_message,Message_bit,);
}