Windows API 计算MD5

·

typedef struct {
  ULONG i[2]; /* number of _bits_ handled mod 2^64 */
  ULONG buf[4]; /* scratch buffer */
  unsigned char in[64]; /* input buffer */
  unsigned char digest[16]; /* actual digest after MD5Final call */
} MD5_CTX;

#define MD5DIGESTLEN 16
typedef void(WINAPI* PMD5Init)(MD5_CTX *);
typedef void(WINAPI* PMD5Update)(MD5_CTX *, const unsigned char *,
  unsigned int);
typedef void(WINAPI* PMD5Final)(MD5_CTX *);

BOOL CalcMd5(unsigned char * data, unsigned int len, char *digest)
{
  MD5_CTX  ctx;
  HMODULE  hDLL;
  BOOL    ret = FALSE;

  SecureZeroMemory(digest, MD5DIGESTLEN);
  hDLL = LoadLibraryA("advapi32.dll");
  if (hDLL) {
    PMD5Init MD5Init = (PMD5Init)GetProcAddress(hDLL, "MD5Init");
    PMD5Update MD5Update = (PMD5Update)GetProcAddress(hDLL, "MD5Update");
    PMD5Final MD5Final = (PMD5Final)GetProcAddress(hDLL, "MD5Final");
    if (MD5Init && MD5Update && MD5Final) {
      MD5Init(&ctx);
      MD5Update(&ctx, data, len);
      MD5Final(&ctx);
      memcpy(digest, ctx.digest, MD5DIGESTLEN);
      ret = TRUE;
    }
    FreeLibrary(hDLL);
  }
  return ret;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注