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

📄 desidea.c

📁 一个可以加密解密的算法
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		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;

}

/*******以下为IDEA函数**********/
//产生加密子密钥Z
//生成加密子密钥函数
void WINAPI key(void)
{
	unsigned short int S[54];  //保存总共所需的52个子密钥
	int i,j,r;

	for(j=0,i=0;i<4;i++)			//得到前8个子密钥
	{
		uskey[j++]=HIWORD(IDEAKey[i]);
		uskey[j++]=LOWORD(IDEAKey[i]);
	}
	
	//子密钥长16位,前8个子密钥是128位密钥的顺序8组即数组每一项为一组
	for (i=0;i<8;i++)   
		S[i]=uskey[i];
	
	//旋转128位密钥生成其余的54-8个子密钥(每轮旋转25Bit),其中只使用52个
	for(i=8;i<54;i++)
	{
		if ((i+2)%8==0)  //对于S[14],S[22],...进行计算
			//此子密钥由旋转前第八组的7位和第一组的9位组成
			S[i]=((S[i-7]<<9)^(S[i-6-8]>>7)) & one; 
		else
			//此子密钥由旋转前相邻两组的各7位和9位组成
			S[i]=((S[i-7]<<9)^(S[i-6]>>7)) & one;
	}

	//取得子密钥(加密过程有round轮迭代,每轮需6个子密钥,最后变换需4个子密钥)
	//Z是6*9的矩阵,每列为一轮的加密子密钥,最后一列中有4个子密钥在最后变换时使用
	for (r=1;r<=round+1;r++)
		for (j=1;j<7;j++)
			Z[j][r]=S[6*(r-1)+j-1];
}
//加密子密钥存放在全局变量数组Z[7][10]中
/*void WINAPI key(void)
{
	int i,j,k;
	DWORD temp[4];
	WORD S[56];
	
	for(j=0,k=0;k<4;k++)			//得到前8个子密钥
	{
		S[j++]=HIWORD(IDEAKey[k]);
		S[j++]=LOWORD(IDEAKey[k]);
	}
	
	for(i=0;i<6;i++)				//得到后44个子密钥			
	{
		for(k=0;k<4;k++)
			temp[k]=((IDEAKey[k]&0xffffff80)>>7);		
		IDEAKey[0]=((IDEAKey[0]<<25)|temp[1]);
		IDEAKey[1]=((IDEAKey[1]<<25)|temp[2]);
		IDEAKey[2]=((IDEAKey[2]<<25)|temp[3]);
		IDEAKey[3]=((IDEAKey[3]<<25)|temp[0]);
		for(k=0;k<4;k++)
		{
			S[j++]=HIWORD(IDEAKey[k]);
			S[j++]=LOWORD(IDEAKey[k]);
		}		
	}
	
	for(k=0,j=1;j<=9;j++)
		for(i=1;i<=6;i++)
			Z[i][j]=S[k++];

}*/

//计算解密子密钥DK
//解密子密钥存放在全局变量数组DK[7][10]中
void WINAPI dekey(void)
{
	int j;	

	for(j=1;j<=9;j++)
	{
		DK[1][10-j]=inv(Z[1][j]);
		DK[4][10-j]=inv(Z[4][j]);
		if(j==1||j==9)
		{
			DK[2][10-j]=(fuyi-Z[2][j])&one;
			DK[3][10-j]=(fuyi-Z[3][j])&one;
		}
		else
		{
			DK[2][10-j]=(fuyi-Z[3][j])&one;
			DK[3][10-j]=(fuyi-Z[2][j])&one;
		}
	}
	for(j=1;j<9;j++)
	{
		DK[5][9-j]=Z[5][j];
		DK[6][9-j]=Z[6][j];
	}	
}

//乘法mod(65537)运算
WORD WINAPI mul(WORD x,WORD y)
{
	WORD p;

	if(x==0)
		p=maxim-y;
	else if(y==0)
		p=maxim-x;
	else
		p=(x*y)%maxim;
	return p;
}
	
//计算xin的乘法运算逆
WORD WINAPI inv(WORD xin)
{
	WORD t0,t1,q,y;
	
	if (xin<=1)
		return xin;		//0和1的逆是本身
	t1=maxim/xin;
	y=maxim%xin;
	if (y==1)
		return ((maxim-t1)&one);
	t0=1;
	do {
		q=xin/y;
		xin=xin%y;
		t0+=q*t1;
		if ((xin==1) | (xin==0))
			return t0;
		q=y/xin;
		y=y%xin;
		t1+=q*t0;
	}
	while (y!=1);
	return ((maxim-t1)&one);
}

