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

📄 idea.h

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

//产生加密子密钥Z
//加密子密钥存放在全局变量数组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][j]=inv(Z[1][10-j]);
		DK[4][j]=inv(Z[4][10-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;

	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+=Z[2][r];
		x3+=Z[3][r];
		kk=mul(Z[5][r],(WORD)(x1^x3));
		t1=mul(Z[6][r],(WORD)(kk+(x2^x4)));
		t2=kk+t1;
		x1^=t1;
		x4^=t2;
		a=x2^t2;
		x2=x3^t1;
		x3=a;
	}
	
	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]);
}

//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+=DK[2][r];
		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|=(x3+DK[2][9])&one;
	Msgl=(x2+DK[3][9])&one;
	Msgl<<=16;
	Msgl|=mul(x4,DK[4][9]);
}

⌨️ 快捷键说明

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