实现PROXY穿越(8):NT-Hash的实现

  最近忙,事比较多,活多了,还要降薪,唉。没什么时间看书,将以前的一些技术blog也移到这里。NTLM在去年年底和今年年初研究过一阵子,写了总结和例子程序。里面涉及很多算法,在网上查了很久。(下面是以前的博客)最近想实现一个通过PROXY穿越的网络编程,将相关的内容进行一下汇总。很多东西来自网络共产主义,也应该为共产主义有所回馈。介绍NT-hash的实现。
  从IBM设计的LM Hash算法存在几个弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,NTLM Hash应运而生。假设明文口令是“123456”,首先转换成Unicode字符串,与LM Hash算法不同,这次不需要添加0x00补足14字节,并且是区分大小写的。
      "123456" -> 310032003300340035003600。
  SMB报文解码中。0x80之前的标准ASCII码转换成Unicode码,就是简单地从0x??变成0x00??。此 类标准ASCII串按little- endian序转换成Unicode串,就是简单地在原有每个字节之后添加0x00。对所获取的Unicode串进行标准MD4单向哈希,无论数据源有多 少字节,MD4固定产生128-bit的哈希值。
     16字节310032003300340035003600 -进行标准MD4单向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4
  就得到了最后的NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4。

static void unicode(IN char * src, IN int src_len, OUT char * dst, OUT int * dst_len){
    int i ;
    for( i = 0 ; i < src_len; i ++){
        dst[2*i] = src[i];
        dst[2*i +1] = 0;
    }
    if(dst_len != NULL)
        * dst_len = src_len * 2;
}

void nt_hash(IN char * src, IN int is_unicode,OUT unsigned char * dst, OUT int * dst_len){
    char * source = NULL;
    int len = strlen(src);
    if(!is_unicode){
        source = (char * ) malloc(len *2 );
        unicode(src,len,source,&len);
    }else{
        source = src;
    }

    MD4String (source,len,dst);
    if(dst_len != NULL)
        * dst_len = 16;

    if(!is_unicode)
        free(source);
}

调用例子:
unsigned char dst[16];
nt_hash("123456",0,dst,NULL)

 

相关链接:我的网络通信相关文章

NTLM的实现:

  • 实现PROXY穿越(16):NTLM的PROXY穿越
  • 实现PROXY穿越(15):NTLM Session Security
  • 实现PROXY穿越(14):NTLM type3 Message
  • 实现PROXY穿越(13):NTLM type2 Message
  • 实现PROXY穿越(12):NTLM type1 Message
  • 实现PROXY穿越(11):NTLMv2 session response
  • 实现PROXY穿越(10):NTLMv2 response
  • 实现PROXY穿越(9):NTLMv1 response
  • 实现PROXY穿越(8):NT-Hash的实现
  • 实现PROXY穿越(7):MD4和MD5
  • 实现PROXY穿越(6):LM-Hash的实现
  • 实现PROXY穿越(5):DES算法之三
  • 实现PROXY穿越(4):DES算法之二
  • 实现PROXY穿越(3):DES算法之一
  • 实现PROXY穿越(2):Base64算法
  • 实现PROXY穿越(1):流程和NTLM算法

你可能感兴趣的:(算法,网络,session,Security,null,DST)