0

下にあるMD5ハッシュを使用するアプリケーションを実装しようとしていますが、インターネットからMD5ハッシュプログラムを取得しましたが、プログラム(Cで記述されたプログラム)から計算するプログラムに文字列を渡す方法がわかりません。 MD5ハッシュ。

これは、MD5ハッシュを計算するプログラムのメインです。

//
// MD5 Hashing Example - Using Windows Crypto API
//
// by Napalm @ NetCore2K
//
#include <stdio.h>
#include <string.h>
#include "winmd5.h"
HCRYPTPROV hCryptProv;

int main(int argc, char *argv[])
{
    int i;
    CryptStartup();
    if(argc > 1){
        MD5Context ctx;
        MD5Init(&ctx);
        MD5Update(&ctx, (unsigned char *)argv[1], strlen(argv[1]));
        MD5Final(&ctx);
        for(i = 0; i < 16; i++)
            printf("%02x", ctx.digest[i]);
        printf("\n");
    }else
        printf("Usage: %s <string>\n", argv[0]);
    CryptCleanup();
    return 0;
}

これはヘッダーファイルの内容です。

//
// MD5 Hashing Example - Using Windows Crypto API
//
// by Napalm @ NetCore2K
//
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern HCRYPTPROV hCryptProv;

void PrintMD5(const char *);

typedef struct {

unsigned char digest[16];
unsigned long hHash;
} MD5Context;
BOOL CryptStartup()
{


if(CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) == 0){
    if(GetLastError() == NTE_EXISTS){
    if(CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) == 0){
            return FALSE;
        }   
    }
    else return FALSE;
}
return TRUE;
}
void CryptCleanup()
{
if(hCryptProv) CryptReleaseContext(hCryptProv, 0);
hCryptProv = NULL;
}
void inline MD5Init(MD5Context *ctx)
{ 
CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &ctx->hHash);
}
void inline MD5Update(MD5Context *ctx, unsigned char const *buf, unsigned len)
{
CryptHashData(ctx->hHash, buf, len, 0);
}
void inline MD5Final(MD5Context *ctx)
{
DWORD dwCount = 16;
CryptGetHashParam(ctx->hHash, HP_HASHVAL, ctx->digest, &dwCount, 0);
if(ctx->hHash) CryptDestroyHash(ctx->hHash);
ctx->hHash = 0;
}
void PrintMD5(const char *s)
{
MD5Context ctx;
MD5Init(&ctx);
MD5Update(&ctx, (const unsigned char *)s, strlen(s));
MD5Final(&ctx);

int i;
for (i = 0; i < 16; i++) {
    printf("%02x", ctx.hHash[i]);
}

printf("\n");
 }

このMain()をどのように呼び出す必要があり、文字列をそれに渡して結果を取得する方法は?前もって感謝します。

よろしく

4

1 に答える 1

0

二度と電話しないでくださいmain()。むしろ、このプログラムを例として使用して、次のような別の関数を記述します。

void PrintMD5(const char *s)
{
    MD5Context ctx;
    MD5Init(&ctx);
    MD5Update(&ctx, (const unsigned char *)s, strlen(s));
    MD5Final(&ctx);

    int i;
    for (i = 0; i < 16; i++) {
        printf("%02x", ctx.digest[i]);
    }

    printf("\n");
}

次に、次のような独自のプログラムからこれを呼び出すことができます。

PrintMD5("FooBarHelloWorld42");
于 2013-01-26T20:17:36.153 に答える