c++ 字符串加密函数,请教一下大家为什么会这样?我很菜,不要笑。

maya8maya85 2015-10-27 12:41:07
我程序的一个加密字符串函数
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的啊,如何处理呢,请大家帮我看看
...全文
235 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2015-10-29
  • 打赏
  • 举报
回复
引用 6 楼 maya8maya85 的回复:
[quote=引用 3 楼 SXJIAKE 的回复:] 把这两行修改一下:
DWORD cbContent = inData.GetLength() * sizeof(TCHAR); 
BYTE *pbContent = (BYTE *)(LPCTSTR)inData;
正解。能说说为什么你这样就行,我的就会出错的原因吗?分给你了[/quote]1. 计算 Hash 都是要传总字节数的,而 GetLength 返回的是字符数。 2. 将 inData 转换为 LPCTSTR (操作符重载),得到字符串指针,然后强转为 BYTE * 即可,不需要 GetBuffer。不过效果相同,但你 GetBuffer 后还得需要一个 ReleaseBuffer 。 当然,计算字符串的 Hash 值,项目设置为 MBCS 和 Unicode 的结果肯定是不同的,因为其字节内容和长度都不同。
信阳毛尖 2015-10-29
  • 打赏
  • 举报
回复
引用 6 楼 maya8maya85 的回复:
[quote=引用 3 楼 SXJIAKE 的回复:] 把这两行修改一下:
DWORD cbContent = inData.GetLength() * sizeof(TCHAR); 
BYTE *pbContent = (BYTE *)(LPCTSTR)inData;
正解。能说说为什么你这样就行,我的就会出错的原因吗?分给你了[/quote] BOOL WINAPI CryptHashData( _In_ HCRYPTHASH hHash, _In_ BYTE *pbData, _In_ DWORD dwDataLen, _In_ DWORD dwFlags ); Parameters hHash [in] Handle of the hash object. pbData [in] A pointer to a buffer that contains the data to be added to the hash object. dwDataLen [in] Number of bytes of data to be added. This must be zero if the CRYPT_USERDATA flag is set. dwFlags [in] The following flag values are defined.
maya8maya85 2015-10-29
  • 打赏
  • 举报
回复
引用 3 楼 SXJIAKE 的回复:
把这两行修改一下:
DWORD cbContent = inData.GetLength() * sizeof(TCHAR); 
BYTE *pbContent = (BYTE *)(LPCTSTR)inData;
正解。能说说为什么你这样就行,我的就会出错的原因吗?分给你了
maya8maya85 2015-10-28
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
你的inData CString要拷贝给BYTE数组bHash
版主,可否说一下,我哪一行代码要改啊?能写一下行吗?谢谢了
maya8maya85 2015-10-28
  • 打赏
  • 举报
回复
引用 1 楼 lsq19871207 的回复:
目测是最后进行base64编码的时候逻辑差不多,应该不是问题的,这个好办啊,加密对应着解密,你解一下看看数据与原来的相同与否呗,不相同就是算法你这个加密算法有问题了
这是单向SHA1加密的,没有解密方案的啊
oyljerry 2015-10-28
  • 打赏
  • 举报
回复
你的inData CString要拷贝给BYTE数组bHash
信阳毛尖 2015-10-28
  • 打赏
  • 举报
回复
目测是最后进行base64编码的时候逻辑差不多,应该不是问题的,这个好办啊,加密对应着解密,你解一下看看数据与原来的相同与否呗,不相同就是算法你这个加密算法有问题了
「已注销」 2015-10-28
  • 打赏
  • 举报
回复
把这两行修改一下:
DWORD cbContent = inData.GetLength() * sizeof(TCHAR); 
BYTE *pbContent = (BYTE *)(LPCTSTR)inData;

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