ورود

View Full Version : MD5 در MFC



cardano7
سه شنبه 07 دی 1389, 14:58 عصر
سلام
من می خواهم در MFC یک جمله را با MD5 یا یکی دو الگوریتم دیگه(بسته به سلیقه ی کاربر) هش کنم.
متاسفانه کدهایی که برای هش MD5 در VC++ پیدا کردم خیلی گنگ و مبهم بود. خود MSDN هم خیلی بد توضیح داده و بعد از کلی سر در گمی و کلی کد که هیچ کدوم کار نمی کنند، آخرش کار به اینجا می رسه که از اسرار جهان هیچ نمی دانیم.
ختم کلام اینکه دنبال چند خط کد ساده می گردم که یک جمله را با MD5 برام هش کنه. کار ساده یی هست. اما ...

ممنون


----------------------------------------------
حل شد:



void CMy11MFC_HashDlg::OnBnClickedBtnConvert()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
ALG_ID hash_algorithm;
switch(m_HashAlgorithm)
{
case 0:
hash_algorithm=CALG_MD2;
break;
case 1:
hash_algorithm=CALG_MD4;
break;
case 2:
hash_algorithm=CALG_MD5;
break;
case 3:
hash_algorithm=CALG_SHA;
break;
case 4:
hash_algorithm=CALG_SHA1;
break;
}
LPTSTR text=m_Text.GetBuffer(0);
LPTSTR hash=new TCHAR[40];
HashText(text,hash,hash_algorithm);
m_Hash.Format(_T("%s"),hash);
m_Text.ReleaseBuffer();
free(hash);
UpdateData(false);
}

void CMy11MFC_HashDlg::HashText(LPTSTR text_w,LPTSTR Hashed, int Algorithm)
{
const int max_text_length=100;
LPCSTR text_c;
CString _tmpstr=text_w;
DWORD cbContent= _tmpstr.GetLength();
CString m_digest_edit;
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE bHash[0x7f];
DWORD dwHashLen= 16;
BYTE pbContent[max_text_length];
for(int i=0;i<=cbContent;i++)
pbContent[i]=(BYTE)text_w[i];
CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET);
CryptCreateHash(hCryptProv, Algorithm, 0, 0, &hHash);
CryptHashData(hHash, pbContent, cbContent, 0);
CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0);
m_digest_edit.Empty();
CString tmp;
for (int i = 0; i<16; i++)
{
tmp.Format(_T("%02x"), bHash[i]);
m_digest_edit+=tmp;
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
LPTSTR lptszStr_digest = m_digest_edit.GetBuffer(0);
m_digest_edit.ReleaseBuffer();
lstrcpy(Hashed,lptszStr_digest);
}