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

📄 des.h

📁 一个可以加密解密的算法
💻 H
字号:

//取得置换表中位标的屏蔽位
void WINAPI GetZhMask(void)
{
	int i;
	DWORD mask=0x80000000;

	for(i=1;i<33;i++)
	{
		ZhMask[i]=mask;
		mask>>=1;	
	}
}

//DES中的IP置换(64bit->64bit)
void WINAPI ZHIP(DWORD *inputh,DWORD *inputl)
{
	int i,j;
	DWORD resulth=0,resultl=0,shift;
	DWORD IpShift[]={0x00000040,0x00000010,0x00000004,0x00000001,
					 0x00000080,0x00000020,0x00000008,0x00000002};
	DWORD mask=0x80000000;

	for(j=0;j<4;j++)			//转换前4行		
	{
		shift=IpShift[j];
		for(i=0;i<4;i++)		//置换表每行前4个
		{
			if((*inputl&shift)!=0)
				resulth|=mask;
			mask>>=1;
			shift<<=8;
		}
		
		shift=IpShift[j];
		for(i=0;i<4;i++)		//置换表每行后4个
		{
			if((*inputh&shift)!=0)
				resulth|=mask;
			mask>>=1;
			shift<<=8;
		}
	}
	
	mask=0x80000000;
	for(j=4;j<8;j++)			//转换后4行
	{
		shift=IpShift[j];
		for(i=0;i<4;i++)
		{
			if((*inputl&shift)!=0)
				resultl|=mask;
			mask>>=1;
			shift<<=8;
		}
		
		shift=IpShift[j];
		for(i=0;i<4;i++)
		{
			if((*inputh&shift)!=0)
				resultl|=mask;
			mask>>=1;
			shift<<=8;
		}
	}

	*inputh=resulth;
	*inputl=resultl;
}

//DES中的IP-1置换(64bit->64bit)
void WINAPI ZHIP1(DWORD *inputh,DWORD *inputl)
{
	int i,j;
	DWORD resulth=0,resultl=0,shift;
	DWORD Ip1Shift[]={0x01000000,0x02000000,0x04000000,0x08000000,
					  0x10000000,0x20000000,0x40000000,0x80000000};
	DWORD mask=0x80000000;

	for(j=0;j<4;j++)			//转换前4行
	{
		shift=Ip1Shift[j];
		for(i=0;i<4;i++)
		{
			if((*inputl&shift)!=0)
				resulth|=mask;
			mask>>=1;
			if((*inputh&shift)!=0)
				resulth|=mask;
			mask>>=1;
			shift>>=8;
		}
	}
	
	mask=0x80000000;
	for(j=4;j<8;j++)			//转换后4行
	{
		shift=Ip1Shift[j];
		for(i=0;i<4;i++)
		{
			if((*inputl&shift)!=0)
				resultl|=mask;
			mask>>=1;
			if((*inputh&shift)!=0)
				resultl|=mask;
			mask>>=1;
			shift>>=8;
		}
	}

	*inputh=resulth;
	*inputl=resultl;
}

//DES中的E置换(32bit->48bit)
void WINAPI ZHE(DWORD *input,DWORD *outputh,DWORD *outputl)
{
	int i;
	DWORD resulth=0,resultl=0;
	BYTE index;
	DWORD mask=0x80000000;
	
	for(i=0;i<24;i++)
	{
		index=etable[i];
		if((*input&ZhMask[index])!=0)
			resulth|=mask;
		mask>>=1;
	}
	
	mask=0x80000000;
	for(i=24;i<48;i++)
	{
		index=etable[i];
		if((*input&ZhMask[index])!=0)
			resultl|=mask;
		mask>>=1;
	}

	*outputh=resulth;
	*outputl=resultl;
}

//DES中的P置换(32bit->32bit)
void WINAPI ZHP(DWORD *input)
{
	int i;
	DWORD result=0;
	BYTE index;
	DWORD mask=0x80000000;

	for(i=0;i<32;i++)
	{
		index=ptable[i];
		if((*input&ZhMask[index])!=0)
			result|=mask;
		mask>>=1;
	}
	*input=result;
}

//DES中的PC-1置换(64bit->56bit)
void WINAPI ZHPC1(DWORD *inputh,DWORD *inputl)
{
	int i;
	DWORD resulth=0,resultl=0;
	BYTE index;
	DWORD mask=0x80000000;

	for(i=0;i<28;i++)
	{		
		index=pc1table[i];
		if(index<=32)
		{
			if((*inputh&ZhMask[index])!=0)			
				resulth|=mask;
		}
		else
		{
			index-=32;
			if((*inputl&ZhMask[index])!=0)			
				resulth|=mask;		
		}
		mask>>=1;
	}
	
	mask=0x80000000;
	for(i=28;i<56;i++)
	{		
		index=pc1table[i];
		if(index<=32)
		{
			if((*inputh&ZhMask[index])!=0)			
				resultl|=mask;
		}
		else
		{
			index-=32;
			if((*inputl&ZhMask[index])!=0)			
				resultl|=mask;		
		}
		mask>>=1;
	}
	*inputh=resulth;
	*inputl=resultl;
}

