📄 idea.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 + -