C/C++ MD5算法的实现代码
发布时间:2020-12-30 14:37:15 所属栏目:创业 来源:网络整理
导读:在逆向程序的时候,经常会碰到加密的算法的问题,前面分析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/ 感谢链接: https://github.com/JieweiWei/md5 (编辑:广西网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