MD5功能无法正常运行

时间:2015-04-24 22:19:20

标签: c++ windows

这是我目前的MD5功能。在Windows 8.1上使用时,它总是返回一个值,但是当在Windows 7上运行时,它只返回大约50%的时间值。这对我来说非常特殊。有什么想法吗?

事实证明,win7和win8都很狡猾。显然,对CryptGetHashParam的调用有时会因ERROR_MORE_DATA而失败。

std::string MD5(std::string input)
{
    HCRYPTPROV CryptProv;
    HCRYPTHASH CryptHash;
    BYTE BytesHash[33];//!
    DWORD dwHashLen;
    std::string final;

    if (CryptAcquireContext(&CryptProv,NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
    {
        if (CryptCreateHash(CryptProv, CALG_MD5, 0, 0, &CryptHash))
        {
            if (CryptHashData(CryptHash, (BYTE*)input.c_str(), input.length(), 0))
            {
                if (CryptGetHashParam(CryptHash, HP_HASHVAL, BytesHash, &dwHashLen, 0))
                {
                    final.clear();
                    std::string hexcharset = "0123456789ABCDEF";

                    for (int j = 0; j < 16; j++)
                    {
                        final += hexcharset.substr(((BytesHash[j] >> 4) & 0xF), 1);
                        final += hexcharset.substr(((BytesHash[j]) & 0x0F), 1);
                    }
                }
            }
        }
    }

    CryptDestroyHash(CryptHash);
    CryptReleaseContext(CryptProv, 0);
    return final;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char *pp = "derp";
    std::string derp = MD5(std::string(pp));
    printf("%s\n", derp.c_str());
    system("pause");
    return 0;
}

1 个答案:

答案 0 :(得分:2)

我有一个很棒的主意:在这些条件中添加else子句,以便您知道哪一个失败了。将输出放在这些子句中,以便您可以查看错误条件的详细信息。然后你就会知道你的功能有什么问题。