ali.2566
یک شنبه 08 شهریور 1388, 10:55 صبح
سلام
حدود 30 دقيقه است دارم تو گوگل و برنامه نويس جستجو ميكنم ولي نتونستم به جواب برسم.
من ميخوام تو MFC برنامه اي بنويسم كه از يك كادر ويرايش يك String رو دريافت كرده و در كادر ديگر hash شده اون رو به MD5 نمايش بده.
اگه براتون امكانش هست library هاي لازم براي MD5 در C++ (واسه دلفي پيدا كردم ولي C++ هيچ جا نيست :عصبانی++: ) رو اينجا بزاريد. 
يه توضيح كوچيك هم در مورد چگونگي hash كردن به روشي كه در بالا گفتم بديد بسيار بسيار ممنون ميشم :خجالت:
با تشكر
Nima_NF
یک شنبه 08 شهریور 1388, 13: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, 21:48 عصر
نيما جان واقعا ممنون اما من چيزي كه دنبالش بودم بين اينا پيدا نكردم، اگه براتون امكانش هست به اين مبتدي كمك كنيد و يك پروژه كه يك رشته رو به md5 هش ميكنه اينجا قرار بديد.
واقعا ممنونم
Nima_NF
دوشنبه 09 شهریور 1388, 00: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.