加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

C/C++ MD5算法的实现代码

发布时间:2020-12-30 16:32:08 所属栏目:创业 来源:网络整理
导读:在逆向程序的时候,经常会碰到加密的算法的问题,前面分析UC的逆向工程师的面试题2的时候,发现使用了MD5的加密算法(MD5算法是自己实现的,不是使用的算法库函数)。尤其是在逆向分析网络协议的时候,一般的程序使用的加密算法都是使用的库函数提供的算法,

MD5算法的实现文件Md5.cpp:

unsigned char PADDING[] = {  
  0x80,0 }; 
 
//在逆向代码的时候,需要关注下面的特征值 
void MD5Init(MD5_CTX *context) 
{ 
  context->count[0] = 0; 
  context->count[1] = 0; 
  context->state[0] = 0x67452301; 
  context->state[1] = 0xEFCDAB89; 
  context->state[2] = 0x98BADCFE; 
  context->state[3] = 0x10325476; 
} 
 
void MD5Update(MD5_CTX *context,unsigned int inputlen) 
{ 
  unsigned int i = 0,index = 0,partlen = 0; 
  index = (context->count[0] >> 3) & 0x3F; 
  partlen = 64 - index; 
  context->count[0] += inputlen << 3; 
  if (context->count[0] < (inputlen << 3)) 
    context->count[1]++; 
  context->count[1] += inputlen >> 29; 
 
  if (inputlen >= partlen) 
  { 
    memcpy(&context->buffer[index],input,partlen); 
    MD5Transform(context->state,context->buffer); 
    for (i = partlen; i + 64 <= inputlen; i += 64) 
      MD5Transform(context->state,&input[i]); 
    index = 0; 
  } 
  else 
  { 
    i = 0; 
  } 
  memcpy(&context->buffer[index],&input[i],inputlen - i); 
} 
 
void MD5Final(MD5_CTX *context,unsigned char digest[16]) 
{ 
  unsigned int index = 0,padlen = 0; 
  unsigned char bits[8]; 
  index = (context->count[0] >> 3) & 0x3F; 
  padlen = (index < 56) ? (56 - index) : (120 - index); 
  MD5Encode(bits,context->count,8); 
  MD5Update(context,PADDING,padlen); 
  MD5Update(context,bits,8); 
  MD5Encode(digest,context->state,16); 
} 
 
void MD5Encode(unsigned char *output,unsigned int len) 
{ 
  unsigned int i = 0,j = 0; 
  while (j < len) 
  { 
    output[j] = input[i] & 0xFF; 
    output[j + 1] = (input[i] >> 8) & 0xFF; 
    output[j + 2] = (input[i] >> 16) & 0xFF; 
    output[j + 3] = (input[i] >> 24) & 0xFF; 
    i++; 
    j += 4; 
  } 
} 
 
void MD5Decode(unsigned int *output,j = 0; 
  while (j < len) 
  { 
    output[i] = (input[j]) | 
      (input[j + 1] << 8) | 
      (input[j + 2] << 16) | 
      (input[j + 3] << 24); 
    i++; 
    j += 4; 
  } 
} 
 
void MD5Transform(unsigned int state[4],unsigned char block[64]) 
{ 
  unsigned int a = state[0]; 
  unsigned int b = state[1]; 
  unsigned int c = state[2]; 
  unsigned int d = state[3]; 
  unsigned int x[64]; 
 
  MD5Decode(x,block,64); 
  FF(a,x[0],0xd76aa478); 
  FF(d,x[1],0xe8c7b756); 
  FF(c,x[2],0x242070db); 
  FF(b,x[3],0xc1bdceee); 
  FF(a,x[4],0xf57c0faf); 
  FF(d,x[5],0x4787c62a); 
  FF(c,x[6],0xa8304613); 
  FF(b,x[7],0xfd469501); 
  FF(a,x[8],0x698098d8); 
  FF(d,x[9],0x8b44f7af); 
  FF(c,x[10],0xffff5bb1); 
  FF(b,x[11],0x895cd7be); 
  FF(a,x[12],0x6b901122); 
  FF(d,x[13],0xfd987193); 
  FF(c,x[14],0xa679438e); 
  FF(b,x[15],0x49b40821); 
 
 
  GG(a,0xf61e2562); 
  GG(d,0xc040b340); 
  GG(c,0x265e5a51); 
  GG(b,0xe9b6c7aa); 
  GG(a,0xd62f105d); 
  GG(d,0x2441453); 
  GG(c,0xd8a1e681); 
  GG(b,0xe7d3fbc8); 
  GG(a,0x21e1cde6); 
  GG(d,0xc33707d6); 
  GG(c,0xf4d50d87); 
  GG(b,0x455a14ed); 
  GG(a,0xa9e3e905); 
  GG(d,0xfcefa3f8); 
  GG(c,0x676f02d9); 
  GG(b,0x8d2a4c8a); 
 
 
  HH(a,0xfffa3942); 
  HH(d,0x8771f681); 
  HH(c,0x6d9d6122); 
  HH(b,0xfde5380c); 
  HH(a,0xa4beea44); 
  HH(d,0x4bdecfa9); 
  HH(c,0xf6bb4b60); 
  HH(b,0xbebfbc70); 
  HH(a,0x289b7ec6); 
  HH(d,0xeaa127fa); 
  HH(c,0xd4ef3085); 
  HH(b,0x4881d05); 
  HH(a,0xd9d4d039); 
  HH(d,0xe6db99e5); 
  HH(c,0x1fa27cf8); 
  HH(b,0xc4ac5665); 
 
 
  II(a,0xf4292244); 
  II(d,0x432aff97); 
  II(c,0xab9423a7); 
  II(b,0xfc93a039); 
  II(a,0x655b59c3); 
  II(d,0x8f0ccc92); 
  II(c,0xffeff47d); 
  II(b,0x85845dd1); 
  II(a,0x6fa87e4f); 
  II(d,0xfe2ce6e0); 
  II(c,0xa3014314); 
  II(b,0x4e0811a1); 
  II(a,0xf7537e82); 
  II(d,0xbd3af235); 
  II(c,0x2ad7d2bb); 
  II(b,0xeb86d391); 
  state[0] += a; 
  state[1] += b; 
  state[2] += c; 
  state[3] += d; 
} 

MD5算法的调用测试:

int _tmain(int argc,_TCHAR* argv[]) 
{ 
 
  int i; 
  unsigned char encrypt[] = "admin";//21232f297a57a5a743894a0e4a801fc3  
  unsigned char decrypt[16]; 
 
  MD5_CTX md5; 
 
  MD5Init(&md5); 
  MD5Update(&md5,encrypt,strlen((char *)encrypt)); 
  MD5Final(&md5,decrypt); 
 
  //Md5加密后的32位结果 
  printf("加密前:%sn加密后16位:",encrypt); 
  for (i = 4; i<12; i++) 
  { 
    printf("%02x",decrypt[i]);  
  } 
 
  //Md5加密后的32位结果 
  printf("n加密前:%sn加密后32位:",encrypt); 
  for (i = 0; i<16; i++) 
  { 
    printf("%02x",decrypt[i]);  
  } 
 
  getchar(); 
 
  return 0; 
}

上面的代码工程的下载地址:Md5Demo201707.zip

破解MD5加密的网址:http://www.cmd5.com/

感谢链接:
http://blog.sina.com.cn/s/blog_693de6100101kcu6.html

https://github.com/JieweiWei/md5

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读