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

📄 des.c

📁 gcc编译的des
💻 C
字号:
#include "des.h"



static const unsigned char pc_1_c[28]={
	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
	};
	
static const unsigned char pc_1_d[28]={
	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
	};
static const unsigned char 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
	};

static const unsigned char ls_count[16]={
	1,1,2,2,2,2,2,2,
	1,2,2,2,2,2,2,1
	};

static const unsigned char ip_tab[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
	};
	
static const unsigned char _ip_tab[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
	};

static const unsigned char e_r[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
	};

static const unsigned char 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
	};
static const unsigned char SSS[8][4][16]={
	{
	  {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},//* err on
	  { 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}
	}, // err on

	{
	  { 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}, //* err on
	  { 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}
	}
	};


/**************************************************************************
*		                 Tools
**************************************************************************/
//extern unsigned char C[17][28],D[17][28],K[17][48];
static unsigned char C[17][28],D[17][28],K[17][48];

static void s_box(char *aa,char *bb)
{
	unsigned char i,j,k,m;
	unsigned char y,z;
	char ss[8];
	m=0;
	for (i=0;i<8;i++)
	{
		j=6*i;
		y=aa[j]*2+aa[j+5];
		z=aa[j+1]*8+aa[j+2]*4+aa[j+3]*2+aa[j+4];
		ss[i]=SSS[i][y][z];
		y=0x08;
		for (k=0;k<4;k++)
		{
			bb[m++]=(ss[i]/y)&1;
			y/=2;
		}

	}
}


static void LS(unsigned char *bits,unsigned char *buffer,unsigned char count)
{
	unsigned char i;
	for (i=0;i<28;i++)
	{
		buffer[i]=bits[(i+count)%28];
	}
}

static void F(unsigned char n,char *ll,char *rr,char *LL,char *RR)
{
	unsigned char i;
	char buffer[64],tmp[64];
	for (i=0;i<48;i++)
		buffer[i]=rr[e_r[i]-1];
	for (i=0;i<48;i++)
		buffer[i]=(buffer[i]+K[n][i])&1;

	s_box(buffer,tmp);

	for (i=0;i<32;i++)
		buffer[i]=tmp[P[i]-1];

	for (i=0;i<32;i++)
		RR[i]=(buffer[i]+ll[i])&1;

	for (i=0;i<32;i++)
		LL[i]=rr[i];


}

static void ip_1(LPBYTE text,char *ll,char *rr)
{
	unsigned char i;
	char tmp[64];
	for (i=0;i<32;i++)
		tmp[i]=ll[i];
	for (i=32;i<64;i++)
		tmp[i]=rr[i-32];
	for (i=0;i<64;i++)
		text[i]=tmp[_ip_tab[i]-1];
}


static void expand0(LPBYTE in,char *out)
{
	unsigned char divide;
	unsigned char i,j;

	for (i=0;i<8;i++)
	{
		divide=0x80;
		for (j=0;j<8;j++)
		{
			*out++=(in[i]/divide)&1;
			divide/=2;
		}
    }
}

static void son(unsigned char *cc,unsigned char *dd,unsigned char *kk)
{
	unsigned char i;
	char buffer[56];
	for (i=0;i<28;i++)
		buffer[i]=*cc++;

	for (i=28;i<56;i++)
		buffer[i]=*dd++;

	for (i=0;i<48;i++)
		*kk++=buffer[pc_2[i]-1];
}


static void compress0(char *out,LPBYTE in)
{
	unsigned char times;
	unsigned char i,j;

	for (i=0;i<8;i++)
	{
		times=0x80;
		in[i]=0;
		for (j=0;j<8;j++)
		{
			in[i]+=(*out++)*times;
			times/=2;
		}
	}
}
/*static void compress016(char *out,LPBYTE in)
{
	unsigned char times;
	unsigned char i,j;

	for (i=0;i<16;i++)
	{
		times=0x8;
		in[i]='0';
		for (j=0;j<4;j++)
		{
			in[i]+=(*out++)*times;
			times/=2;
		}
	}
}
  */

static void setkeystar(unsigned char bits[64])
{
	unsigned char i,j;

	for (i=0;i<28;i++)
		C[0][i]=bits[pc_1_c[i]-1];
	for (i=0;i<28;i++)
		D[0][i]=bits[pc_1_d[i]-1];
	for (j=0;j<16;j++)
	{
		LS(C[j],C[j+1],ls_count[j]);
		LS(D[j],D[j+1],ls_count[j]);
		son(C[j+1],D[j+1],K[j+1]);
	}
}


