我有这个C++在Visual Studio中开发计划,其中应打印出给定的字符串的SHA1和MD5哈希值:SHA1功能给人怪异的输出
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include "windows.h"
#include "conio.h"
#include "wincrypt.h"
char Buf [256];
DWORD BufSize;
LPSTR CreateHash(LPSTR tohash, ALG_ID alg)
{
HCRYPTPROV hProv;
HCRYPTHASH hash;
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT))
{
if (CryptCreateHash(hProv, alg, 0, 0, &hash))
{
if (CryptHashData(hash, (BYTE *)&tohash, sizeof(tohash), 0))
{
ZeroMemory(&Buf, sizeof(Buf));
BufSize = sizeof(Buf);
if (!CryptGetHashParam(hash, HP_HASHVAL,
(BYTE *) &Buf, &BufSize, 0))
printf("Call to CryptGetHashParam failed. Error: %d\n",
GetLastError());
} else printf("Call to CryptHashData failed. Error: %d\n",
GetLastError());
if (!CryptDestroyHash(hash))
printf("Call to CryptDestroyHash failed. Error: %d\n",
GetLastError());
} else printf("Call to CryptCreateHash failed. Error: %d\n",
GetLastError());
if (!CryptReleaseContext(hProv, 0))
printf("Call to CryptReleaseContext failed. Error: %d\n",
GetLastError());
} else printf("Call to CryptAcquireContext failed. Error: %d\n",
GetLastError());
return Buf;
}
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "SHA hash: " << CreateHash("Visual C++", CALG_SHA)<<endl;
cout << "MD5 hash: " << CreateHash("Visual C++", CALG_MD5)<<endl;
system("pause");
}
它编译,但是当我运行它,它显示了怪异输出。
输出应该
SHA hash: 0e4abc18f9fb9d8d6d39f047dc20fbebd4a975bd
MD5 hash: f3be2f04531a477a4bb755f9f42c6f2e
但它打印
SHA hash: ü©á*ÀªvÍŒe²5Ê¥Å?•Â
MD5 hash: òù%•þîOú°b>«’
为什么?
我该如何解决这个问题?
它的原始输出为字节而不是十六进制。 – towr
除非需要支持XP,否则应该使用[下一代加密](http://msdn.microsoft.com/en-us/library/windows/desktop/aa376210(v = vs.85).aspx) API更容易和更安全地使用,并暴露更多的算法。 – Mgetz
@towr如何将原始输出转换为十六进制输出? – user3099950