ali.2566
یک شنبه 08 شهریور 1388, 09:55 صبح
سلام
حدود 30 دقيقه است دارم تو گوگل و برنامه نويس جستجو ميكنم ولي نتونستم به جواب برسم.
من ميخوام تو MFC برنامه اي بنويسم كه از يك كادر ويرايش يك String رو دريافت كرده و در كادر ديگر hash شده اون رو به MD5 نمايش بده.
اگه براتون امكانش هست library هاي لازم براي MD5 در C++ (واسه دلفي پيدا كردم ولي C++ هيچ جا نيست :عصبانی++: ) رو اينجا بزاريد.
يه توضيح كوچيك هم در مورد چگونگي hash كردن به روشي كه در بالا گفتم بديد بسيار بسيار ممنون ميشم :خجالت:
با تشكر
Nima_NF
یک شنبه 08 شهریور 1388, 12:42 عصر
برای این کار در ویندوز باید از CryptoAPI استفاده کنید:
http://msdn.microsoft.com/en-us/library/aa380252(VS.85).aspx (http://msdn.microsoft.com/en-us/library/aa380252%28VS.85%29.aspx)
نمونه مثال ها و مقالات:
http://www.codeguru.com/cpp/misc/misc/cryptoapi/
ضمنا می توانید از ++CryptoC نیز که یک پروژه متن باز ++C هست برای همه سیستم عامل ها استفاده کنید:
http://www.cryptopp.com/
ali.2566
یک شنبه 08 شهریور 1388, 20:48 عصر
نيما جان واقعا ممنون اما من چيزي كه دنبالش بودم بين اينا پيدا نكردم، اگه براتون امكانش هست به اين مبتدي كمك كنيد و يك پروژه كه يك رشته رو به md5 هش ميكنه اينجا قرار بديد.
واقعا ممنونم
Nima_NF
یک شنبه 08 شهریور 1388, 23:42 عصر
با وجود این همه مثال و منبع که لیست شد، عجیب هست که آن ها را مطالعه نکردید!
در هر حال کپی برابر اصل از این لینک (http://www.codeguru.com/cpp/misc/misc/cryptoapi/article.php/c401/):
BOOL SavePasswordToRegistry(TCHAR* szPassword)
{
BOOL bResult = TRUE;
TCHAR szKey[256];
HKEY hRegKey = NULL;
_tcscpy(szKey, _T("SOFTWARE\\Your Company\\Your Program\\"));
if (RegCreateKey(HKEY_CURRENT_USER, szKey, &hRegKey) != ERROR_SUCCESS)
return FALSE;
HCRYPTPROV hProv = NULL;
HCRYPTKEY hKey = NULL;
HCRYPTKEY hXchgKey = NULL;
HCRYPTHASH hHash = NULL;
DWORD dwLength;
// Used to encrypt the real password
TCHAR szLocalPassword[] = _T("Mz6@a0i*");
// Get handle to user default provider.
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
// Create hash object.
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Hash password string.
dwLength = sizeof(TCHAR)*_tcslen(szLocalPassword);
if (CryptHashData(hHash, (BYTE *)szLocalPassword, dwLength, 0))
{
// Create block cipher session key based on hash of the password.
if (CryptDeriveKey(hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey))
{
// Determine number of bytes to encrypt at a time.
dwLength = sizeof(TCHAR)*_tcslen(szPassword);
// Allocate memory.
BYTE *pbBuffer = (BYTE *)malloc(dwLength);
if (pbBuffer != NULL)
{
memcpy(pbBuffer, szPassword, dwLength);
// Encrypt data
if (CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwLength, dwLength))
{
// Write data to registry.
DWORD dwType = REG_BINARY;
// Add the password.
if (::RegSetValueEx(hRegKey, _T("Password"), 0, REG_BINARY, pbBuffer, dwLength)!=ERROR_SUCCESS)
{
bResult = FALSE;
}
::RegCloseKey(hRegKey);
}
else
{
bResult = FALSE;
}
// Free memory.
free(pbBuffer);
}
else
{
bResult = FALSE;
}
CryptDestroyKey(hKey); // Release provider handle.
}
else
{
// Error during CryptDeriveKey!
bResult = FALSE;
}
}
else
{
// Error during CryptHashData!
bResult = FALSE;
}
CryptDestroyHash(hHash); // Destroy session key.
}
else
{
// Error during CryptCreateHash!
bResult = FALSE;
}
CryptReleaseContext(hProv, 0);
}
در مثال فوق یک رشته از ورودی دریافت می شود و با MD5 کار انجام می شود، پارامتر دوم CryptCreateHash الگوریتم را تعیین می کند.
شما به سایر بخش ها و به قسمت های کار با رجیستری توجهی نکنید.
پس با این توابع:
CryptAcquireContext
CryptCreateHash
CryptHashData
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.