/*
print(buffer,n)
char *buffer;
unsigned char n;
{
unsigned char i;
	for (i=0;i<n;i++)
	printf("%c",(*buffer++)+'0');
	printf("\n");
}
*/

static void ip(LPBYTE text,char *ll,char *rr)
{
	unsigned char i;
	char buffer[64];
	//char tmp[64];
	expand0(text,buffer);

	for (i=0;i<32;i++)
		ll[i]=buffer[ip_tab[i]-1];

	for (i=0;i<32;i++)
		rr[i]=buffer[ip_tab[i+32]-1];
}



static void encrypt0(LPBYTE text,LPBYTE mtext)
{
	char ll[64],rr[64],LL[64],RR[64];
	char tmp[64];
	unsigned char i,j;
	ip(text,ll,rr);

	for (i=1;i<17;i++)
	{
		F(i,ll,rr,LL,RR);
		for (j=0;j<32;j++)
		{
			ll[j]=LL[j];
			rr[j]=RR[j];
		}
	}

    ip_1((unsigned char*)tmp,rr,ll);

	compress0(tmp,mtext);
}



static void discrypt0(LPBYTE mtext,LPBYTE text)//2008-10-21,15:20,ǰ������������һ��λ��.author:zuoyijian
{
	char ll[64],rr[64],LL[64],RR[64];
	char tmp[64];
	unsigned char i,j;
	ip(mtext,ll,rr);

	for (i=16;i>0;i--)
	{
		F(i,ll,rr,LL,RR);
		for (j=0;j<32;j++)
		{
			ll[j]=LL[j];
			rr[j]=RR[j];
		}
	}

    ip_1((unsigned char*)tmp,rr,ll);

	compress0(tmp,text);
}



/*--------------------------------
*Single DES �����㷨
*void DES(uchar *key,uchar *text,uchar *mtext)
*	��Կ: uchar *key 	(8Bytes)
*	����: uchar *text	(8Bytes)
*	����: uchar *mtext	(8Bytes)
----------------------------------*/
void DES(uchar *key,uchar *text,uchar *mtext)
{
	char tmp[64];
	expand0(key,tmp);
	setkeystar((unsigned char*)tmp);
	encrypt0(text,mtext);
}
/*--------------------------------
*Single DES �����㷨
*void DES_1(uchar *key,uchar *text,uchar *mtext)
*	��Կ: uchar *key	(8Bytes)
*	����: uchar *text	(8Bytes)
*	����: uchar *mtext	(8Bytes)
----------------------------------*/
void DES_1(uchar *key,uchar *text,uchar *mtext)
{
	char tmp[64];
	expand0(key,tmp);
	setkeystar((unsigned char*)tmp);
	discrypt0(text,mtext);
}

//////////////////////
/*--------------------------------
*Triple DES �����㷨
*void TripleDES(uchar *key,uchar *text,uchar *mtext)
*	��Կ: uchar *key 	(16Bytes)
*	����: uchar *text	(8Bytes)
*	����: uchar *mtext	(8Bytes)
----------------------------------*/
void TripleDES(uchar *key16,uchar *text,uchar *mtext)
{
		uchar i;
		uchar keyL[8];
		uchar keyR[8];
		uchar dump1[8];
		uchar dump2[8];
		for (i=0;i<8;i++)
		{			
			dump1[i]=0x00;
			dump2[i]=0x00;
		}
		for (i=0;i<8;i++)
		{
			keyL[i]=key16[i];
			keyR[i]=key16[i+8];
		}
		DES(keyL,text,dump1);
		DES_1(keyR,dump1,dump2);
		DES(keyL,dump2,mtext);
}
/*--------------------------------
*Triple DES �����㷨
*void TripleDES_1(uchar *key,uchar *text,uchar *mtext)
*	��Կ: uchar *key	(16Bytes)
*	����: uchar *text	(8Bytes)
*	����: uchar *mtext	(8Bytes)
----------------------------------*/
void TripleDES_1(uchar *key16,uchar *text,uchar *mtext)
{	
	uchar i;
	uchar keyL[8];
	uchar keyR[8];
	uchar dump1[8];
	uchar dump2[8];
	for (i=0;i<8;i++)
	{			
		dump1[i]=0x00;
		dump2[i]=0x00;
	}
	for (i=0;i<8;i++)
	{
		keyL[i]=key16[i];
		keyR[i]=key16[i+8];
	}
	DES_1(keyL,text,dump1);
	DES(keyR,dump1,dump2);
	DES_1(keyL,dump2,mtext);	
}

⌨️ 快捷键说明

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