Как вычисленный MD5 файла сравнить с известным?

Задача: подтвердить целостность файла в проекте. Для этого вычисляется MD5 файла, далее вычисленное значение подразумевается сравнить с известным значением, и в результате выносится вердикт в виде сообщения ShowMessage. Приведенный фрагмент кода реализует вычисление MD5 и выведение результата (для тестов) на консоль. С этим всё в порядке - отображаемое в консоли значение хэша правильное. Продвинуться же далее до ShowMessage пока не получается. Алгоритм вроде должен быть такой: в буфер заносится массив, вычисляемый в цикле, и далее преобразуется в AnsiString. Реализовать этот пробел в коде не удаётся никак: или ошибки, или AnsiString = NULL. Прошу помочь.

#include <vcl.h>
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
    
#define BUFSIZE 1024
#define MD5LEN  16

 using namespace std;

 BOOL f = AllocConsole();

 CHAR *FileName = "File.bin";

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{
    DWORD dwStatus = 0;
    BOOL bResult = FALSE;
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    HANDLE hFile = NULL;
    BYTE rgbFile[BUFSIZE];
    DWORD cbRead = 0;
    BYTE rgbHash[MD5LEN];
    DWORD cbHash = 0;
    CHAR rgbDigits[] = "0123456789abcdef";

    LPCWSTR filename=L"FileName";

    hFile = CreateFile(FileName,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_SEQUENTIAL_SCAN,
        NULL);

    CryptAcquireContext(&hProv,
        NULL,
        NULL,
        PROV_RSA_FULL,
        CRYPT_VERIFYCONTEXT);

    CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);

    while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL))
     {
       if (cbRead == 0)
        {
          break;
        }
    CryptHashData(hHash, rgbFile, cbRead, 0);
    }

    cbHash = MD5LEN;

    CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0);

        freopen("CONIN$", "r", stdin);
        freopen("CONOUT$", "w", stdout);

        printf("MD5 hash of file %s is: ", FileName);
        for (DWORD i = 0; i < cbHash; i++)
        {
            printf("%c%c", rgbDigits[rgbHash[i] >> 4],
            rgbDigits[rgbHash[i] & 0xf]);
        }
            printf("\n");

                             // We have added the code for the implementation of the comparison.

           AnsiString AStr;
           if (AStr != "16DF3988591796F39E3D5E947D8039C9")
                 {
                   ShowMessage("FAKE!!!");
                   return 0;
                 }

       system("pause");
}
    

Ответы (1 шт):

Автор решения: ChVL

@eanmos Всё в порядке, допилил. Огромное Вам спасибо за наводку! Основные изменения: функции буфера должны быть такие: buffer[i2] = (rgbDigits[rgbHash[i] >> 4]); и buffer[i2+1] = (rgbDigits[rgbHash[i] & 0xf]); В результате имеем 100%-но рабочий вариант кода для вычисления MD5 файла, сравнения вычисленного значения с известным и вывод результата сравнения на экран. Может кому в хозяйстве пригодится. Вопрос решён.

→ Ссылка