SHA1在C#和C ++之间有所不同

时间:2014-07-27 20:27:26

标签: c# c++ wrapper sha1

您好我将c ++程序移植到C#但是sha结果不同。 我使用带有c#

包装器的openssl库

我有这个代码

C ++

BigNumber A;
A.SetHexStr("4C9309B98E8A3D7E357688305FECFA1676404D0ABFDE0AB48A98EF318AAE35EA");
SHA1Hash sha;
sha.UpdateBigNumbers(&A);
sha.Finalize();
BigNumber u;
u.SetBinary(sha.GetDigest(), 20);
log("u: %d %s", u.GetNumBytes(), u.AsHexStr());

结果

A: 4C9309B98E8A3D7E357688305FECFA1676404D0ABFDE0AB48A98EF318AAE35EA    
u: 330E234D38088E7C58B40A278A0833B844F06CB5

这是SHA1Hash.cpp的链接 http://pastebin.com/hf5mn1zU

C#

  Sha1Hash SHA = new Sha1Hash();

  byte[] digest = new byte[20];
  BigNumber A = BigNumber.FromHexString("4C9309B98E8A3D7E357688305FECFA1676404D0ABFDE0AB48A98EF318AAE35EA");
  SHA.UpdateData(A.ToBytes(),A.Bytes);
  SHA.Final();
  BigNumber u = BigNumber.FromArray(SHA.getDigest(), 20);
  Logger.Message(LogLevel.Debug, A.ToHexString());
  Logger.Message(LogLevel.Debug, u.ToHexString());

结果

A 4C9309B98E8A3D7E357688305FECFA1676404D0ABFDE0AB48A98EF318AAE35EA
u 1085A72DE27D6D981C1382170B6E39FDED45B92D

C#Files

http://pastebin.com/yCHMkaZS

我尝试了所有编码等但我不知道他们为什么不匹配

提前致谢

更新: 不,它仍然无法使用NULL

2 个答案:

答案 0 :(得分:4)

C#版本是正确的。我假设此documentation对应于您的图书馆。

此:

sha.UpdateBigNumbers(&A);

应该是

sha.UpdateBigNumbers(&A, NULL);

因为SHA1Hash::updateBigNumbers是一个可变函数,它接受一个NULL - 终止的参数列表。您未能提供sentinel值,因此该函数具有未定义的行为。

答案 1 :(得分:0)