📄 common.cpp
字号:
#include "stdafx.h"
#include "math.h"
#include "common.h"
#include "destool.h"
extern long WINAPI mw_DesEncrypt( unsigned char *Key,__int16 KeyLen,
unsigned char *Source, unsigned long SrcLen, unsigned char *result)
{
__int16 ip[]=
{
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9 ,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7
};
unsigned char fp[] =
{
40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41, 9,49,17,57,25
};
__int16 e[]=
{
32,1 ,2 ,3 ,4 ,5 ,
4 ,5 ,6 ,7 ,8 ,9 ,
8, 9 ,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1
};
__int16 p[]=
{
16,7 ,20,21,
29,12,28,17,
1 ,15,23,26,
5 ,18,31,10,
2 ,8 ,24,14,
32,27,3 ,9,
19,13,30,6,
22,11,4 ,25
};
unsigned char si[8][64] =
{
{14,4 ,13,1 ,2 ,15,11,8 ,3 ,10,6 ,12,5 ,9 ,0 ,7 ,
0 ,15,7 ,4 ,14,2 ,13,1 ,10,6 ,12,11,9 ,5 ,3 ,8 ,
4 ,1 ,14,8 ,13,6 ,2 ,11,15,12,9 ,7 ,3 ,10,5 ,0 ,
15,12,8 ,2 ,4 ,9 ,1 ,7 ,5 ,11,3 ,14,10,0 ,6 ,13},
{15,1 ,8 ,14,6 ,11,3 ,4 ,9 ,7 ,2 ,13,12,0 ,5 ,10,
3, 13,4 ,7 ,15,2 ,8 ,14,12,0 ,1 ,10,6 ,9 ,11,5 ,
0, 14,7 ,11,10,4 ,13,1 ,5 ,8 ,12,6 ,9 ,3 ,2 ,15,
13,8 ,10,1 ,3 ,15,4 ,2 ,11,6 ,7 ,12,0 ,5 ,14,9 },
{10,0 ,9 ,14,6 ,3 ,15,5 ,1 ,13,12,7 ,11,4 ,2 ,8 ,
13,7 ,0 ,9 ,3 ,4 ,6 ,10,2 ,8 ,5 ,14,12,11,15,1 ,
13,6 ,4 ,9 ,8 ,15,3 ,0 ,11,1 ,2 ,12,5 ,10,14,7 ,
1 ,10,13,0 ,6 ,9 ,8 ,7 ,4 ,15,14,3 ,11,5 ,2 ,12},
{7 ,13,14,3 ,0 ,6 ,9 ,10,1 ,2 ,8 ,5 ,11,12,4 ,15,
13,8 ,11,5 ,6 ,15,0 ,3 ,4 ,7 ,2 ,12,1 ,10,14,9 ,
10,6 ,9 ,0 ,12,11,7 ,13,15,1 ,3 ,14,5 ,2 ,8 ,4 ,
3 ,15,0 ,6 ,10,1 ,13,8 ,9 ,4 ,5 ,11,12,7 ,2 ,14},
{2 ,12,4 ,1 ,7 ,10,11,6 ,8 ,5 ,3 ,15,13,0 ,14,9 ,
14,11,2 ,12,4 ,7 ,13,1 ,5 ,0 ,15,10,3 ,9 ,8 ,6,
4 ,2 ,1 ,11,10,13,7 ,8 ,15,9 ,12,5 ,6 ,3 ,0 ,14,
11,8 ,12,7 ,1 ,14,2 ,13,6 ,15,0 ,9 ,10,4 ,5 ,3 },
{12,1 ,10,15,9 ,2 ,6 ,8 ,0 ,13,3 ,4 ,14,7 ,5 ,11,
10,15,4 ,2 ,7 ,12,9 ,5 ,6 ,1 ,13,14,0 ,11,3 ,8 ,
9 ,14,15,5 ,2 ,8 ,12,3 ,7 ,0 ,4 ,10,1 ,13,11,6 ,
4 ,3 ,2 ,12,9 ,5 ,15,10,11,14,1 ,7 ,6 ,0 ,8 ,13},
{4 ,11,2 ,14,15,0 ,8 ,13,3 ,12,9 ,7 ,5 ,10,6 ,1 ,
13,0 ,11,7 ,4 ,9 ,1 ,10,14,3 ,5 ,12,2 ,15,8 ,6 ,
1 ,4 ,11,13,12,3 ,7 ,14,10,15,6 ,8 ,0 ,5 ,9 ,2 ,
6 ,11,13,8 ,1 ,4 ,10,7 ,9 ,5 ,0 ,15,14,2 ,3 ,12},
{13,2 ,8 ,4 ,6 ,15,11,1 ,10,9 ,3 ,14,5 ,0 ,12,7 ,
1 ,15,13,8 ,10,3 ,7 ,4 ,12,5 ,6 ,11,0 ,14,9 ,2 ,
7 ,11,4 ,1 ,9 ,12,14,2 ,0 ,6 ,10,13,15,3 ,5 ,8 ,
2 ,1 ,14,7 ,4 ,10,8 ,13,15,12,9 ,0 ,3 ,5 ,6 ,11}
};
unsigned char src[1000][8],src_bit[64],ipt[64];
unsigned char et[48],pt1[32],pt2[32],r[32],l[32],*pt;
unsigned char Pkey[8],ChildKey[16][48];
//unsigned char temp[16][6];
unsigned char temp_a;
unsigned char *res;
unsigned long i,j,k,m,row,h,time,ReturnLen;
i=0;
if(SrcLen%8)
i=1;
i=SrcLen/8+i;
ReturnLen=i*8;
res=result;
for(i=0;i<8;i++) Pkey[i]=Key[i];
if(KeyLen<8)
for(i=0;(short)i<8-KeyLen;i++) Pkey[KeyLen+(short)i]=0x00;
Gen_Childkey1(Pkey,ChildKey);
//group
if((SrcLen%8)==0)
{
time=SrcLen/8;
for(i=0;i<time;i++)
for(j=0;j<8;j++) src[i][j]=Source[i*8+j];
}
else
{
time=SrcLen/8+1;
for(i=0;i<time;i++)
for(j=0;j<8;j++)
if((i*8+j)<SrcLen) src[i][j]=Source[i*8+j];
else src[i][j]=0x00;
}
//des
for(m=0;m<time;m++)
{
Char_Bit(src[m],8,src_bit);
for(i=0;i<64;i++) ipt[i]=src_bit[ip[i]-1]; //ip
for(i=0;i<32;i++)
{ //r0,l0
l[i]=ipt[i];
r[i]=ipt[i+32];
}
for(k=0;k<16;k++)
{
pt=pt1;
for(i=0;i<48;i++) et[i]=r[e[i]-1]; //e
for(i=0;i<48;i++) et[i]=et[i]^ChildKey[k][i];
//xor
for(i=0;i<8;i++)
{
row=et[i*6+0]*2+et[i*6+5]; //s[i]
h=et[i*6+1]*8+et[i*6+2]*4+et[i*6+3]*2+et[i*6+4];
temp_a=si[i][row*16+h];
if(temp_a&0x08) *pt++=0x01;
else *pt++=0x00;
if(temp_a&0x04) *pt++=0x01;
else *pt++=0x00;
if(temp_a&0x02) *pt++=0x01;
else *pt++=0x00;
if(temp_a&0x01) *pt++=0x01;
else *pt++=0x00;
}
for(i=0;i<32;i++) pt2[i]=pt1[p[i]-1];
for(i=0;i<32;i++) pt2[i]=pt2[i]^l[i]; //r1
for(i=0;i<32;i++) {l[i]=r[i]; r[i]=pt2[i];}
}
for(i=0;i<32;i++) {ipt[i+32]=l[i]; ipt[i]=r[i];}
for(i=0;i<64;i++) src_bit[i]=ipt[fp[i]-1];
Bit_Char(src_bit,64,res);
res+=8;
}
return ReturnLen;
}
extern long WINAPI mw_DesDecrypt( unsigned char *Key,__int16 KeyLen,
unsigned char *Source, unsigned long SrcLen, unsigned char *result)
{
__int16 ip[]=
{
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9 ,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7
};
unsigned char fp[] =
{
40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41, 9,49,17,57,25
};
__int16 e[]=
{
32,1 ,2 ,3 ,4 ,5 ,
4 ,5 ,6 ,7 ,8 ,9 ,
8, 9 ,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1
};
__int16 p[]=
{
16,7 ,20,21,
29,12,28,17,
1 ,15,23,26,
5 ,18,31,10,
2 ,8 ,24,14,
32,27,3 ,9,
19,13,30,6,
22,11,4 ,25
};
unsigned char si[8][64] =
{
{14,4 ,13,1 ,2 ,15,11,8 ,3 ,10,6 ,12,5 ,9 ,0 ,7 ,
0 ,15,7 ,4 ,14,2 ,13,1 ,10,6 ,12,11,9 ,5 ,3 ,8 ,
4 ,1 ,14,8 ,13,6 ,2 ,11,15,12,9 ,7 ,3 ,10,5 ,0 ,
15,12,8 ,2 ,4 ,9 ,1 ,7 ,5 ,11,3 ,14,10,0 ,6 ,13},
{15,1 ,8 ,14,6 ,11,3 ,4 ,9 ,7 ,2 ,13,12,0 ,5 ,10,
3, 13,4 ,7 ,15,2 ,8 ,14,12,0 ,1 ,10,6 ,9 ,11,5 ,
0, 14,7 ,11,10,4 ,13,1 ,5 ,8 ,12,6 ,9 ,3 ,2 ,15,
13,8 ,10,1 ,3 ,15,4 ,2 ,11,6 ,7 ,12,0 ,5 ,14,9 },
{10,0 ,9 ,14,6 ,3 ,15,5 ,1 ,13,12,7 ,11,4 ,2 ,8 ,
13,7 ,0 ,9 ,3 ,4 ,6 ,10,2 ,8 ,5 ,14,12,11,15,1 ,
13,6 ,4 ,9 ,8 ,15,3 ,0 ,11,1 ,2 ,12,5 ,10,14,7 ,
1 ,10,13,0 ,6 ,9 ,8 ,7 ,4 ,15,14,3 ,11,5 ,2 ,12},
{7 ,13,14,3 ,0 ,6 ,9 ,10,1 ,2 ,8 ,5 ,11,12,4 ,15,
13,8 ,11,5 ,6 ,15,0 ,3 ,4 ,7 ,2 ,12,1 ,10,14,9 ,
10,6 ,9 ,0 ,12,11,7 ,13,15,1 ,3 ,14,5 ,2 ,8 ,4 ,
3 ,15,0 ,6 ,10,1 ,13,8 ,9 ,4 ,5 ,11,12,7 ,2 ,14},
{2 ,12,4 ,1 ,7 ,10,11,6 ,8 ,5 ,3 ,15,13,0 ,14,9 ,
14,11,2 ,12,4 ,7 ,13,1 ,5 ,0 ,15,10,3 ,9 ,8 ,6,
4 ,2 ,1 ,11,10,13,7 ,8 ,15,9 ,12,5 ,6 ,3 ,0 ,14,
11,8 ,12,7 ,1 ,14,2 ,13,6 ,15,0 ,9 ,10,4 ,5 ,3 },
{12,1 ,10,15,9 ,2 ,6 ,8 ,0 ,13,3 ,4 ,14,7 ,5 ,11,
10,15,4 ,2 ,7 ,12,9 ,5 ,6 ,1 ,13,14,0 ,11,3 ,8 ,
9 ,14,15,5 ,2 ,8 ,12,3 ,7 ,0 ,4 ,10,1 ,13,11,6 ,
4 ,3 ,2 ,12,9 ,5 ,15,10,11,14,1 ,7 ,6 ,0 ,8 ,13},
{4 ,11,2 ,14,15,0 ,8 ,13,3 ,12,9 ,7 ,5 ,10,6 ,1 ,
13,0 ,11,7 ,4 ,9 ,1 ,10,14,3 ,5 ,12,2 ,15,8 ,6 ,
1 ,4 ,11,13,12,3 ,7 ,14,10,15,6 ,8 ,0 ,5 ,9 ,2 ,
6 ,11,13,8 ,1 ,4 ,10,7 ,9 ,5 ,0 ,15,14,2 ,3 ,12},
{13,2 ,8 ,4 ,6 ,15,11,1 ,10,9 ,3 ,14,5 ,0 ,12,7 ,
1 ,15,13,8 ,10,3 ,7 ,4 ,12,5 ,6 ,11,0 ,14,9 ,2 ,
7 ,11,4 ,1 ,9 ,12,14,2 ,0 ,6 ,10,13,15,3 ,5 ,8 ,
2 ,1 ,14,7 ,4 ,10,8 ,13,15,12,9 ,0 ,3 ,5 ,6 ,11}
};
unsigned char src[1000][8],src_bit[64],ipt[64];
unsigned char et[48],pt1[32],pt2[32],r[32],l[32],*pt;
unsigned char Pkey[8],ChildKey[16][48];
//unsigned char temp[16][6];
unsigned char temp_a;
unsigned char *res;
unsigned long i,j,k,m,row,h,time;
res=result;
for(i=0;i<8;i++) Pkey[i]=Key[i];
if(KeyLen<8)
for(i=0;(short)i<8-KeyLen;i++) Pkey[KeyLen+(short)i]=0x00;
Gen_Childkey1(Pkey,ChildKey);
//group
if((SrcLen%8)==0)
{
time=SrcLen/8;
for(i=0;i<time;i++)
for(j=0;j<8;j++) src[i][j]=Source[i*8+j];
}
else
{
time=SrcLen/8+1;
for(i=0;i<time;i++)
for(j=0;j<8;j++)
if((i*8+j)<SrcLen) src[i][j]=Source[i*8+j];
else src[i][j]=0x00;
}
//des
for(m=0;m<time;m++)
{
Char_Bit(src[m],8,src_bit);
for(i=0;i<64;i++) ipt[i]=src_bit[ip[i]-1]; //ip
for(i=0;i<32;i++)
{ //r0,l0
l[i]=ipt[i];
r[i]=ipt[i+32];
}
for(k=0;k<16;k++)
{
pt=pt1;
for(i=0;i<48;i++) et[i]=r[e[i]-1]; //e
for(i=0;i<48;i++) et[i]=et[i]^ChildKey[15-k][i];
//xor
for(i=0;i<8;i++)
{
row=et[i*6+0]*2+et[i*6+5]; //s[i]
h=et[i*6+1]*8+et[i*6+2]*4+et[i*6+3]*2+et[i*6+4];
temp_a=si[i][row*16+h];
if(temp_a&0x08) *pt++=0x01;
else *pt++=0x00;
if(temp_a&0x04) *pt++=0x01;
else *pt++=0x00;
if(temp_a&0x02) *pt++=0x01;
else *pt++=0x00;
if(temp_a&0x01) *pt++=0x01;
else *pt++=0x00;
}
for(i=0;i<32;i++) pt2[i]=pt1[p[i]-1];
for(i=0;i<32;i++) pt2[i]=pt2[i]^l[i]; //r1
for(i=0;i<32;i++) {l[i]=r[i]; r[i]=pt2[i];}
}
for(i=0;i<32;i++) {ipt[i+32]=l[i]; ipt[i]=r[i];}
for(i=0;i<64;i++) src_bit[i]=ipt[fp[i]-1];
Bit_Char(src_bit,64,res);
res+=8;
}
return 0;
}
void Bit_Char(unsigned char *Src,__int16 BitLen,unsigned char *Res)
{ __int16 i,j,a;
for(i=0;i<(BitLen/8);i++)
{
a=128;
Res[i]=0x00;
for(j=0;j<8;j++)
{
Res[i]=Res[i]+Src[j+i*8]*a;
a/=2;
}
}
}
void Char_Bit(unsigned char *Src,__int16 CharLen,unsigned char *Res)
{ __int16 i,j;
unsigned char temp;
for(i=0;i<CharLen;i++)
for(j=0;j<8;j++){
temp=(Src[i]<<j)&0x80;
if(temp) Res[i*8+j]=0x01;
else Res[i*8+j]=0x00;
}
return;
}
void Gen_Childkey1(unsigned char Key[8],unsigned char Childkey[16][48])
{
__int16 pc_1[] = {
57,49,41,33,25,17,9 ,
1 ,58,50,42,34,26,18,
10,2 ,59,51,43,35,27,
19,11,3 ,60,52,44,36,
63,55,47,39,31,23,15,
7 ,62,54,46,38,30,22,
14,6 ,61,53,45,37,29,
21,13,5 ,28,20,12,4
};
__int16 sht[] = {
1 ,1 ,2 ,2 ,2 ,2 ,2 ,2 , 1 ,2 ,2 ,2 ,2 ,2 ,2 ,1
};
__int16 pc_2[] = {
14,17,11,24,1 ,5 ,
3 ,28,15,6 ,21,10,
23,19,12,4 ,26,8 ,
16,7 ,27,20,13,2 ,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32
};
__int16 i,j,k;
unsigned char pc_1t[56],temp;
unsigned char keybit[64];
Char_Bit(Key,8,keybit);
for(i=0;i<56;i++) //pc-1
pc_1t[i]=keybit[pc_1[i]-1];
for(k=0;k<16;k++)
{
for(i=0;i<sht[k];i++)
{ //c1, d1
temp=pc_1t[0];
for(j=0;j<28;j++)
if(j==27) pc_1t[j]=temp;
else pc_1t[j]=pc_1t[j+1];
temp=pc_1t[28];
for(j=28;j<56;j++)
if(j==55) pc_1t[j]=temp;
else pc_1t[j]=pc_1t[j+1];
}
for(i=0;i<48;i++) //pc-2
Childkey[k][i]=pc_1t[pc_2[i]-1];
}
}
void TrimSpace(CString &strDes,unsigned char *src)
{
CString strSrc = src;
int i;
strDes = "";
if(strSrc.GetLength()==0)
return;
for(;;)
{
if(strSrc.GetLength()==0)
break;
strSrc.TrimLeft();
i=strSrc.Find(' ');
if(i == -1)
{
strDes += strSrc;
break;
}
else
{
strDes += strSrc.Left(i);
strSrc = strSrc.Right(strSrc.GetLength()-i);
}
}
}
void InvertByte(unsigned char *src,int len,unsigned char *des)
{
for(int i=0;i<len;i++)
{
des[i] = ~src[i];
}
}
void CharToInt(unsigned int *des, UCHAR *src, int pair_len)
{
unsigned char *p2;
char ch[9];
ch[8]=0;
des[0] = pair_len;
for(int i=0;i<pair_len;i++)
{
p2=&src[(pair_len-i-1)*8];
memcpy(ch,p2,8);
sscanf((const char*)p2,"%x",&des[i+1]);
}
}
void IntToChar(unsigned char*des,unsigned long*src,int nLen)
{
unsigned char ch[4];
unsigned char *p;
for(int i=0;i<nLen;i++)
{
p= (unsigned char*)&src[i];
for(int j=0;j<4;j++)
ch[j] = p[3-j];
HexToChar(&des[i*8],ch,4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -