lundi 28 janvier 2013

CRC32 and MD5 hash c++


//CRC32
static DWORD crc32table[256];
static bool crc32Intalized;

DWORD crc32Hash(const void *data, DWORD size);


DWORD Crypt::crc32Hash(const void *data, DWORD size)
{
  if(crc32Intalized == false)
  {
    register DWORD crc;
    for(register DWORD i = 0; i < 256; i++)
    {
      crc = i;
      for(register DWORD j = 8; j > 0; j--)
      {
        if(crc & 0x1)crc = (crc >> 1) ^ 0xEDB88320L;
        else crc >>= 1;
      }
      crc32table[i] = crc;
    }

    crc32Intalized = true;
  }

  register DWORD cc = 0xFFFFFFFF;
  for(register DWORD i = 0; i < size; i++)cc = (cc >> 8) ^ crc32table[(((LPBYTE)data)[i] ^ cc) & 0xFF];
  return ~cc;
}

//MD5
#define MD5HASH_SIZE 16

  bool _md5Hash(LPBYTE output, void *inputData, DWORD dataSize);

bool Crypt::_md5Hash(LPBYTE output, void *inputData, DWORD dataSize)
{
  bool r = false;
  HCRYPTPROV hashProv;

  if(CWA(advapi32, CryptAcquireContextW)(&hashProv, NULL, NULL, PROV_RSA_FULL /*Èìåííî ýòî çíà÷åíèå, íå êàêîãî èíîãî.*/, CRYPT_VERIFYCONTEXT | CRYPT_SILENT) != FALSE)
  {
    HCRYPTHASH hashHandle;
    if(CWA(advapi32, CryptCreateHash)(hashProv, CALG_MD5, 0, 0, &hashHandle) == TRUE)
    {
      DWORD hashLen = MD5HASH_SIZE;
      if(CWA(advapi32, CryptHashData)(hashHandle, (LPBYTE)inputData, dataSize, 0) == TRUE && CWA(advapi32, CryptGetHashParam)(hashHandle, HP_HASHVAL, output, &hashLen, 0) == TRUE && hashLen == MD5HASH_SIZE)r = true;
      CWA(advapi32, CryptDestroyHash)(hashHandle);
    }
    CWA(advapi32, CryptReleaseContext)(hashProv, 0);
  }

  return r;
}

Aucun commentaire:

Enregistrer un commentaire