cześć
hcicałem zobaczyć jak się haszuje pod windowsem - no to zrobiłem sobie klasę, która ma sobie robić hasze
działa - ale dziwnie - tejst zahaszowany jest, ale jak sprawdzam sobie poprzez stronkę z haszowaniem online - wynik jest różny
wie ktoś, co może być nie tak?
Klasę zrobiłem na przykładzie znalezionym w sieci - przerobiłem na std::stringi i pomniejsza drobnica
CHashProvider::CHashProvider(void)
{
InitializeData();
}
CHashProvider::~CHashProvider(void)
{
}
void CHashProvider::InitializeData()
{
m_hProv = NULL;
m_hHash = NULL;
m_pbHash = NULL;
}
HRESULT CHashProvider::HashData(ALG_ID A_algorithmID, const std::string &A_strPlainText, std::string &A_strHashedText)
{
HRESULT hResult = S_OK;
int intError = 0;
DWORD dwDataLen = 0;
DWORD dwLastError = 0;
A_strHashedText.clear();
InitializeData();
if(A_algorithmID != CALG_SHA_256 && A_algorithmID != CALG_MD5)
hResult = E_FAIL;
if(SUCCEEDED(hResult))
{
if((A_algorithmID == CALG_MD5 && CryptAcquireContext(&m_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == false) ||
(A_algorithmID == CALG_SHA_256 && CryptAcquireContext(&m_hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) == false))
hResult = E_FAIL;
}
if(SUCCEEDED(hResult))
{
if(CryptCreateHash(m_hProv, A_algorithmID, 0, 0, &m_hHash) == false)
hResult = E_FAIL;
}
if(SUCCEEDED(hResult))
{
std::wstring wstrNewValue;
wstrNewValue.assign(A_strPlainText.begin(),A_strPlainText.end());
if(CryptHashData(m_hHash, (const BYTE *)(LPCTSTR)(wstrNewValue.c_str()), (wstrNewValue.size())*2, 0) == false)
hResult = E_FAIL;
}
if(SUCCEEDED(hResult))
{
if(CryptGetHashParam(m_hHash, HP_HASHVAL, NULL, &dwDataLen, 0) == false)
hResult = E_FAIL;
}
if(SUCCEEDED(hResult))
{
m_pbHash = (BYTE*)malloc(dwDataLen);
if(m_pbHash == NULL)
hResult = E_FAIL;
}
if(SUCCEEDED(hResult))
{
if(CryptGetHashParam(m_hHash, HP_HASHVAL, m_pbHash, &dwDataLen, 0) == false)
hResult = E_FAIL;
}
if(SUCCEEDED(hResult))
hResult = FormatData(m_pbHash, dwDataLen, A_strHashedText);
if(FAILED(hResult))
{
dwLastError = GetLastError();
}
FreeResources();
return hResult;
}
HRESULT CHashProvider::FormatData(PBYTE A_pbHash, DWORD A_dwDataLen, std::string &A_strHashedText)
{
HRESULT hResult = S_OK;
static const int BUFFER_SIZE = 256;
TCHAR rstData[BUFFER_SIZE]= {0};
TCHAR tmpBuffer[3] = {0};
if(A_pbHash == NULL || A_dwDataLen <= 0)
hResult = E_FAIL;
for(DWORD i = 0 ; SUCCEEDED(hResult) && i < A_dwDataLen ; ++i)
{
tmpBuffer[0] = 0;
tmpBuffer[1] = 0;
tmpBuffer[2] = 0;
_stprintf_s(tmpBuffer, _T("%2.2x"), A_pbHash[i]);
_tcscat_s(rstData, tmpBuffer);
}
if(SUCCEEDED(hResult))
{
std::wstring strArr_w(rstData);
A_strHashedText.assign(strArr_w.begin(), strArr_w.end());
}
return hResult;
}
void CHashProvider::FreeResources()
{
if(m_hHash)
CryptDestroyHash(m_hHash);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(m_pbHash)
free(m_pbHash);
}