//IDEA加密
void WINAPI enIDEA(void)
{
	int r;
	WORD x1,x2,x3,x4,kk,t1,t2,a,OUT1[4];

	key();
	dekey();
	x1=HIWORD(Msgh);
	x2=LOWORD(Msgh);
	x3=HIWORD(Msgl);
	x4=LOWORD(Msgl);
	for(r=1;r<=8;r++)
	{
		x1=mul(x1,Z[1][r]);
		x4=mul(x4,Z[4][r]);
		x2=(x2+Z[2][r])&one;
		x3=(x3+Z[3][r])&one;
		kk=mul(Z[5][r],(x1^x3));
		t1=mul(Z[6][r],(kk+(x2^x4))&one);
		t2=(kk+t1)&one;
		x1=x1^t1;
		x4=x4^t2;
		a=x2^t2;
		x2=x3^t1;
		x3=a;
	}

	OUT1[0]=mul(x1,Z[1][9]);
	OUT1[3]=mul(x4,Z[4][9]);
	OUT1[1]=(x3+Z[2][9])&one;
	OUT1[2]=(x2+Z[3][9])&one;
	Cryh=(OUT1[0]<<16)+OUT1[1];
	Cryl=(OUT1[2]<<16)+OUT1[3];

/*	Cryh=mul(x1,Z[1][9]);
	Cryh<<=16;
	Cryh+=(x3+Z[2][9])&one;
	Cryl=(x2+Z[3][9])&one;
	Cryl<<=16;
	Cryl+=mul(x4,Z[4][9]);*/

	getfile();
}

//IDEA解密
void WINAPI deIDEA(void)
{
	int r;
	WORD x1,x2,x3,x4,kk,t1,t2,a;

	key();
	dekey();
	x1=HIWORD(Cryh);
	x2=LOWORD(Cryh);
	x3=HIWORD(Cryl);
	x4=LOWORD(Cryl);
	for(r=1;r<=8;r++)
	{
		x1=mul(x1,DK[1][r]);
		x4=mul(x4,DK[4][r]);
		x2=(WORD)(x2+DK[2][r]);
		x3=(WORD)(x3+DK[3][r]);
		kk=mul(DK[5][r],(WORD)(x1^x3));
		t1=mul(DK[6][r],(WORD)(kk+(x2^x4)));
		t2=kk+t1;
		x1^=t1;
		x4^=t2;
		a=x2^t2;
		x2=x3^t1;
		x3=a;
	}
	
	Msgh=mul(x1,DK[1][9]);
	Msgh<<=16;
	Msgh+=(WORD)(x3+DK[2][9]);
	Msgl=(WORD)(x2+DK[3][9]);
	Msgl<<=16;
	Msgl+=mul(x4,DK[4][9]);
}

void WINAPI getfile(void)
{
	int i,j,k;	
	FILE *fp;
	WORD xh,mask=0xf000;
	char ch;
	
	if((fp=fopen("xxx.txt","wb"))==NULL)
		MessageBox(hwnd,"文件失败","报警",MB_OK);

	for(j=1;j<=9;j++)
	{
		for(i=1;i<=6;i++)
		{
			xh=Z[i][j];
			for(k=0;k<4;k++)
			{
				ch=(char)((xh&mask)>>12);
				if(ch>9)
					ch+=0x37;
				else
					ch+=0x30;
				fprintf(fp,"%c",ch);
				xh<<=4;
			}
			fprintf(fp," ");
		}
		fprintf(fp,"\r\n");
	}
	
	fprintf(fp,"\r\n");

	for(j=1;j<=9;j++)
	{
		for(i=1;i<=6;i++)
		{
			xh=DK[i][j];
			for(k=0;k<4;k++)
			{
				ch=(char)((xh&mask)>>12);
				if(ch>9)
					ch+=0x37;
				else
					ch+=0x30;
				fprintf(fp,"%c",ch);
				xh<<=4;
			}
			fprintf(fp," ");
		}
		fprintf(fp,"\r\n");
	}
	
	fclose(fp);
}

⌨️ 快捷键说明

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