⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.cpp

📁 des加密算法 des加密算法 des加密算法 解密
💻 CPP
字号:
#include<stdio.h> 
#include<string.h> 
void EncodeMain(); //EncodeMain function 
void DecodeMain(); //Sorry ,it has not used 
void Decode(int *str,int *keychar);  
void Encode(int *str,int *keychar); 
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 
}; 

int key[16][48]; 
char str[8]; 
void main() //main function 
{ 
	EncodeMain(); 
} 
void EncodeMain() //EncodeMain function 
{ 
	int i,j=0; 
	char keychar[16]; 
	int key2[16],key3[16],strkey3[16]; 
	int strkey[8]; 
	printf("Input Key:\n"); 
	for(i=0;i<16;i++) 
		scanf("%c",&keychar[i]); 
	for(i=0;i<16;i++) 
		key2[i]=keychar[i]; 
    for(i=0;i<16;i++) 
		key3[i]=keychar[i]; 
	getchar(); 
	printf("Input PlainText:\n"); 
	for(i=0;i<8;i++) 
		scanf("%c",&str[i]); 
	getchar(); 
	for(i=0;i<8;i++) 
		strkey[i]=str[i]; 
	Encode(strkey,key2); 
	printf("CipherText:\n"); 
	for(i=0;i<8;i++)
	{
        strkey3[j]=strkey[i]/16;
	    strkey3[j+1]=strkey[i]%16;
        j=j+2;
	}
	for(i=0;i<16;i++)
	{
		if(strkey3[i]>=10)
			strkey3[i]=strkey3[i]+55;
		else  strkey3[i]=strkey3[i]+48;
		printf("%c",strkey3[i]);
	}
    Decode(strkey,key3); 
	for(i=0;i<8;i++) 
		str[i]=strkey[i]; 
	printf("\nDecryption:\n"); 
	for(i=0;i<8;i++) 
		printf("%c",str[i]); 
	printf("\n"); 
} 
void keyBuild(int *keychar){ //create key array 
	int i; 
	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)
{    
	int i,j=0;//change into binary 
	for(i=0;i<16;i++)
	{
		if(keychar[i]<=57)
		{
			keychar[i]=keychar[i]-48;
            midkey[j]=keychar[i]/8;
			midkey[j+1]=(keychar[i]%8)/4;
            midkey[j+2]=(keychar[i]%4)/2;
            midkey[j+3]=keychar[i]%2;
		}
		else 
		{
            keychar[i]=keychar[i]-55;
            midkey[j]=keychar[i]/8;
			midkey[j+1]=(keychar[i]%8)/4;
            midkey[j+2]=(keychar[i]%4)/2;
            midkey[j+3]=keychar[i]%2;
		}
        j=j+4;
	}
	
}
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 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];
		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];
	} 
	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; 
		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){ 
	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; 
			str[i/8+4]=b;b=0;
		} 
	} 
} 
void Encode(int *str,int *keychar){ 
	int lData[32],rData[32],temp[32]; 
	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){ 
	int lData[32],rData[32],temp[32]; 
	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); 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -