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

📄 des.h

📁 DES 加密解密代码实例
💻 H
📖 第 1 页 / 共 2 页
字号:
void turntoB(int B[],char word[],int length)			//将字符转换位64比特二进制数	OK
{
	int g,h,t;
	for(g=0;g<length*8;g++)
	{
		B[g]=0;
	}
	for(g=0;g<length;g++)
	{
		t=int(word[g]);
		if(t==0);
		else
		{
			for(h=7;t!=1;h--)
			{
				B[g*8+h]=t%2;
				t=(t-B[g*8+h])/2;
			}
			B[g*8+h]=1;
		}
	}
}

void turntoCH(char word[],int B[],int length)				//将二进制数转换成字符形式	OK
{
	for(int f=0;f<length;f++)
		word[f]=char(B[f*8]*128+B[f*8+1]*64+B[f*8+2]*32+B[f*8+3]*16+B[f*8+4]*8+B[f*8+5]*4+B[f*8+6]*2+B[f*8+7]);
	word[f]='\0';
}

void selectC(int c[],int b[])				//得到C		OK
{
	for(int i=27,j=0;i>=0;i--,j++)			
		c[i]=b[(35+j*8)%65];
}

void selectD(int d[],int b[])				//得到D		OK
{
	d[27]=b[3];						
	d[26]=b[11];
	d[25]=b[19];
	d[24]=b[27];
	for(int i=23,j=0;i>=0;i--,j++)
		d[i]=b[(4+j*8)%63];
}

void shift_left(int a[],int length)			//循环左移1位	OK
{
	int temp=a[0];
	for(int i=0;i<length-1;i++)
		a[i]=a[i+1];
	a[length-1]=temp;
}

void EtoK(int e[],int k[])				//由E生成Ki		OK
{
	k[0]=e[13];
	k[1]=e[16];
	k[2]=e[10];
	k[3]=e[23];
	k[4]=e[0];
	k[5]=e[4];
	k[6]=e[2];
	k[7]=e[27];
	k[8]=e[14];
	k[9]=e[5];
	k[10]=e[20];
	k[11]=e[9];
	k[12]=e[22];
	k[13]=e[18];
	k[14]=e[11];
	k[15]=e[3];
	k[16]=e[25];
	k[17]=e[7];
	k[18]=e[15];
	k[19]=e[6];
	k[20]=e[26];
	k[21]=e[19];
	k[22]=e[12];
	k[23]=e[1];
	k[24]=e[40];
	k[25]=e[51];
	k[26]=e[30];
	k[27]=e[36];
	k[28]=e[46];
	k[29]=e[54];
	k[30]=e[29];
	k[31]=e[39];
	k[32]=e[50];
	k[33]=e[44];
	k[34]=e[32];
	k[35]=e[47];
	k[36]=e[43];
	k[37]=e[48];
	k[38]=e[38];
	k[39]=e[55];
	k[40]=e[33];
	k[41]=e[52];
	k[42]=e[45];
	k[43]=e[41];
	k[44]=e[49];
	k[45]=e[35];
	k[46]=e[28];
	k[47]=e[31];
}

void exchange_start(int A[],int B[])		//初始换位函数	OK
{
	int m,n;
	for(m=0,n=0;m<8;m++,n++)
	{
		A[m]=B[57-n*8];
		A[m+8]=B[59-n*8];
		A[m+16]=B[61-n*8];
		A[m+24]=B[63-n*8];
		A[m+32]=B[56-n*8];
		A[m+40]=B[58-n*8];
		A[m+48]=B[60-n*8];
		A[m+56]=B[62-n*8];
	}
}

void exchange_end(int b[],int a[])			//逆初始换位函数	OK
{
	for(int m=0;m<8;m++)
	{
		b[m*8]=a[39-m];
		b[m*8+1]=a[7-m];
		b[m*8+2]=a[47-m];
		b[m*8+3]=a[15-m];
		b[m*8+4]=a[55-m];
		b[m*8+5]=a[23-m];
		b[m*8+6]=a[63-m];
		b[m*8+7]=a[31-m];
	}
}

void expansion(int p[],int r[])			//扩充函数		OK
{
	p[0]=r[31];
	p[1]=r[0];
	p[2]=r[1];
	p[3]=r[2];
	p[4]=r[3];
	p[5]=r[4];
	p[6]=r[3];
	p[7]=r[4];
	p[8]=r[5];
	p[9]=r[6];
	p[10]=r[7];
	p[11]=r[8];
	p[12]=r[7];
	p[13]=r[8];
	p[14]=r[9];
	p[15]=r[10];
	p[16]=r[11];
	p[17]=r[12];
	p[18]=r[11];
	p[19]=r[12];
	p[20]=r[13];
	p[21]=r[14];
	p[22]=r[15];
	p[23]=r[16];
	p[24]=r[15];
	p[25]=r[16];
	p[26]=r[17];
	p[27]=r[18];
	p[28]=r[19];
	p[29]=r[20];
	p[30]=r[19];
	p[31]=r[20];
	p[32]=r[21];
	p[33]=r[22];
	p[34]=r[23];
	p[35]=r[24];
	p[36]=r[23];
	p[37]=r[24];
	p[38]=r[25];
	p[39]=r[26];
	p[40]=r[27];
	p[41]=r[28];
	p[42]=r[27];
	p[43]=r[28];
	p[44]=r[29];
	p[45]=r[30];
	p[46]=r[31];
	p[47]=r[0];
}

void xor(int m[],int n[],int length)		//数组异或		OK	
{
	for(int f=0;f<length;f++)
	{
		if(m[f]==n[f])
			m[f]=0;
		else
			m[f]=1;
	}
}

