计算SHA-1摘要时,Python和C ++的结果不同

时间:2014-08-16 13:16:35

标签: python c++ sha

尝试在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 ++代码中提取了一个片段:

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 ++相同的结果?

2 个答案:

答案 0 :(得分:3)

你在C ++和python中使用不同的耐力。所以你必须在python中反转salt的字节。

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

答案 1 :(得分:-3)

SHA是规范,因此一些初始状态可以依赖于实现。

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