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

