📄 ntlm挑战模式散列认证加密协议过程,算法实现与一些想法.txt
字号:
d2=(d2<<0xd)|(d2>>0x13);
a1=*(DWORD *)(LM+0x20);
a3=(((d3|d2)&d4)|(d3&d2))+a1+0x5a827999;
a2=a2+a3;
a2=(a2<<3)|(a2>>0x1d);
a1=*(DWORD *)(LM+0x30);
a3=(((d2|a2)&d3)|(d2&a2))+0x5a827999;
d4=d4+a1+a3;
d4=(d4<<5)|(d4>>0x1b);
a1=*(DWORD *)(LM+0x40);
a3=(((d4|a2)&d2)|(d4&a2))+0x5a827999;
d3=d3+a1+a3;
d3=(d3<<9)|(d3>>0x17);
a1=*(DWORD *)(LM+0x50);
a3=(((d4|d3)&a2)|(d4&d3))+a1+0x5a827999;
d2=d2+a3;
d2=(d2<<0xd)|(d2>>0x13);
a1=*(DWORD *)(LM+0x24);
a3=(((d3|d2)&d4)|(d3&d2))+a1+0x5a827999;
a2=a2+a3;
a2=(a2<<3)|(a2>>0x1d);
a1=*(DWORD *)(LM+0x34);
a3=(((d2|a2)&d3)|(d2&a2))+0x5a827999;
d4=d4+a1+a3;
d4=(d4<<5)|(d4>>0x1b);
a1=*(DWORD *)(LM+0x44);
a3=(((d4|a2)&d2)|(d4&a2))+a1+0x5a827999;
d3=d3+a3;
d3=(d3<<9)|(d3>>0x17);
a1=*(DWORD *)(LM+0x54);
a3=(((d4|d3)&a2)|(d4&d3))+a1+0x5a827999;
d2=d2+a3;
d2=(d2<<0xd)|(d2>>0x13);
//第3轮
a1=*(DWORD *)(LM+0x18);
a3=((d4^d3)^d2)+a1;
a2=a2+0x6ed9eba1+a3;
a2=(a2<<3)|(a2>>0x1d);
a1=*(DWORD *)(LM+0x38);
a3=((d3^d2)^a2)+a1;
d4=d4+0x6ed9eba1+a3;
d4=(d4<<9)|(d4>>0x17);
a1=*(DWORD *)(LM+0x28);
a3=((d4^d2)^a2)+a1;
d3=d3+0x6ed9eba1+a3;
d3=(d3<<0xb)|(d3>>0x15);
a1=*(DWORD *)(LM+0x48);
a3=d4^d3;
d2=d2+a1+0x6ed9eba1+(a2^a3);
d2=(d2<<0xf)|(d2>>0x11);
a1=*(DWORD *)(LM+0x20);
a2=a2+((d2^a3)+a1+0x6ed9eba1);
a3=d3^d2;
a2=(a2<<3)|(a2>>0x1d);
a1=*(DWORD *)(LM+0x40);
a3=(a3^a2)+a1;
d4=d4+0x6ed9eba1+a3;
d4=(d4<<9)|(d4>>0x17);
a1=*(DWORD *)(LM+0x30);
a3=((d4^d2)^a2)+a1;
d3=d3+0x6ed9eba1+a3;
d3=(d3<<0xb)|(d3>>0x15);
a1=*(DWORD *)(LM+0x50);
a3=d4^d3;
d2=d2+a1+0x6ed9eba1+(a2^a3);
d2=(d2<<0xf)|(d2>>0x11);
a1=*(DWORD *)(LM+0x1c);
a2=a2+0x6ed9eba1+((d2^a3)+a1);
a3=d3^d2;
a2=(a2<<3)|(a2>>0x1d);
a1=*(DWORD *)(LM+0x3c);
a3=(a3^a2)+a1;
d4=d4+0x6ed9eba1+a3;
d4=(d4<<9)|(d4>>0x17);
a1=*(DWORD *)(LM+0x2c);
a3=((d4^d2)^a2)+a1;
d3=d3+0x6ed9eba1+a3;
d3=(d3<<0xb)|(d3>>0x15);
a1=*(DWORD *)(LM+0x4c);
a3=d4^d3;
d2=d2+a1+0x6ed9eba1+(a2^a3);
d2=(d2<<0xf)|(d2>>0x11);
a1=*(DWORD *)(LM+0x24);
a2=a2+0x6ed9eba1+((d2^a3)+a1);
a3=d3^d2;
a2=(a2<<3)|(a2>>0x1d);
a1=*(DWORD *)(LM+0x44);
a3=(a3^a2)+a1;
d4=d4+0x6ed9eba1+a3;
d4=(d4<<9)|(d4>>0x17);
a1=*(DWORD *)(LM+0x34);
a3=((d4^d2)^a2)+a1;
d3=d3+0x6ed9eba1+a3;
d3=(d3<<0xb)|(d3>>0x15);
a1=*(DWORD *)(LM+0x54);
a3=((d4^a2)^d3)+a1;
d2=d2+0x6ed9eba1+a3;
d2=(d2<<0xf)|(d2>>0x11);
*(DWORD *)(LM)=a2+*(DWORD *)(LM);
*(DWORD *)(LM+4)=d2+*(DWORD *)(LM+4);
*(DWORD *)(LM+8)=d3+*(DWORD *)(LM+8);
*(DWORD *)(LM+0xc)=d4+*(DWORD *)(LM+0xc);
}
void initLMP(char * pass,unsigned char * LM)
{
char LmPass[0x20];
DWORD d1,d2;
unsigned char a1,a2;
char a3[]={1,3,7,0xf,0x1f,0x3f,0x7f};
int i;
for(i=0;i<8;i++)
{
if(i==0)
{
a1=pass[0];
LmPass[0]=a1>>1;
}
else if(i==7)
{
a1=pass[i-1];
a1=a1&a3[i-1];
LmPass[i]=a1;
}
else
{
a1=pass[i-1];
a2=pass[i];
a1=a1&a3[i-1];
a1=a1<<(7-i);
a2=a2>>(i+1);
LmPass[i]=a1|a2;
}
}
d1=*(DWORD *)LmPass;
d2=*(DWORD *)(LmPass+4);
d1=(d1&0xff7f7f7f)<<1;
d2=(d2&0xff7f7f7f)<<1;
*(DWORD *)LmPass=d1;
*(DWORD *)(LmPass+4)=d2;
//
for(i=0;i<8;i++)
{
a1=LmPass[i];
a2=a1;
a1=a1&0xf;
a2=a2>>4;
a2=DESParity[a2];
a1=DESParity[a1];
a2=a1+a2;
a2=a2^a1;
a2=a2-a1;
a2=a2&1;
a2=a2^a1;
a2=a2-a1;
if(a2==0)
LmPass[i]=LmPass[i]^1;
}
memcpy(LM,LmPass,8);
//deskey(LmPass,desecb);
//des(LM,magic1,desecb,1);
}
void deskey(char * LmPass,unsigned char * desecb)
{
int i;
unsigned char a1;
DWORD d1,d2,d3,d4,d5,d6;
d1=*(DWORD *)LmPass;
d2=*(DWORD *)(LmPass+4);
d2=d2>>4;
d1=d1&0xf0f0f0f;
d2=d2&0xf0f0f0f;
d2=d2^d1;
d1=(*(DWORD *)LmPass)^d2;
d2=d2<<4;
d2=(*(DWORD *)(LmPass+4))^d2;
d3=d1&0xfffff333;
d3=d3<<0x12;
d4=d1&0xcccc0000;
d4=d4^d3;
d3=d4;
d3=d3>>0x12;
d3=d3^d4;
d1=d1^d3;
d3=d2&0xfffff333;
d3=d3<<0x12;
d4=d2&0xcccc0000;
d4=d4^d3;
d3=d4>>0x12;
d3=d3^d4;
d2=d2^d3;
d3=d1;
d4=d2>>1;
d3=d3&0x55555555;
d4=d4&0x55555555;
d4=d4^d3;
d1=d1^d4;
d4=d4+d4;
d2=d2^d4;
d4=d1>>8;
d3=d2&0xff00ff;
d4=d4&0xff00ff;
d4=d4^d3;
d2=d2^d4;
d4=d4<<8;
d1=d1^d4;
d4=d2>>1;
d3=d1;
d3=d3&0x55555555;
d4=d4&0x55555555;
d4=d4^d3;
d1=d1^d4;
d4=d4+d4;
d2=d2^d4;
d3=d1&0xf000000f;
d4=(d2>>0xc)&0xff0;
d1=d1&0x0fffffff;
d3=(d3|d4)>>4;
d4=d2&0xff00;
d2=(d2&0xff)<<0x10;
d3=d3|d4;
d3=d3|d2;
for(i=0;i<16;i++)
{
d2=d1;
a1=DESDShift[i];
if(a1==0)
{
d2=d2>>1;
d1=d1<<0x1b;
d4=d3>>1;
d3=d3<<0x1b;
d1=d1|d2;
}
else
{
d2=d2>>2;
d1=d1<<0x1a;
d4=d3>>2;
d3=d3<<0x1a;
d1=d1|d2;
}
d1=d1&0x0fffffff;
d3=d3|d4;
d2=d1>>1;
d4=d1&0xc00000;
d4=d4|(d2&0x07000000);
d4=(d4>>1)|(d1&0x00100000);
//d6=d2&0x00060000;
d5=(d1&0x0001e000)|(d2&0x00060000);
d2=d2&0x00000f00;
d3=d3&0x0fffffff;
d5=d5>>0xd;
d4=d4>>0x14;
d6=DESKEY3[d5];
d5=d1&0xc0;
d4=DESKEY4[d4];
d5=(d5|d2)>>6;
d4=d4|d6;
d2=d1&0x3f;
d6=DESKEY2[d5];
d5=d3&0x180;
d4=d4|d6;
d6=DESKEY1[d2];
d2=d3>>1;
d4=d4|d6;
d6=d2&0x1e00;
d2=d2&0x6000000;
d5=(d5^d6)>>7;
d6=(d3&0x1e00000)|d2;
d6=d6>>0x15;
d2=DESKEY6[d5];
d5=DESKEY8[d6];
d2=d2^d5;
d5=d3&0x3f;
d6=DESKEY5[d5];
d5=(d3>>0xf)&0x3f;
d2=d2|d6;
d6=DESKEY7[d5];
d5=d4&0xffff;
d2=d2|d6;
d6=d2<<0x10;
d2=d2&0xffff0000;
d5=d5|d6;
d5=(d5<<2)|(d5>>0x1e);
d4=d4>>0x10;
d2=d2|d4;
d2=(d2<<6)|(d2>>0x1a);
*(DWORD *)(desecb+8*i)=d5;
*(DWORD *)(desecb+8*i+4)=d2;
}
}
void des(unsigned char * LM,char * magic,unsigned char * ecb,long no)
{
DWORD d1,d2,d3,d4;
DWORD a1,a2,a3;
int i;
d1= *(DWORD *)magic;
d2= *(DWORD *)(magic+4);
d1 = (d1<<4)|(d1>>0x1c);
d3 = d1;
d1 = (d1^d2)&0xf0f0f0f0;
d3 = d3^d1;
d2 = d2^d1;
d2 =(d2<<0x14)|(d2>>0xc);
d1 = d2;
d2 = (d2^d3)&0xfff0000f;
d1 = d1 ^ d2;
d3 = d3^d2;
d1 = (d1<<0xe)|(d1>>0x12);
d2 = d1;
d1 = (d1 ^ d3) & 0x33333333;
d2 = d2 ^ d1;
d3 = d3^d1;
d3 = (d3<<0x16)|(d3>>0xa);
d1 = d3;
d3 = (d3 ^ d2)&0x3fc03fc;
d1 = d1^d3;
d2 = d2^d3;
d1 = (d1<<9)|(d1>>0x17);
d3 = d1;
d1 = (d1^d2)&0xaaaaaaaa;
d3 = d3^d1;
d2 = d2^d1;
d2 = (d2<<1)|(d2>>0x1f);
if(no!=0)
{
for(i=0;i<8;i++)
{
a1=0;
d1=*(DWORD *)(ecb+16*i);
d4=*(DWORD *)(ecb+16*i+4);
d1=(d1^d3)&0xfcfcfcfc;
d4=(d4^d3)&0xcfcfcfcf;
a1=d1&0xff;
a2=(d1>>8)&0xff;
d4=(d4>>4)|(d4<<0x1c);
a3=DESSpBox1[a1/4];
a1=d4&0xff;
d2=d2^a3;
a3=DESSpBox3[a2/4];
d2=d2^a3;
a2=(d4>>8)&0xff;
d1=d1>>0x10;
a3=DESSpBox2[a1/4];
d2=d2^a3;
a1=(d1>>8)&0xff;
d4=d4>>0x10;
a3=DESSpBox4[a2/4];
d2=d2^a3;
a2=(d4>>8)&0xff;
d1=d1&0xff;
d4=d4&0xff;
a1=DESSpBox7[a1/4];
d2=d2^a1;
a1=DESSpBox8[a2/4];
d2=d2^a1;
a1=DESSpBox5[d1/4];
d2=d2^a1;
a1=DESSpBox6[d4/4];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -