gpt4 book ai didi

c++ - 通过c++ WinAPI计算MD5哈希值

转载 作者:可可西里 更新时间:2023-11-01 13:18:26 24 4
gpt4 key购买 nike

我的 C++ 应用程序需要计算 MD5 哈希值。目前,它由 OpenSSL 完成,我想使用 WinAPI - 以避免依赖外部库。

我写了这段代码:

HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hHash = NULL;
HCRYPTHASH hHexHash = NULL;
HASH HA1;
HASHHEX HA1HEX;
DWORD data = HASHLEN;

// Get a handle to a cryptography provider context.
if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0))
{
goto err;
}

// Acquire a hash object handle.
if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
goto err;
}

CryptHashData(hHash, (const BYTE *)str, strlen(str), 0);

现在,奇怪的是有时它运行良好,但在其他时候 CryptAcquireContext 返回 NTE_BAD_KEYSET 错误,根据 MSDN:

The key container could not be opened. A common cause of this error is that the key container does not exist. To create a key container, call CryptAcquireContext using the CRYPT_NEWKEYSET flag. This error code can also indicate that access to an existing key container is denied. Access rights to the container can be granted by the key set creator by using CryptSetProvParam.

Blockquote

现在我的问题是:

  1. 如果我调用 CryptSetProvParam,它究竟做了什么?简单的应用程序更改操作系统设置是否正常?
  2. 在 C++ Windows 中计算 MD5 有没有更简单的方法?

如果有人给我关于该做什么的好建议,我将不胜感激。
谢谢。

最佳答案

因此,我在 http://msdn.microsoft.com/en-us/library/aa382380%28VS.85%29.aspx 找到了一个可以满足您要求的示例

查看他们的代码,我看到的不同之处在于这一行:

他们的:CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)

你的:CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)

因此,阅读该标志后,我找到了以下信息:

CRYPT_VERIFYCONTEXT:此选项适用于使用临时 key 的应用程序,或不需要访问永久私钥的应用程序,例如仅执行散列、加密和数字签名验证的应用程序。只有创建签名或解密消息的应用程序才需要访问私钥。在大多数情况下,应该设置此标志。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886%28v=vs.85%29.aspx

因此,看起来您正试图访问您不需要的信息,但请求被拒绝了。因此,最好的选择是通过包含该标志来告诉 Windows 您不需要该信息。

关于c++ - 通过c++ WinAPI计算MD5哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13256446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com