Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Win32 MD5哈希程序的奇怪行为_C++_Winapi_Md5 - Fatal编程技术网

C++ Win32 MD5哈希程序的奇怪行为

C++ Win32 MD5哈希程序的奇怪行为,c++,winapi,md5,C++,Winapi,Md5,我使用这个函数来生成字符串的散列 std::string MD5(string input) { BYTE BytesHash[33];//! DWORD dwHashLen; string final; HCRYPTPROV CryptProv; HCRYPTHASH CryptHash; if (CryptAcquireContext(&CryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VER

我使用这个函数来生成字符串的散列

std::string MD5(string input)
{
    BYTE BytesHash[33];//!
    DWORD dwHashLen;
    string final;   
    HCRYPTPROV CryptProv;
    HCRYPTHASH CryptHash;
    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();
                    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;

}
std::string MD5(字符串输入)
{
字节字节哈希[33];/!
德沃德·德哈斯伦;
弦乐决赛;
HCRYPTPROV-CryptProv;
HCRYPTHASH CryptHash;
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();
string hexcharset=“0123456789ABCD EF”;
对于(int j=0;j<16;j++){
final+=hexcharset.substr((BytesHash[j]>>4)和0xF),1);
final+=hexcharset.substr((BytesHash[j])&0x0F),1;
}
}
}
}
}cryptohash(cryptohash);
CryptReleaseContext(CryptProv,0);
返回最终结果;
}
但我有个问题。某些已编译二进制文件的用户无法生成md5。但是,我在一些行之间插入:

cout << "randomstring:gfdgfdgfdgfdg" << endl;
cout的第四个参数,
pdwDataLen
,有两个功能。输入时,它指定可用缓冲区的长度。退出时,它包含实际使用的数据的长度。这是Windows API中相当常见的概念

由于不使用任何值初始化
dwHashLen
,因此当前堆栈上的任何内容都将传递给函数。如果它小于散列值的大小,则它不起作用,函数返回错误。如果它碰巧更大,它就会起作用。执行其他一些不相关的操作可能会以随机方式更改堆栈,因此有时会使其工作

因此,解决方案是如下初始化大小:

DWORD dwHashLen = sizeof(BytesHash);
下次发生类似情况时,您可能需要检查
GetLastError()
,它会提示您出了什么问题(
ERROR\u MORE\u DATA
)。
pdwDataLen
的第四个参数有两个函数。输入时,它指定可用缓冲区的长度。退出时,它包含实际使用的数据的长度。这是Windows API中相当常见的概念

由于不使用任何值初始化
dwHashLen
,因此当前堆栈上的任何内容都将传递给函数。如果它小于散列值的大小,则它不起作用,函数返回错误。如果它碰巧更大,它就会起作用。执行其他一些不相关的操作可能会以随机方式更改堆栈,因此有时会使其工作

因此,解决方案是如下初始化大小:

DWORD dwHashLen = sizeof(BytesHash);

下次发生类似情况时,您可能需要检查
GetLastError()
,它会提示您出了什么问题(
ERROR\u MORE\u DATA
)。

如果添加打印语句“修复”这段代码表明您的代码中存在未定义的行为。忽略错误很少是一个好计划。如果添加打印语句“修复”这段代码,这段代码表明您的代码中存在未定义的行为。忽略错误很少是一个好计划。