C:
/*
Описание:
Функция хеширует ANSI строку по алгоритму MD5, на выходе выдавая хеш в представлении UNICODE строки.
Параметры:
LPWSTR lpDestination - буффер, в который будет передана строка с хешем.
LPSTR lpString - ANSI строка, которую требуется хешировать.
Завершение:
При завершении функция возвращает результат её исполнения в виде переменной типа bool.
*/
bool MD5(LPWSTR lpDestination, LPSTR lpString)
{
bool bRet = false;
WCHAR wszHash[MD5_MAX_LENGTH + 1] = { 0 };
BYTE bHash[MD5_MAX_LENGTH / 2] = { 0 };
DWORD dwDataLength = MD5_MAX_LENGTH;
LPWSTR lpCharList = L"0123456789abcdef";
LPWSTR lpFormat = L"%c%c";
do
{
if (!CryptCreateHash(hProv, CALG_MD5, NULL, 0, &hHash))
{
#ifdef __DEBUG
DebugMessage(L"Crypt::MD5() - can't create hash.");
#endif
break;
}
if (!CryptHashData(hHash, (LPBYTE)lpString, StringUtils::StringLengthA(lpString), 0))
{
#ifdef __DEBUG
DebugMessage(L"Crypt::MD5() - can't hash data.");
#endif
break;
}
if (!CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwDataLength, 0))
{
#ifdef __DEBUG
DebugMessage(L"Crypt::MD5() - can't get hash value.");
#endif
break;
}
for (int i = 0; i < dwDataLength; i++)
{
WCHAR wszHashPart[3] = { 0 };
if (!wsprintfW(wszHashPart, lpFormat, lpCharList[bHash[i] >> 4], lpCharList[bHash[i] & 0xf]))
{
#ifdef __DEBUG
DebugMessage(L"Crypt::MD5() - can't format hash part.");
#endif
break;
}
StringUtils::StringAppendW(wszHash, wszHashPart);
}
wszHash[MD5_MAX_LENGTH + 1] = 0;
bRet = true;
} while (false);
StringUtils::StringCopyW(lpDestination, wszHash);
return bRet;
}
Последнее редактирование: