对称密码之DES密码

 #include <stdio.h>
#include <stdlib.h>
#include<string.h>  
 
int IP_Table[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 };
int E_Table[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};
int P_Table[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 IPR_Table[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 };
int PC1_Table[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 };
int PC2_Table[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 };
int S_Box[8][4][16] = {                                    
    // S1   
	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,
	// S2   
	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,
	// S3   
	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,
	// S4   
	 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,
	// S5   
	 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,
	// S6   
	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,
	// S7   
	 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,
	// S8   
	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 Xor(int *INA, int *INB, int len)                                    
{
	int i;
	for (i = 0; i<len; i++)
	{
		*(INA + i) = *(INA + i) ^ *(INB + i);
	}
};

void IP(const int input[64], int output[64], int table[64])            
{
	int i=0 ;
	for (i = 0; i<64; i++)
	{
		output[i] = input[table[i] - 1];
	}
};

 void E(const int input[32], int output[48], int table[48])                
{
	int i;
	for (i = 0; i<48; i++)
	{
		output[i] = input[table[i] - 1];
	}
};

 void P(const int input[32], int output[32], int table[32])               
	{
	int i;
	for (i = 0; i<32; i++)
	{
		output[i] = input[table[i] - 1];
	}
};

 void IPR(const int input[64], int output[64], int table[64])              
{
	int i;
	for (i = 0; i<64; i++)
	{
		output[i] = input[table[i] - 1];
	}
};

 void PC_1(const int input[64], int output[56], int table[56])            
{
	int i;
	for (i = 0; i<56; i++)
	{
		output[i] = input[table[i] - 1];
	}
};

void PC_2(const int input[56], int output[48], int table[48])             
{
	int i;
	for (i = 0; i<48; i++)
	{
		output[i] = input[table[i] - 1];
		printf("%d",output[i]);
	}
	printf("\n");
};


static  void S(const int input[48], int output[32], int table[8][4][16])         
{
	int i,j = 0;
	int x,y = 0;
	int num[8]={0};
	int number[8][4]={0};
	for (i = 0; i<48; i = i + 6)
	{
			x=input[i]*2+input[i+5]*1;
			y=input[i+1]*8+input[i+2]*4+input[i+3]*2+input[i+4]*1;
			num[j]=table[j][x][y];
			j=j+1; 
	}
	
	for (j = 0; j<8; j++)
	{
		for (i = 0; i<4; i++)
		{
			number[j][i]=num[j]%2;
			num[j]=num[j]/2;
			if(num[j]==0)
			{
				 break;
			} 
			
		}
	}
	
	for (j = 0; j<8; j++)
	{
		for (i = 0; i<4; i++)
		{
			output[j*4+i]=number[j][3-i];	
		}
	}
	
};

 void F_func(int input[32], int output[32], int subkey[48])               
{
	int len = 48;
	int temp[48] = { 0 };
	int temp_1[32] = { 0 };
	E(input, temp, E_Table);
	Xor(temp, subkey, len);
	S(temp, temp_1, S_Box);
	P(temp_1, output, P_Table);
};

 void SHL(const int input[28], int output[28], int leftCount)             
{
	int i;
	int len = 28;
	for (i = 0; i<len; i++)
	{
		output[i] = input[(i + leftCount) % len];
	}
};

 void  subKey_fun(const int input[64], int Subkey[16][48])                
{
	int loop = 1, loop_2 = 2;
	int i, j;
	int c[28], d[28];
	int pc_1[56] = {0};
	int pc_2[16][56] = {0};
	int shl_c[16][28] = {0};
	int shl_d[16][28] = {0};
	PC_1(input, pc_1, PC1_Table); 
	for (i = 0; i<28; i++) 
	{
		c[i] = pc_1[i]; 
		d[i] = pc_1[i + 28]; 
	}
	int leftCount = 0;
	for (i = 1; i<17; i++)
	{
		if (i == 1 || i == 2 || i == 9 || i == 16)
		{
			leftCount += loop;
			SHL(c, shl_c[i - 1], leftCount);
			SHL(d, shl_d[i - 1], leftCount);
		}
		else
		{
			leftCount += loop_2;
			SHL(c, shl_c[i - 1], leftCount);
			SHL(d, shl_d[i - 1], leftCount);
		}
	}
	for (i = 0; i<16; i++)
	{
		for (j = 0; j<28; j++)
		{
			pc_2[i][j] = shl_c[i][j];
			pc_2[i][j + 28] = shl_d[i][j];
		}
	}
	for (i = 0; i<16; i++)
	{
		PC_2(pc_2[i], Subkey[i], PC2_Table);
	}
};

  void  DES_Efun(int input[64], int key_64[64], int output[64])
{
	int i=0,j=0,k=0;
	int ip[64] = {0};   
	int output_1[64] = {0}; 
	int subkeys[16][48];  
	int l[16][32], r[16][32]; 
	subKey_fun(key_64, subkeys);  
	
	IP(input, ip, IP_Table);  
	for (i = 0; i<32; i++)   
	{
		l[0][i] = ip[i];  
		r[0][i] = ip[32 + i];  
	}
	
	for (j = 1; j<=16; j++) 
	{
		for (k = 0; k<32; k++) 
		{
			l[j][k] = r[j - 1][k];  
		}
		F_func(r[j - 1], r[j], subkeys[j - 1]);  
		Xor(r[j], l[j - 1], 32);
	}
	
	for (i = 0; i<32; i++)
	{
		output_1[i] = l[16][i];
		output_1[32 + i] = r[16][i]; 
	}
	
	IPR(output_1, output, IPR_Table); 
};

  void  DES_Dfun(int input[64], int key_64[64], int output[64])
{
	int i=0,j=0,k=0;
	int ip[64] = {0};  
	int output_1[64] = {0};  
	int subkeys[16][48];  
	int l[16][32], r[16][32]; 
	subKey_fun(key_64, subkeys);  
	
	IP(input, ip, IP_Table);  
	for (i = 0; i<32; i++)   
	{
		l[0][i] = ip[i];  
		r[0][i] = ip[32 + i];  
	}
	
	for (j = 1; j<=16; j++) 
	{
		for (k = 0; k<32; k++) 
		{
			l[j][k] = r[j - 1][k]; 
		}
		F_func(r[j - 1], r[j], subkeys[15-j]); 
		Xor(r[j], l[j - 1], 32);
	}
	
	for (i = 0; i<32; i++)
	{
		output_1[i] = l[16][i];
		output_1[32 + i] = r[16][i]; 
	}
	
	IPR(output_1, output, IPR_Table); 
};

void encrypt() 
{
	int i=0;
	int exit[64] = {0};
	int enter[64] = {0};
	int key_64[64] = {0};
	
	printf("请输入明文(64bit)\n");
	for (i = 0; i<64; i++)
	{
		scanf("%c",&enter[i]);
		 
	}
	while(getchar()!='\n'); 
	printf("请输入秘钥(64bit)\n");
	for (i = 0; i<64; i++)
	{
		scanf("%c",&key_64[i]);
	 
	}
	printf("\n");
	
	DES_Efun(enter,key_64,exit);
	
	printf("生成的密文:\n");
	for (i = 0; i<64; i++)
	{
		printf("%d", exit[i]);
	}
} 

void decrypt() 
{
	int i=0;
	int exit[64] = {0};
	int enter[64] = {0};
	int key_64[64] = {0};
	
	printf("请输入密文(64bit)\n");
	for (i = 0; i<64; i++)
	{
		scanf("%c",&enter[i]);
		enter[i]=enter[i]-48; 
	}
	while(getchar()!='\n'); 
	printf("请输入秘钥(64bit)\n");
	for (i = 0; i<64; i++)
	{
		scanf("%c",&key_64[i]);
		key_64[i]=key_64[i]-48; 
	}
	printf("\n");
	
	DES_Dfun(enter,key_64,exit);
	
	printf("还原的明文:\n");
	for (i = 0; i<64; i++)
	{
		printf("%d", exit[i]);
	}
} 


int main(int argc, char *argv[])
{   
   while(1)
   { 
	int n=0;
	printf("**************************************\n");
	printf("****      按1进入DES密码加密      ****\n");
	printf("****      按2进入DES密码解密      ****\n");
		printf("****      按3结束菜单      ****\n");
	printf("**************************************\n");
	
	printf("请先输入1或2:");
	scanf("%d",&n);
	while(getchar()!='\n'); 
	
	if(n==1)
		encrypt(); 
	else if(n==2)
	    decrypt(); 
	else if(n==3) 
	break; 
	else
	{
	printf("the wrong number!!!\n");
   }
}
fflush stdin;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值