void table(int x[],int p[])				//查表替代函数		OK
{
	int m,n,q;
	int s[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},
	{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,15,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,10,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}}};
	for(int i=0;i<32;i++)
	{
		x[i]=0;
	}
	for(int w=0;w<8;w++)
	{
		m=p[w*6]*2+p[w*6+5];
		n=p[w*6+1]*8+p[w*6+2]*4+p[w*6+3]*2+p[w*6+4];
		q=s[w][m][n];
		if(q==0);
		else
		{
			for(i=3;q!=1;i--)
			{
				x[w*4+i]=q%2;
				q=(q-x[w*4+i])/2;
			}
			x[w*4+i]=1;
		}
	}
}

void P(int x[])					//换位函数P OK
{
	int v[32];
	for(int i=0;i<32;i++)
		v[i]=x[i];
	x[0]=v[15];
	x[1]=v[6];
	x[2]=v[19];
	x[3]=v[20];
	x[4]=v[28];
	x[5]=v[11];
	x[6]=v[27];
	x[7]=v[16];
	x[8]=v[0];
	x[9]=v[14];
	x[10]=v[22];
	x[11]=v[25];
	x[12]=v[4];
	x[13]=v[17];
	x[14]=v[30];
	x[15]=v[9];
	x[16]=v[1];
	x[17]=v[7];
	x[18]=v[23];
	x[19]=v[13];
	x[20]=v[31];
	x[21]=v[26];
	x[22]=v[2];
	x[23]=v[8];
	x[24]=v[18];
	x[25]=v[12];
	x[26]=v[29];
	x[27]=v[5];
	x[28]=v[21];
	x[29]=v[10];
	x[30]=v[3];
	x[31]=v[24];
}


void DES_encryption(char m[],int miwen[],char key[],int length)
{
	int i,index;
	int a[64],b[64],c[28],d[28],l[32],r[32],store[32],p[48],x[32],e[56],k1[48],k2[48],k3[48],k4[48],k5[48],k6[48],k7[48],k8[48],k9[48],k10[48],k11[48],k12[48],k13[48],k14[48],k15[48],k16[48];
	char temp[9];
	turntoB(b,key,8);			//得到初始64比特密钥
	selectC(c,b);
	selectD(d,b);
	/////////////////////////////////////取得K1
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k1);
//	for(i=0;i<48;i++)
//		cout<<k1[i];
//	cout<<endl;
	/////////////////////////////////////取得K2
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k2);
	/////////////////////////////////////取得K3
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k3);
	/////////////////////////////////////取得K4
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k4);
	/////////////////////////////////////取得K5
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k5);
	/////////////////////////////////////取得K6
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k6);
	/////////////////////////////////////取得K7
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k7);
	/////////////////////////////////////取得K8
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k8);
	/////////////////////////////////////取得K9
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k9);
	/////////////////////////////////////取得K10
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k10);
	/////////////////////////////////////取得K11
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k11);
	/////////////////////////////////////取得K12
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k12);
	/////////////////////////////////////取得K13
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k13);
	/////////////////////////////////////取得K14
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k14);
	/////////////////////////////////////取得K15
	shift_left(c,28);
	shift_left(d,28);
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k15);
	/////////////////////////////////////取得K16
	shift_left(c,28);
	shift_left(d,28);
	for(i=0;i<28;i++)
		e[i]=c[i];
	for(i=0;i<28;i++)
		e[28+i]=d[i];
	EtoK(e,k16);
	/////////////////////密钥处理完毕

	if (length!=64)			//补位使明文字符数为8的倍数
	{
		for(i=0;i<64-length;i++)
		{
			m[length+i]=char(65+i);
		}
		m[64]='\0';
	}


	///////////////////////明文处理阶段

	for(index=0;index<64;index+=8)	//将明文分块
	{
		for(i=0;i<8;i++)
			temp[i]=m[index+i];
		turntoB(b,temp,8);
		exchange_start(a,b);		//初始换位
		for(i=0;i<32;i++)			//得到L和R
		{	
			l[i]=a[i];
			r[i]=a[32+i];
		}
		/////////////////第1次运算
		for(i=0;i<32;i++)
			store[i]=r[i];
		expansion(p,r);
		xor(p,k1,48);
		table(x,p);
		P(x);
		xor(x,l,32);
		for(i=0;i<32;i++)
			r[i]=x[i];
		for(i=0;i<32;i++)
			l[i]=store[i];
		/////////////////第2次运算
		for(i=0;i<32;i++)
			store[i]=r[i];
		expansion(p,r);
		xor(p,k2,48);
		table(x,p);
		P(x);
		xor(x,l,32);
		for(i=0;i<32;i++)
			r[i]=x[i];
		for(i=0;i<32;i++)
			l[i]=store[i];
		/////////////////第3次运算
		for(i=0;i<32;i++)
			store[i]=r[i];
		expansion(p,r);
		xor(p,k3,48);
		table(x,p);
		P(x);
		xor(x,l,32);
		for(i=0;i<32;i++)
			r[i]=x[i];
		for(i=0;i<32;i++)
			l[i]=store[i];
		/////////////////第4次运算
		for(i=0;i<32;i++)
			store[i]=r[i];
		expansion(p,r);
		xor(p,k4,48);
		table(x,p);
		P(x);
		xor(x,l,32);
		for(i=0;i<32;i++)
			r[i]=x[i];
		for(i=0;i<32;i++)
			l[i]=store[i];
		/////////////////第5次运算
		for(i=0;i<32;i++)

⌨️ 快捷键说明

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