📄 desaes.cpp
字号:
AddRoundKey(state, Nb, W);
}
free( W ) ;
}
}
char dbit[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
char abit[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
char InitialTr[64]=
{
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
};
char FinalTr[64]=
{
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
};
char Swap[64]=
{
33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,
49,50,51,52,53,54,55,56,
57,58,59,60,61,62,63,64,
1, 2, 3, 4, 5, 6, 7, 8,
9,10,11,12,13,14,15,16,
17,18,19,20,21,22,23,24,
25,26,27,28,29,30,31,32
};
char KeyTr1[56]=
{
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
};
char KeyTr2[48]=
{
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
};
char etr[48]=
{
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
};
char ptr[32]=
{
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
};
char rots[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
char s[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 }
};
struct bitb
{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} bb;
/*-----------------------------------*/
int getbit(char byteb[],char bitn)
{
char i,j;
i=bitn/8;
j=bitn%8;
if ((byteb[i]&dbit[j]))
{
bb.bit0=1;
return(1);
}
else
{
bb.bit0=0;
return(0);
}
}
void putbit(char byteb[],char bitn)
{
char i,j;
i=bitn/8;
j=bitn%8;
if (bb.bit0)
byteb[i]|=dbit[j];
else
byteb[i]&=abit[j];
}
void transpose(char datab[],char ord[],char bitn)
{
char i;
char bx[8];
for(i=0;i<8;i++) bx[i]=datab[i];
for(i=0;i<bitn;i++)
{
getbit(bx,(ord[i]-1));
putbit(datab,i);
}
}
void rotate(char key[])
{
char i;
char xx[8];
for(i=0;i<7;i++)
xx[i]=key[i];
for(i=0;i<7;i++)
{
xx[i]<<=1;
}
getbit(key,8);
putbit(xx,7);
getbit(key,16);
putbit(xx,15);
getbit(key,24);
putbit(xx,23);
getbit(key,0);
putbit(xx,27);
getbit(key,32);
putbit(xx,31);
getbit(key,40);
putbit(xx,39);
getbit(key,48);
putbit(xx,47);
getbit(key,28);
putbit(xx,55);
for(i=0;i<7;i++)
key[i]=xx[i];
}
void f(char *kp,char *a,char *x)
{
char e[8];
char r,j,i=0;
for(j=0;j<8;j++)
e[j]=a[j];
transpose(e,etr,48);
for(j=0;j<6;j++)
kp[j]=e[j]^kp[j];
for(j=0;j<8;j++)
{
r=0;
if (getbit(kp,6*j+0)) r+=32;
if (getbit(kp,6*j+1)) r+=8;
if (getbit(kp,6*j+2)) r+=4;
if (getbit(kp,6*j+3)) r+=2;
if (getbit(kp,6*j+4)) r+=1;
if (getbit(kp,6*j+5)) r+=16;
r=s[j][r];
if ((j&0x01)==0)
{
r<<=4;
x[i]=r;
}
else
{
x[i]|=r;
i++;
}
}
transpose(x,ptr,32);
}
/*----------------------------------------------------*/
extern "C"
{
__declspec(dllexport) void __stdcall Des(BYTE *block, BYTE * buf,BOOL desb)
{
BYTE k[16][6];
BYTE b[8],x[8];
BYTE ikey[8];
BYTE key[8];
BYTE *a,*kp;
BYTE i,j;
a=block;
key[0]=0x10;key[1]=0x27;key[2]=0xbc;key[3]=0x30;key[4]=0x02;
key[5]=0x1b;key[6]=0x1c;key[7]=0xfc;
transpose(a,InitialTr,64);
transpose(key,KeyTr1,56);
for(i=0;i<16;i++)
{
for(j=0;j<rots[i];j++)
rotate(key);
for(j=0;j<7;j++)
ikey[j]=key[j];
transpose(ikey,KeyTr2,48);
for(j=0;j<6;j++)
k[i][j]=ikey[j];
}
for(i=0;i<16;i++)
{
for(j=0;j<8;j++)
b[j]=a[j];
for(j=0;j<4;j++)
a[j]=a[j+4];
if (desb)
kp=&k[i][0];
else
kp=&k[15-i][0];
f(kp,a,x);
for(j=0;j<4;j++)
a[j+4]=b[j]^x[j];
}
transpose(a,Swap,64);
transpose(a,FinalTr,64);
}
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -