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

Python和C+中的不同结果+;计算SHA-1摘要时 在Python和C++中计算SHA-1摘要时得到不同的结果。,python,c++,sha,Python,C++,Sha,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: e92f9504b2d4

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

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


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

,在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
导入hashlib
salt='F0C020D239062F875C7BD8FB218D8102C9B37656F653E8DF0C655EF2D4A0CB61'。解码('hex'))
密码='pass1'
m=hashlib.sha1()
m、 更新(salt[:-1])
m、 更新(密码)
打印m.hexdigest()

#输出:4a6eed870e313f68f4d34b73bc5b330b0963b4e5您的python代码无法工作。对于
hex(salt)[2:-1]
您有奇数个字符。@Daniel:不,这正好起作用,因为在python2中,数字是一个长整型,并且附加了一个
L
。但是,在Python中定义盐的一种更糟糕的方法是使用Python中的“盐”,即使用<代码> 'F0C020D29062F875 C7BD818B818D8102C9B36656F83E8DF0C655 EF2D4A0CB661。解码(“十六进制”)< /C> >。C++和Python版本都使用Sa1。初始状态不依赖于实现。我不知道它们使用相同的sha。我的错。@senseiwa如果不是这样,那就不可能了。G用不同的SHA1实现来识别数据段。@Daniel:谢谢你的回答,它可以工作,但为什么我不也要反转密码字节?@xkyve:endiness只在数字中起作用,而不是在字符串中起作用。