# MD5

MD5属于单向散列算法，加密原理和过程网上都有，再次不再赘述。

# 附上程序源码

``````程序的加密函数：
``````
``````/*-------------------------------------------------------------*/
/* MD5Hash － MD5计算主函数                                    */
/*-------------------------------------------------------------*/
BOOL CheckSerial(HWND hWnd)
{
MD5_CTX context;
long dtLength,lsLength;
int i;
TCHAR szName[MAXINPUTLEN]={0};
TCHAR szHash[MAXINPUTLEN]={0};
TCHAR szBuffer[MAXINPUTLEN]={0};
TCHAR szSerial[MAXINPUTLEN]={0};
TCHAR szTeam[]="www.pediy.com";
TCHAR szSNtemp[20]={0};
TCHAR szBase32[]="23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
unsigned int tcTemp=0;

dtLength=GetDlgItemText(hWnd, IDC_Name, szName, sizeof(szName)/sizeof(TCHAR)+1);
if (dtLength==0)
{
SetDlgItemText(hWnd, IDC_Serial, "Wrong Serial!");
return FALSE;
}
lsLength=GetDlgItemText(hWnd,IDC_Serial,szSerial,sizeof(szSerial)/sizeof(TCHAR)+1);
if (lsLength!=19)
{
SetDlgItemText(hWnd,IDC_Serial,"Wrong Serial!");
return FALSE;
}
if ((szSerial[4]!='-')||(szSerial[9]!='-')||(szSerial[14]!='-'))
{
SetDlgItemText(hWnd,IDC_Serial,"Wrong Serial!");
return FALSE;
}
memcpy(szSNtemp,szSerial,4);
memcpy((szSNtemp+4),(szSerial+5),4);
memcpy((szSNtemp+8),(szSerial+10),4);
memcpy((szSNtemp+12),(szSerial+15),4);
MD5Init(&context);
MD5Update(&context,szName,dtLength);
MD5Update(&context,szTeam,lstrlen(szTeam));
MD5Final(szHash, &context);

for(i=0;i<16;i++)
{
tcTemp=(unsigned int)szHash[i]%32;
szBuffer[i]=szBase32[tcTemp];
}
if (lstrcmp(szSNtemp,szBuffer)==0)
{
SetDlgItemText(hWnd,IDC_Serial,"Success!");
return TRUE;
}
else
{
SetDlgItemText(hWnd,IDC_Serial,"Wrong Serial!");
return FALSE;
}
return TRUE;
}
``````
``````注册机解密函数：
``````
``````/*-------------------------------------------------------------*/
/* MD5Hash － MD5计算主函数                                    */
/*-------------------------------------------------------------*/
BOOL GenerateSerial(HWND hWnd)
{
MD5_CTX context;
long dtLength;
int i;
TCHAR szName[MAXINPUTLEN]={0};
TCHAR szHash[MAXINPUTLEN]={0};
TCHAR szBuffer[MAXINPUTLEN]={0};
TCHAR szTeam[]="www.pediy.com";
TCHAR szBase32[]="23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
TCHAR szSerial[20]={0};

unsigned int tcTemp=0;

dtLength=GetDlgItemText(hWnd, IDC_Name, szName, sizeof(szName)/sizeof(TCHAR)+1);
if (dtLength==0)
{
return FALSE;
}
MD5Init(&context);
MD5Update(&context, szName, dtLength);
MD5Update(&context,szTeam,lstrlen(szTeam));
MD5Final(szHash, &context);

for(i=0;i<16;i++)
{
tcTemp=(unsigned int)szHash[i]%32;
szBuffer[i]=szBase32[tcTemp];
}

memcpy(szSerial,szBuffer,4);
szSerial[4]='-';
memcpy((szSerial+5),(szBuffer+4),4);
szSerial[9]='-';
memcpy((szSerial+10),(szBuffer+8),4);
szSerial[14]='-';
memcpy((szSerial+15),(szBuffer+12),4);

SetDlgItemText(hWnd, IDC_Serial,szSerial);

return TRUE;
}

``````

# 小结

``````1.楼主笔记而已，不严谨之处可以指出。
2.大概这个寒假还会慢慢写233，可以一起学习。
3.都看到这里了，不点个赞再走？0.0
``````

THE END

)">