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