📄 md5.cpp
字号:
// MD5.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "MD5.h"
#include <string.h>
#define MAX_SIZE 9
char str[MAX_SIZE];
typedef unsigned long ulong;
typedef unsigned uint;
typedef unsigned char uchar;
#define F(x,y,z) ((x&y)|((~x)&z))
#define G(x,y,z) ((x&z)|(y&(~z)))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y^(x|(~z)))
#define ROL(a,b,c,d,m,s,t) (((a+F(b,c,d)+m+t)<<s)+((a+F(b,c,d)+m+t)>>(32-s)))
#define FF(a,b,c,d,m,s,t) a = b+ROL(a,b,c,d,m,s,t)
#define GG(a,b,c,d,m,s,t) a = b+ROL(a,b,c,d,m,s,t)
#define HH(a,b,c,d,m,s,t) a = b+ROL(a,b,c,d,m,s,t)
#define II(a,b,c,d,m,s,t) a = b+ROL(a,b,c,d,m,s,t)
struct md5_state{
ulong Blen,blen[2];
ulong state[4];
uchar buf[17];
uint blocknum;
ulong Block[16][16];
};
static const uint m_val[64] = {
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9};
static const uint s_val[64] = {
7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,
6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21};
static const ulong t_val[64] = {
0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,
0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3d905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};
static const char st[37] = "0123456789abcdefghijklmnopqrstuvwxyz";
void md5_Preprocess(uchar *lpin, md5_state *md)
{
ulong len;
uint i = 0,j = 0,k = 0;
uchar * lpstring;
lpstring = lpin;
for(len=0;*lpstring!='\0';lpstring++) len++;
md->Blen = len;
md->blen[0] = len>>29;
md->blen[1] = len<<3;
j = len%64;
if(j<56){
lpin[len] = 128;
for(i=1;i<56-j;i++)
lpin[len+i] = 0;
}
if(j>56){
lpin[len] = 128;
for(i=1;i<120-j;i++)
lpin[len+i] = 0;
}
len +=i;
md->blocknum = len/64+1;
for(i=0;i<md->blocknum-1;i++)
for(j=0;j<16;j++)
for(k=0;k<4;k++){
md->Block[i][j] = md->Block[i][j]<<8;
md->Block[i][j] += *lpin;
lpin++;
}
for(j=0;j<14;j++)
for(k=0;k<4;k++){
md->Block[i][j] = md->Block[i][j]<<8;
md->Block[i][j] += *lpin;
lpin++;
}
md->Block[i][j] = md->blen[0];
md->Block[i][j+1] = md->blen[1];
md->state[0] = 0x01234567;
md->state[1] = 0x89abcdef;
md->state[2] = 0xfedcba98;
md->state[3] = 0x76543210;
}
void md5_Hash(md5_state *md)
{
ulong a,b,c,d,temp;
uint i,j;
for(i=0;i<md->blocknum;i++){
a = md->state[0];
b = md->state[1];
c = md->state[2];
d = md->state[3];
for(j=0;j<16;j++){
FF(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
temp = d;
d = c;
c = b;
b = a;
a = temp;
}
for(;j<32;j++){
GG(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
temp = d;
d = c;
c = b;
b = a;
a = temp;
}
for(;j<48;j++){
HH(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
temp = d;
d = c;
c = b;
b = a;
a = temp;
}
for(;j<64;j++){
II(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
temp = d;
d = c;
c = b;
b = a;
a = temp;
}
md->state[0] += a;
md->state[1] += b;
md->state[2] += c;
md->state[3] += d;
memset(md->buf,0,64);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
md->buf[4*i+j] = (uchar)((md->state[i]>>(24-8*j))&0x000000ff);
md->buf[16] = '\0';
}
bool ft = false;
md5_state md_cm;
void codestruct(char *str,int n ,md5_state * md)
{
int i;
if( ft == true || n == 0) return ;
for(i=0;i< 36;i++){
if( ft == TRUE )
return;
str[n-1] = st[i];
codestruct(str,n-1,md);
if(n == 1){
str[strlen(str)] = '\0';
md5_Preprocess((uchar *)str,&md_cm);
md5_Hash(&md_cm);
str[strlen(str)-1] = '\0';
if( strcmp((const char*)md_cm.buf,(const char*)md->buf) == 0 ){
ft = true;
return ;
}
continue;
}
}
}
void md5_Decode(char str[MAX_SIZE],md5_state * md)
{
int i;
ft = FALSE;
memset(str,0,MAX_SIZE);
for(i=1;i<MAX_SIZE;i++)
{
if(!ft)
codestruct(str,i,md);
else
break;
}
}
static md5_state md;
HWND hDlg;
DWORD worker(LPVOID lp)
{
md5_Decode(str,&md);
SetDlgItemText(hDlg,IDC_RRESULT,str);
return 0;
}
INT_PTR CALLBACK DialogProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
char in[1024];
char buff[1024];
int i = 0;
HANDLE hThread = INVALID_HANDLE_VALUE;
switch(uMsg){
case WM_INITDIALOG:
hDlg = hwndDlg;
SetDlgItemText(hwndDlg,IDC_DATA,"hello");
break;
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDC_BUTTON_ENCODE:
memset(in,0,1024);
GetDlgItemText(hwndDlg,IDC_DATA,in,1024);
in[strlen(in)] = '\0';
md5_Preprocess((uchar *)in,&md);
md5_Hash(&md);
memset(buff,0,1024);
for(i=0;i<16;i++)
wsprintf(&buff[strlen(buff)],"%.2x",md.buf[i]);
SetDlgItemText(hwndDlg,IDC_RESULT,buff);
break;
case IDC_BUTTON_DECODE:
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)worker,NULL,0,NULL);
break;
case IDC_BUTTON_QUIT:
if( INVALID_HANDLE_VALUE != hThread)
{
SuspendThread(hThread);
TerminateThread(hThread,-1);
}
EndDialog(hwndDlg,0);
break;
}
}
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_MD5),NULL,(DLGPROC)DialogProc);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -