wincrypt.h - źle haszuje?

0

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);
}


0

daj to z #include'ami i jakimś main(), bo tak to nie wiadomo jak to odpalić...

0
Azarien napisał(a):

daj to z #include'ami i jakimś main(), bo tak to nie wiadomo jak to odpalić...

Visual studio
projekt konsolowy z MFC

w zipie są c++ i h które trzeba podmienić w projekcie
i powinno działać

1 użytkowników online, w tym zalogowanych: 0, gości: 1