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