Sha1加密

ck11926375 2012-04-24 10:31:08

string pass = "1253589708.112012-04-23T06:06:58.239Z123456";
byte[] temp = Encoding.Default.GetBytes(pass);
HashAlgorithm sha1 = new SHA1CryptoServiceProvider();
temp = sha1.ComputeHash(temp);
//temp = {149,251,126,50,127,208,67,253,245,220,138,241,147,210,149,181,9,154,56,43};
//想得到的结果
//byte[] ByteArray2 = new byte[]{157, 159, 129, 122, 94, 82, 44, 50, 207, 93, 154, 68, 109, 31, 150, 190, 66, 178, 253, 8};

请问各位,怎么才能得到我想要的结果。

CString strInsert;
strInsert = szOut;
strInsert = "1253589708.112012-04-23T06:06:58.239Z123456";
//=================================================SHA-1加密
ZeroMemory(szCode, sizeof(szCode));
SHA1_CONTEXT ctx;
int nLen = strInsert.GetLength();
sha1_init(&ctx);
memcpy(szCode, strInsert, nLen);
sha1_write(&ctx, (unsigned char *)szCode, nLen);
sha1_final(&ctx);
UCHAR szOutput[21];
ZeroMemory(szOutput, sizeof(szOutput));
memcpy(szOutput, ctx.buf, sizeof(szOutput) - 1);
//=================================================SHA-1加密
strInsert = szOutput;

这个C++的可以得到想要的结果
...全文
199 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2012-04-24
  • 打赏
  • 举报
回复
哎,我不知道哪里添加SHA1_CONTEXT、ZeroMemory等类型的支持,所以还是没法测试C++的执行结果,单从C++的代码分析,如果断点调试到sha1_write(&ctx, (unsigned char *)szCode, nLen);时,szCode的内容真如你所给的那个字符串一样,那么结果不同就可能是C#内置算法和C++的差异了。而算法要统一的话,就需要在知道算法原理的情况下,自己写一个类来实现。
不过我还是怀疑传递进去的字符串不是那样的,比如这段:
CString strInsert;
//strInsert = szOut;
strInsert = strInsert + strTime + strPass;
怎么看这个strInsert 应该为"2012-04-23T06:06:58.239Z123456"嘛,前面那个strNonce 解密的结果根本没用到,奇怪。
ck11926375 2012-04-24
  • 打赏
  • 举报
回复

CString strInsert;
//strInsert = szOut;
strInsert = strInsert + strTime + strPass;
//=================================================SHA-1加密


//strInsert = szOut;
这句没有注释掉,刚才忘了改了
ck11926375 2012-04-24
  • 打赏
  • 举报
回复

CString CYYTThread::Get_Password_Digest(CString strNonce,CString strTime,CString strPass)
{
strNonce = "MTI1MzU4OTcwOC4xMQ==";
strTime = "2012-04-23T06:06:58.239Z";
strPass = "123456";

char szCode[1024];
ZeroMemory(szCode, sizeof(szCode));
memcpy(szCode, strNonce, strNonce.GetLength() - 2);

BYTE szOut[1024];
ZeroMemory(szOut, sizeof(szOut));

CBase64 m_base64;
m_base64.Decode(szCode, szOut);
szOut[20] = '\0';
//=================================================Base64解密
CString strInsert;
//strInsert = szOut;
strInsert = strInsert + strTime + strPass;
//=================================================SHA-1加密
ZeroMemory(szCode, sizeof(szCode));
SHA1_CONTEXT ctx;
int nLen = strInsert.GetLength();
sha1_init(&ctx);
memcpy(szCode, strInsert, nLen);
sha1_write(&ctx, (unsigned char *)szCode, nLen);
sha1_final(&ctx);
UCHAR szOutput[21];
ZeroMemory(szOutput, sizeof(szOutput));
memcpy(szOutput, ctx.buf, sizeof(szOutput) - 1);
//=================================================SHA-1加密
strInsert = szOutput;
//=================================================Base64加密
nLen = strInsert.GetLength();
BYTE szSrc[1024];
ZeroMemory(szSrc, sizeof(szSrc));
char szBase64Out[1024];
ZeroMemory(szBase64Out, sizeof(szOut));
memcpy(szSrc, strInsert, nLen);

m_base64.Encode(szSrc, nLen, szBase64Out);
CString strOut = szBase64Out;
int nEnd = strOut.GetLength() % 3 + 1;
int i;
for(i=0; i<nEnd; i++)
{
strOut += "="; //当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候用=结束
}
//=================================================Base64加密
return strOut; //以等号作为结束符号
}

qldsrx 2012-04-24
  • 打赏
  • 举报
回复
能不能把C++代码贴完整,有些变量看不到定义,贴完整了我好先验证下C++的实现。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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