您好我将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
我尝试了所有编码等但我不知道他们为什么不匹配
提前致谢
更新: 不,它仍然无法使用NULL
答案 0 :(得分:4)
C#版本是正确的。我假设此documentation对应于您的图书馆。
此:
sha.UpdateBigNumbers(&A);
应该是
sha.UpdateBigNumbers(&A, NULL);
因为SHA1Hash::updateBigNumbers
是一个可变函数,它接受一个NULL
- 终止的参数列表。您未能提供sentinel值,因此该函数具有未定义的行为。
答案 1 :(得分:0)