//DES中的PC-2置换(56bit->48bit)
void WINAPI ZHPC2(DWORD *inputh,DWORD *inputl,DWORD *outputh,DWORD *outputl)
{
	int i;
	DWORD resulth=0,resultl=0;
	BYTE index;
	DWORD mask=0x80000000;

	for(i=0;i<24;i++)
	{
		index=pc2table[i];
		if(index>28)
			index+=4;
		if(index<=32)
		{
			if((*inputh&ZhMask[index])!=0)			
				resulth|=mask;
		}
		else
		{
			index-=32;
			if((*inputl&ZhMask[index])!=0)			
				resulth|=mask;		
		}
		mask>>=1;
	}
			
	mask=0x80000000;
	for(i=24;i<48;i++)
	{
		index=pc2table[i];
		if(index>28)
			index+=4;
		if(index<=32)
		{
			if((*inputh&ZhMask[index])!=0)			
				resultl|=mask;
		}
		else
		{
			index-=32;
			if((*inputl&ZhMask[index])!=0)			
				resultl|=mask;		
		}
		mask>>=1;
	}

	*outputh=resulth;
	*outputl=resultl;
}

//子密钥生成中左移1位(input=28bit)
void WINAPI LeftShift1(DWORD *input)
{
	DWORD mask=0;
	
	if((*input&0x80000000)!=0)
		mask =0x00000010;
	*input<<=1;
	*input|=mask;	

}

//子密钥生成中左移2位(input=28bit)
void WINAPI LeftShift2(DWORD *input)
{
	DWORD mask=0;
	
	if((*input&0x80000000)!=0)
		mask =0x00000020;
	if((*input&0x40000000)!=0)
		mask|=0x00000010;
	*input<<=2;
	*input|=mask;	
}

//生成16个子密钥
void WINAPI GetSubKey(void)
{
	int i;
	DWORD LKey,RKey;	
	
	LKey=Keyh;
	RKey=Keyl;
	ZHPC1(&LKey,&RKey);
	for(i=0;i<16;i++)
	{
		if(lshift[i]==1)
		{
			LeftShift1(&LKey);
			LeftShift1(&RKey);
		}
		else
		{
			LeftShift2(&LKey);
			LeftShift2(&RKey);
		}
		ZHPC2(&LKey,&RKey,&SubKey[i][0],&SubKey[i][1]);
	}
}

//计算函数f
DWORD WINAPI GetFunc(DWORD Ri,int cnt)
{
	int i;
	BYTE mask,num[8];
	DWORD Exh,Exl;

	ZHE(&Ri,&Exh,&Exl);
	Exh^=SubKey[cnt][0];
	Exl^=SubKey[cnt][1];
	
	Exh>>=8;
	for(i=3;i>=0;i--)		//S1,S2,S3,S4盒
	{
		mask=0;
		if((Exh&0x00000020)!=0)
			mask+=2;
		if((Exh&0x00000001)!=0)
			mask++;
		mask<<=4;			//*16
		Exh>>=1;
		mask+=(BYTE)(Exh&0x0000000f);
		num[i]=SBOX[i][mask];
		Exh>>=5;
	}

	Exl>>=8;
	for(i=7;i>=4;i--)		//S5,S6,S7,S8盒
	{
		mask=0;
		if((Exl&0x00000020)!=0)
			mask+=2;
		if((Exl&0x00000001)!=0)
			mask++;
		mask<<=4;			//*16
		Exl>>=1;
		mask+=(BYTE)(Exl&0x0000000f);
		num[i]=SBOX[i][mask];
		Exl>>=5;
	}
	
	Exh=0;
	for(i=0;i<8;i++)
	{
		Exh<<=4;
		Exh|=num[i];
	}
	ZHP(&Exh);	
	return Exh;
}

//DES加密
void WINAPI endes(void)
{
	int i;
	DWORD Lmsg,Rmsg;
	DWORD temp;

	GetSubKey();
	Lmsg=Msgh;
	Rmsg=Msgl;
	ZHIP(&Lmsg,&Rmsg);
	for(i=0;i<15;i++)
	{
		temp=GetFunc(Rmsg,i);
		temp^=Lmsg;
		Lmsg=Rmsg;
		Rmsg=temp;	
	}

	temp=GetFunc(Rmsg,15);
	Lmsg^=temp;
	ZHIP1(&Lmsg,&Rmsg);	
	Cryh=Lmsg;
	Cryl=Rmsg;
}

//DES解密
void WINAPI dedes(void)
{
	int i;
	DWORD Lmsg,Rmsg;
	DWORD temp;

	GetSubKey();
	Lmsg=Cryh;
	Rmsg=Cryl;
	ZHIP(&Lmsg,&Rmsg);

	for(i=15;i>0;i--)
	{
		temp=GetFunc(Rmsg,i);
		temp^=Lmsg;
		Lmsg=Rmsg;
		Rmsg=temp;	
	}
	
	temp=GetFunc(Rmsg,0);
	Lmsg^=temp;
	ZHIP1(&Lmsg,&Rmsg);	
	Msgh=Lmsg;
	Msgl=Rmsg;

}

⌨️ 快捷键说明

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