C語言 使用Cryptdll計算檔案md5值

阿達L發表於2020-11-28
typedef struct {
    ULONG i[2];
    ULONG buf[4];
    unsigned char in[64];
    unsigned char digest[16];
} MD5_CTX;

//定義函式指標
typedef void (WINAPI* PMD5Init)(MD5_CTX* context);
typedef void (WINAPI* PMD5Final)(MD5_CTX* context);
typedef void (WINAPI* PMD5Update)(MD5_CTX* context, const unsigned char* input, unsigned int inlen);

void GetFileMD5(CString fileName, LPWSTR strBuf)
{ 

    FILE* ff;
    unsigned long nSize = 1024;
    char* rBuff = (char*)malloc(sizeof(char) * nSize);
    unsigned long rCount = 0;
    MD5_CTX context;

    //載入微軟提供MD5計算的dll檔案
    HMODULE hdll = LoadLibrary(L"Cryptdll.dll");
    PMD5Init m_pFuncMD5Init = NULL;
    PMD5Final m_pFuncMD5Final = NULL;
    PMD5Update m_pFuncMD5Update = NULL;

    if (hdll == NULL)
    {
        printf("load dll Cryptdll faild\n");
        exit(1);
    }
    //獲得相應的函式地址
    m_pFuncMD5Init = (PMD5Init)GetProcAddress(hdll, "MD5Init");
    m_pFuncMD5Final = (PMD5Final)GetProcAddress(hdll, "MD5Final");
    m_pFuncMD5Update = (PMD5Update)GetProcAddress(hdll, "MD5Update");

    if (!(m_pFuncMD5Update && m_pFuncMD5Init && m_pFuncMD5Final))
    {
        FreeLibrary(hdll);
        printf("get function faild\n");
        exit(2);
    }

    //初始化context
    ZeroMemory(&context, sizeof(MD5_CTX));
    m_pFuncMD5Init(&context);

    //開啟一個測試檔案
    if (!(ff = _wfopen(fileName, L"rb")))
    {
        printf("open file faild\n");
        exit(3);
    }


    while (rCount = fread(rBuff, sizeof(char), nSize, ff))
    {
        m_pFuncMD5Update(&context, (const unsigned char*)rBuff, rCount);
    }
    m_pFuncMD5Final(&context);
    //此處下斷點,除錯狀態從Watch中檢視cnotext.digest域為檔案MD5值


    //for (int i = 0; i < 16; i++)
    //{
    //    printf("%X", context.digest[i]);
    //}

    WCHAR pbuf[32];

    for (int i = 0; i < 16; i++)
    {
        swprintf(pbuf, 32, L"%02X", context.digest[i]);
        //sprintf(pbuf, "%X", context.digest[i]);
        wcsncat(strBuf, pbuf, 33);
        //wcsncat_s(strBuf, 32, pbuf, 2);

    }

    //printf("%s", strBuf);
    fclose(ff);
    free(rBuff);
}

 

相關文章