c++ 字符串加密函数,请问一下大家为什么会这样?小弟我很菜,不要笑
c++ 字符串加密函数,请教一下大家为什么会这样?我很菜,不要笑。
我程序的一个加密字符串函数
使用的时候,我传一个时间进去
结果好奇怪

虽然我感觉觉得是0的问题,好像只要没有0,就会变成正常,但我不能去掉0的啊,如何处理呢,请大家帮我看看
------解决思路----------------------
1. 计算 Hash 都是要传总字节数的,而 GetLength 返回的是字符数。
2. 将 inData 转换为 LPCTSTR (操作符重载),得到字符串指针,然后强转为 BYTE * 即可,不需要 GetBuffer。不过效果相同,但你 GetBuffer 后还得需要一个 ReleaseBuffer 。
当然,计算字符串的 Hash 值,项目设置为 MBCS 和 Unicode 的结果肯定是不同的,因为其字节内容和长度都不同。
我程序的一个加密字符串函数
CString CFileEncryptorDlg::SHA1(CString &inData)
{
CString outData;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
BYTE bHash[32];
DWORD dwHashLen = 20; // The SHA1 algorithm always returns 20 bytes.
DWORD cbContent = inData.GetLength();
BYTE* pbContent = (BYTE*)inData.GetBuffer(cbContent);//这里老是说错误的指针,不知道是不是错了
if(!CryptAcquireContext(&hProv, NULL,MS_DEF_PROV,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))
return _T("");
if(!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
return _T("");
if(!CryptHashData(hHash, pbContent, cbContent, 0))
return _T("");
if(!CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
return _T("");
CString tmp;
for (unsigned int i = 0; i < dwHashLen; i += 4) {
tmp.Format(_T("%02x%02x%02x%02x"), bHash[i], bHash[i+1],bHash[i+2],bHash[i+3]);
outData += tmp;
}
if(hHash)
CryptDestroyHash(hHash);
if(hProv)
CryptReleaseContext(hProv, 0);
return outData;
}
使用的时候,我传一个时间进去
CString m_strTime;
CTime time = CTime::GetCurrentTime(); ///构造CTime对象
m_strTime = time.Format("%Y%m%d%H%M%S");
SetDlgItemText(IDC_EDIT_HASH, SHA1(m_strTime));//显示给控件
结果好奇怪
虽然我感觉觉得是0的问题,好像只要没有0,就会变成正常,但我不能去掉0的啊,如何处理呢,请大家帮我看看
------解决思路----------------------
1. 计算 Hash 都是要传总字节数的,而 GetLength 返回的是字符数。
2. 将 inData 转换为 LPCTSTR (操作符重载),得到字符串指针,然后强转为 BYTE * 即可,不需要 GetBuffer。不过效果相同,但你 GetBuffer 后还得需要一个 ReleaseBuffer 。
当然,计算字符串的 Hash 值,项目设置为 MBCS 和 Unicode 的结果肯定是不同的,因为其字节内容和长度都不同。