#include "stdafx.h"
#include "Table.h"
#include "des.h"
/**************
说明:以下算法全部从 Radmin.exe 中反汇编得到,
看上去很像DES算法,所以函数名我都以des_打
头,到底是不是标准DES算法我也不清楚,有兴
趣的朋友可以去研究一下。
****************/
void des_setkey(BYTE* pPass,DES_BUF* pBuf)
{
BYTE pass[16];
BYTE key[20];
memset(key,0,sizeof(key));
memcpy(pass,pPass,16);
DWORD* lpB=(DWORD*)&pBuf->d;
DWORD p1,p2;
int i;
for(i=0;i<40;i+=2,lpB+=2)
{
p2=des_2(i+1,pass+4);
p2=(p2<<8)|(p2>>(32-8));
p1=p2+des_2(i,pass);
p2+=p1;
lpB[0]=p1;
lpB[1]=(p2<<9)|(p2>>(32-9));
}
DWORD* lpA=(DWORD*)(pass+16);
for(BYTE* lpD,*lpOD=key;(BYTE*)lpA>pass;lpOD+=8)
{
lpD=lpOD;
lpA-=2;
*(DWORD*)(lpD)=0;
*(DWORD*)(lpD+4)=lpA[0];
*(DWORD*)(lpD+8)=lpA[1];
for(i=0;i<8;i++)
{
BYTE bc=lpD[11],bd;
bd=(2*bc)^tab1[bc>>7];
bc=bd^(bc>>1)^tab2[bc&1];
lpD[10]^=bc;
lpD[9]^=bd;
lpD[8]^=bc;
lpD[7]^=lpD[11];
lpD--;
}
}
des_3(key,pBuf);
}
DWORD des_2(int i,BYTE* pass)
{
BYTE bl;
DWORD eax;
bl=tab3[pass[10]^tab4[i]]^pass[2];
eax=tab5[bl];
bl=tab3[pass[11]^tab3[i]]^pass[3];
eax^=tab6[bl];
bl=tab4[pass[9]^tab3[i]]^pass[1];
eax^=tab7[bl];
bl=tab4[pass[8]^tab4[i]]^pass[0];
eax^=tab8[bl];
return eax;
}
//fill desbuffer
void des_3(BYTE* key,DES_BUF* pDesBuf)
{
DWORD* buf2=(DWORD*)&pDesBuf->buf2;
DWORD* buf1=(DWORD*)&pDesBuf->buf1;
for(int i=0;i<256;i++,buf2++,buf1++)
{
buf1[0]=tab8[tab4[key[8]^tab4[i]]^key[0]];
buf1[0x100]=tab7[tab4[tab3[i]^key[9]]^key[1]];
buf2[0]=tab5[tab3[tab4[i]^key[10]]^key[2]];
buf2[0x100]=tab6[tab3[tab3[i]^key[11]]^key[3]];
}
}
void des_f1(DWORD* pBuf,DWORD* lpDesBuf)
{
DWORD x[4]={0x98BADCFE,0x10325476,0x184A9DA3,0x524A5BF8};
for(int i=0;i<2;i++)
{
x[0]^=pBuf[0];
x[2]^=pBuf[2];
x[1]^=pBuf[1];
x[3]^=pBuf[3];
des_4(x,lpDesBuf);
pBuf[0]=x[0];
pBuf[1]=x[1];
pBuf[2]=x[2];
pBuf[3]=x[3];
pBuf+=4;
}
}
void des_4(DWORD* x,DWORD* lpDesBuf)
{
DWORD var_4,var_8,var_C,var_10,eax,ebx,ecx,edx,edi,ebp;
BYTE* vb_4=(BYTE*)&var_4;
BYTE* vb_8=(BYTE*)&var_8;
BYTE* vb_C=(BYTE*)&var_C;
BYTE* vb_10=(BYTE*)&var_10;
var_C=x[0]^lpDesBuf[0x400];
var_10=x[1]^lpDesBuf[0x401];
var_4=x[2]^lpDesBuf[0x402];
var_8=x[3]^lpDesBuf[0x403];
ebp=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
ecx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
edx=(lpDesBuf[0x408]+ecx+ebp)^var_4;//1020
var_4=(edx>>1)|(edx<<31);
var_8=(lpDesBuf[0x409]+ecx*2+ebp)^((var_8<<1)|(var_8>>31));
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
ecx=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];
ebx=(lpDesBuf[0x40A]+ecx+edi)^var_C;
var_C=(ebx>>1)|(ebx<<31);
var_10=(lpDesBuf[0x40B]+ecx*2+edi)^((var_10<<1)|(var_10>>31));
edi=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
edx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
ecx=(lpDesBuf[0x40C]+edx+edi)^var_4;
var_4=(ecx>>1)|(ecx<<31);//ecx
var_8=(lpDesBuf[0x40D]+edx*2+edi)^((var_8<<1)|(var_8>>31));//edx
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
eax=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];
ebx=(lpDesBuf[0x40E]+eax+edi)^var_C;
var_C=(ebx>>1)|(ebx<<31);//edx
var_10=(lpDesBuf[0x40F]+eax*2+edi)^((var_10>>31)|(var_10<<1));//eax
edi=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
edx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
eax=(lpDesBuf[0x410]+edx+edi)^var_4;
var_4=(eax>>1)|(eax<<31);//eax
ecx=lpDesBuf[0x411];
var_8=(ecx+edx*2+edi)^((var_8<<1)|(var_8>>31));//edx
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
ecx=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];
edx=(lpDesBuf[0x412]+ecx+edi)^var_C;
var_C=(edx>>1)|(edx<<31);//edx
var_10=(lpDesBuf[0x413]+ecx*2+edi)^((var_10<<1)|(var_10>>31));//ecx
edi=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
edx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
ecx=(lpDesBuf[0x414]+edx+edi)^var_4;
var_4=(ecx>>1)|(ecx<<31);//ecx
var_8=(lpDesBuf[0x415]+edx*2+edi)^((var_8<<1)|(var_8>>31));//eax
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
ebp=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];
eax=(lpDesBuf[0x416]+ebp+edi)^var_C;
var_C=(eax>>1)|(eax<<31);//eax
var_10=(lpDesBuf[0x417]+ebp*2+edi)^((var_10<<1)|(var_10>>31));//ebp
edi=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
edx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
eax=(lpDesBuf[0x418]+edx+edi)^var_4;
var_4=(eax>>1)|(eax<<31);//eax
var_8=(lpDesBuf[0x419]+edx*2+edi)^((var_8<<1)|(var_8>>31));//ecx
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
ebp=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];
ecx=(lpDesBuf[0x41A]+ebp+edi)^var_C;
var_C=(ecx>>1)|(ecx<<31);
var_10=(lpDesBuf[0x41B]+ebp*2+edi)^((var_10<<1)|(var_10>>31));//ebp
edi=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
edx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
ecx=(lpDesBuf[0x41C]+edx+edi)^var_4;
var_4=(ecx>>1)|(ecx<<31);//ecx
var_8=(lpDesBuf[0x41D]+edx*2+edi)^((var_8<<1)|(var_8>>31));//eax
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
ebp=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];////????
eax=(lpDesBuf[0x41E]+ebp+edi)^var_C;
var_C=(eax>>1)|(eax<<31);//eax
var_10=(lpDesBuf[0x41F]+ebp*2+edi)^((var_10<<1)|(var_10>>31));//ebp
edi=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
edx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
eax=(lpDesBuf[0x420]+edx+edi)^var_4;
var_4=(eax>>1)|(eax<<31);//eax
var_8=(lpDesBuf[0x421]+edx*2+edi)^((var_8<<1)|(var_8>>31));//ecx
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
ebp=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];
ecx=(lpDesBuf[0x422]+ebp+edi)^var_C;
var_C=(ecx>>1)|(ecx<<31);//ecx
var_10=(lpDesBuf[0x423]+ebp*2+edi)^((var_10<<1)|(var_10>>31));//ebp
edi=lpDesBuf[vb_C[2]+0x200]^lpDesBuf[vb_C[1]+0x100]^lpDesBuf[vb_C[3]+0x300]^lpDesBuf[vb_C[0]];
edx=lpDesBuf[vb_10[2]+0x300]^lpDesBuf[vb_10[1]+0x200]^lpDesBuf[vb_10[0]+0x100]^lpDesBuf[vb_10[3]];
ecx=(lpDesBuf[0x424]+edx+edi)^var_4;
var_4=(ecx>>1)|(ecx<<31);//ecx
var_8=(lpDesBuf[0x425]+edx*2+edi)^((var_8<<1)|(var_8>>31));//edx
edi=lpDesBuf[vb_4[2]+0x200]^lpDesBuf[vb_4[1]+0x100]^lpDesBuf[vb_4[3]+0x300]^lpDesBuf[vb_4[0]];
ebp=lpDesBuf[vb_8[2]+0x300]^lpDesBuf[vb_8[1]+0x200]^lpDesBuf[vb_8[0]+0x100]^lpDesBuf[vb_8[3]];
eax=(lpDesBuf[0x426]+ebp+edi)^var_C;
var_C=(eax>>1)|(eax<<31);
var_10=(lpDesBuf[0x427]+ebp*2+edi)^((var_10<<1)|(var_10>>31));
x[0]=var_4^lpDesBuf[0x404];//ecx
x[1]=var_8^lpDesBuf[0x405];//edx
x[2]=var_C^lpDesBuf[0x406];//eax
x[3]=var_10^lp
- 1
- 2
- 3
前往页