【问题标题】:Different results in Python and C++ when computing SHA-1 digest计算 SHA-1 摘要时 Python 和 C++ 中的不同结果
【发布时间】:2014-08-16 21:31:08
【问题描述】:

尝试在 Python 和 C++ 中计算 SHA-1 摘要时得到不同的结果。

Python 代码:

import hashlib

salt = 0xF0C020D239062F875C7BD8FB218D8102C9B37656F653E8DF0C655EF2D4A0CB61
password = 'pass1'

m = hashlib.sha1()
m.update( bytearray.fromhex(hex(salt)[2:-1]) )
m.update( password )

print m.hexdigest()
# output: e92f9504b2d46db0af7732c6e89e0260e63ae9b8

我从 C++ 代码中提取了一个 sn-p:

BigNumber salt, x;
Sha1Hash xhash;
uint8 password[] = "pass1";

// salt is received from a network packet (32 bytes)
// 2014-08-16 16:06:37 --> salt=F0C020D239062F875C7BD8FB218D8102C9B37656F653E8DF0C655EF2D4A0CB61
salt.SetBinary(lc.salt, 32);

xhash.UpdateData(salt.AsByteArray(), salt.GetNumBytes());
xhash.UpdateData(password, sizeof(password) - 1);
xhash.Finalize();

x.SetBinary(xhash.GetDigest(), xhash.GetLength());
logdebug("--> x=%s", x.AsHexStr());
// output: E5B463090B335BBC734BD3F4683F310E87ED6E4A

我必须如何修改我的 Python 代码才能获得与 C++ 中相同的结果?

【问题讨论】:

  • 您的 python 代码不起作用。 hex(salt)[2:-1] 你有奇数个字符。
  • @Daniel:不,这恰好可行,因为在 Python 2 中,该数字是一个长整数,并附加了一个 L。然而,为盐生成字节是一种可怕的方式。
  • 在 Python 中定义盐的更好方法是使用 'F0C020D239062F875C7BD8FB218D8102C9B37656F653E8DF0C655EF2D4A0CB61'.decode('hex')

标签: python c++ sha


【解决方案1】:

您在 C++ 和 python 中使用不同的 endiness。所以你必须在 python 中反转你的盐的字节。

import hashlib

salt = 'F0C020D239062F875C7BD8FB218D8102C9B37656F653E8DF0C655EF2D4A0CB61'.decode('hex')
password = 'pass1'

m = hashlib.sha1()
m.update( salt[::-1] )
m.update( password )

print m.hexdigest()
# output: 4a6eed870e313f68f4d34b73bc5b330b0963b4e5 <- the reversed of the C++ result

【讨论】:

  • @Daniel:谢谢你的回答,它有效,但为什么我也不必反转密码字节?
  • @xkyve:endiness 只在数字中起作用,而不是在字符串中。
【解决方案2】:

SHA 是规范,因此某些初始状态可能取决于实现。

如果您需要比较 Python 和 C++ 代码,我建议使用完全相同的实现。

【讨论】:

  • C++ 和 Python 版本都使用 SHA1。初始状态依赖于实现。
  • 我不知道他们使用相同的 sha。我的错。
  • @senseiwa 如果不是这样,那将是不可能的 e。 G。识别具有不同 SHA1 实现的数据片段。
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多