📄 desidea.c
字号:
{
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 + -