📄 md5.cpp
字号:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef unsigned int UINT;
UINT F(UINT X,UINT Y,UINT Z) //f 子函数
{
return (X&Y)|((~X)&Z);
}
UINT G(UINT X,UINT Y,UINT Z) //g 子函数
{
return (X&Z)|(Y&(~Z));
}
UINT H(UINT X,UINT Y,UINT Z) //h 子函数
{
return X^Y^Z;
};
UINT I(UINT X,UINT Y,UINT Z) //i 子函数
{
return Y^(X|(~Z));
}
UINT ROTATE_LEFT(UINT x, UINT s)
{
return ((x << s) | (x >> (32 - s)));
}
void FF(UINT &a, UINT b, UINT c, UINT d, UINT mj, UINT s, UINT ti)
{
a += F(b, c, d) + mj + ti;
a = ROTATE_LEFT(a, s);
a += b;
}
void GG(UINT &a, UINT b, UINT c, UINT d, UINT mj, UINT s, UINT ti)
{
a += G(b, c, d) + mj + ti;
a = ROTATE_LEFT(a, s);
a += b;
}
void HH(UINT &a, UINT b, UINT c, UINT d, UINT mj, UINT s, UINT ti)
{
a += H(b, c, d) + mj + ti;
a = ROTATE_LEFT(a, s);
a += b;
}
void II(UINT &a, UINT b, UINT c, UINT d, UINT mj, UINT s, UINT ti)
{
a += I(b, c, d) + mj + ti;
a = ROTATE_LEFT(a, s);
a += b;
}
// 处理一个512 bit 分组, 64字节.被分成16个子分组,每个分组32 bit;
void block_transform(UINT &a, UINT &b, UINT &c, UINT &d, UINT messageGroup[16])
{
FF(a, b, c, d, messageGroup[ 0], 7, 0xd76aa478);
FF(d, a, b, c, messageGroup[ 1], 12, 0xe8c7b756);
FF(c, d, a, b, messageGroup[ 2], 17, 0x242070db);
FF(b, c, d, a, messageGroup[ 3], 22, 0xc1bdceee);
FF(a, b, c, d, messageGroup[ 4], 7, 0xf57c0faf);
FF(d, a, b, c, messageGroup[ 5], 12, 0x4787c62a);
FF(c, d, a, b, messageGroup[ 6], 17, 0xa8304613);
FF(b, c, d, a, messageGroup[ 7], 22, 0xfd469501);
FF(a, b, c, d, messageGroup[ 8], 7, 0x698098d8);
FF(d, a, b, c, messageGroup[ 9], 12, 0x8b44f7af);
FF(c, d, a, b, messageGroup[10], 17, 0xffff5bb1);
FF(b, c, d, a, messageGroup[11], 22, 0x895cd7be);
FF(a, b, c, d, messageGroup[12], 7, 0x6b901122);
FF(d, a, b, c, messageGroup[13], 12, 0xfd987193);
FF(c, d, a, b, messageGroup[14], 17, 0xa679438e);
FF(b, c, d, a, messageGroup[15], 22, 0x49b40821);
GG(a, b, c, d, messageGroup[ 1], 5, 0xf61e2562);
GG(d, a, b, c, messageGroup[ 6], 9, 0xc040b340);
GG(c, d, a, b, messageGroup[11], 14, 0x265e5a51);
GG(b, c, d, a, messageGroup[ 0], 20, 0xe9b6c7aa);
GG(a, b, c, d, messageGroup[ 5], 5, 0xd62f105d);
GG(d, a, b, c, messageGroup[10], 9, 0x02441453);
GG(c, d, a, b, messageGroup[15], 14, 0xd8a1e681);
GG(b, c, d, a, messageGroup[ 4], 20, 0xe7d3fbc8);
GG(a, b, c, d, messageGroup[ 9], 5, 0x21e1cde6);
GG(d, a, b, c, messageGroup[14], 9, 0xc33707d6);
GG(c, d, a, b, messageGroup[ 3], 14, 0xf4d50d87);
GG(b, c, d, a, messageGroup[ 8], 20, 0x455a14ed);
GG(a, b, c, d, messageGroup[13], 5, 0xa9e3e905);
GG(d, a, b, c, messageGroup[ 2], 9, 0xfcefa3f8);
GG(c, d, a, b, messageGroup[ 7], 14, 0x676f02d9);
GG(b, c, d, a, messageGroup[12], 20, 0x8d2a4c8a);
HH(a, b, c, d, messageGroup[ 5], 4, 0xfffa3942);
HH(d, a, b, c, messageGroup[ 8], 11, 0x8771f681);
HH(c, d, a, b, messageGroup[11], 16, 0x6d9d6122);
HH(b, c, d, a, messageGroup[14], 23, 0xfde5380c);
HH(a, b, c, d, messageGroup[ 1], 4, 0xa4beea44);
HH(d, a, b, c, messageGroup[ 4], 11, 0x4bdecfa9);
HH(c, d, a, b, messageGroup[ 7], 16, 0xf6bb4b60);
HH(b, c, d, a, messageGroup[10], 23, 0xbebfbc70);
HH(a, b, c, d, messageGroup[13], 4, 0x289b7ec6);
HH(d, a, b, c, messageGroup[ 0], 11, 0xeaa127fa);
HH(c, d, a, b, messageGroup[ 3], 16, 0xd4ef3085);
HH(b, c, d, a, messageGroup[ 6], 23, 0x04881d05);
HH(a, b, c, d, messageGroup[ 9], 4, 0xd9d4d039);
HH(d, a, b, c, messageGroup[12], 11, 0xe6db99e5);
HH(c, d, a, b, messageGroup[15], 16, 0x1fa27cf8);
HH(b, c, d, a, messageGroup[ 2], 23, 0xc4ac5665);
II(a, b, c, d, messageGroup[ 0], 6, 0xf4292244);
II(d, a, b, c, messageGroup[ 7], 10, 0x432aff97);
II(c, d, a, b, messageGroup[14], 15, 0xab9423a7);
II(b, c, d, a, messageGroup[ 5], 21, 0xfc93a039);
II(a, b, c, d, messageGroup[12], 6, 0x655b59c3);
II(d, a, b, c, messageGroup[ 3], 10, 0x8f0ccc92);
II(c, d, a, b, messageGroup[10], 15, 0xffeff47d);
II(b, c, d, a, messageGroup[ 1], 21, 0x85845dd1);
II(a, b, c, d, messageGroup[ 8], 6, 0x6fa87e4f);
II(d, a, b, c, messageGroup[15], 10, 0xfe2ce6e0);
II(c, d, a, b, messageGroup[ 6], 15, 0xa3014314);
II(b, c, d, a, messageGroup[13], 21, 0x4e0811a1);
II(a, b, c, d, messageGroup[ 4], 6, 0xf7537e82);
II(d, a, b, c, messageGroup[11], 10, 0xbd3af235);
II(c, d, a, b, messageGroup[ 2], 15, 0x2ad7d2bb);
II(b, c, d, a, messageGroup[ 9], 21, 0xeb86d391);
}
char first_encoder[17];
// 散列
void md5_encoder(char *message, UINT len)
{
if(len == 0)
{
len = (UINT)strlen(message);
}
UINT pointer = 0;
UINT save[] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476};
UINT a, b, c, d;
char currentGroup[64];
UINT groupLen;
UINT i = 0;
while(pointer <= len)
{
groupLen = len - pointer;
if(groupLen > 64)
{
groupLen = 64;
}
for(i = 0; i < groupLen; i++)
{
currentGroup[i] = message[pointer + i];
}
pointer += groupLen;
// 填充
if(groupLen < 64)
{
if(groupLen > 0 || len == 0)
{
currentGroup[i] = (char)0x80;
i++;
}
for(; i < 64; i++)
{
currentGroup[i] = 0;
}
if(groupLen < 56)
{
UINT blen = len * 8;
char * p = (char *) & blen;
for(i = 56; i < 60; i++)
{
currentGroup[i] = p[i - 56];
}
pointer = len + 1;
}
}
a = save[0], b = save[1], c = save[2], d = save[3];
block_transform(a, b, c, d, (UINT *)currentGroup);
save[0] += a, save[1] += b, save[2] += c, save[3] += d;
}
memset(first_encoder, 0, 17);
// memcpy(first_encoder, save, 16);
}
void main()
{
char digest[33];
// md5_encoder("", 0);
md5_encoder("jzfcf@hotmail.comias5www",24);
for (int i = 0; i < 16; i = i+2);
{
sprintf(&digest[i], "%02x", first_encoder[i/2]);
}
}
// 98 C9 77 DD CE 43 FB BB 32 55 48 8B DB 4E C1 35
//key
//00
//EB B5 86 54 F1 97 E7 7D 77 F6 93 F9 85 62 A6 82 code
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -