代码之家  ›  专栏  ›  技术社区  ›  lorigio

C#和C之间的SHA1不同++

  •  -1
  • lorigio  · 技术社区  · 10 年前

    嗨,我正在将一个c++程序移植到c#,但结果不同。 我正在使用带有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#文件

    http://pastebin.com/yCHMkaZS

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

    提前感谢

    更新: 不,即使使用NULL,它仍然不起作用

    2 回复  |  直到 10 年前
        1
  •  4
  •   The Paramagnetic Croissant    10 年前

    C#版本正确。我假设是这样 documentation 对应于您的库。

    这:

    sha.UpdateBigNumbers(&A);
    

    应该是

    sha.UpdateBigNumbers(&A, NULL);
    

    自从 SHA1Hash::updateBigNumbers 是一个接受 NULL -终止的参数列表。您无法提供sentinel值,因此函数具有未定义的行为。