2017-09-03 143 views
1
下面

代码(道歉丑),我跑这来计算哈希的洪流,但它给我不同的答案比我在变速箱直接打开洪流:Python3计算洪流哈希

我“M此页面上r_000测试:http://gen.lib.rus.ec/repository_torrent/

传输给了我:63a04291a8b266d968aa7ab8a276543fa63a9e84

我的代码给我:1882ff6534ee4aa660e2fbf225c1796638bea4c0

import bencoding 
from io import BytesIO 
import binascii 
import hashlib 

with open("cache/r_000.torrent", "rb") as f: 
    data = bencoding.bdecode(f.read()) 
info = data[b'info'] 
hashed_info = hashlib.sha1(info[b'pieces']).hexdigest() 
print(hashed_info) 

任何想法,我搞砸了?谢谢!

+0

这已经问。看看[这个答案](https://stackoverflow.com/a/28162042/3151902)。 – user3151902

+0

好像你在散列'pieces'值而不是'info'字典 – Encombe

+0

是的,需要退后一步再看一遍。好的,所以解决方案是对整个信息字典进行编码,然后对其进行散列。 –

回答

1

我犯了同样的错误。搜索发现这个问题,并帮助我解决它。但是,为了更清楚别人谁这样通过搜索如何从python3做来+,这是明确的解决办法:

变化:

hashed_info = hashlib.sha1(info[b'pieces']).hexdigest() 

到:

hashed_info = hashlib.sha1(bencoding.bencode(info)).hexdigest() 

感谢Encombe澄清信息哈希在这里:https://stackoverflow.com/questions/28140766/28162042#28162042

Torrent客户端中的散列或您在magnet-URI中发现的散列是 torrent文件的原始代码化信息字典部分的SHA1散列的。


的完整简约却例子是:

import bencoding, hashlib 

objTorrentFile = open("r_0000.torrent", "rb") 
decodedDict = bencoding.bdecode(objTorrentFile.read()) 

info_hash = hashlib.sha1(bencoding.bencode(decodedDict[b"info"])).hexdigest() 
print(info_hash) 

结果:

$ python3 example.py 
63a04291a8b266d968aa7ab8a276543fa63a9e84 
+0

好的解决方案,但要记住,在一些罕见的情况下,Bdecoding然后本哈丁在散列之前,可能会给[错误的info_hash](https://stackoverflow.com/questions/19749085/calculating-the-info-hash-of-a-torrent-file/19800109#19800109)。 – Encombe

+0

感谢您的额外信息。我将如何防止这种情况发生?它是否只是在错误的顺序和解码器库排序,它会不匹配或有其他情况?我使用的库实际上是[bencoder](https://github.com/utdemir/bencoder)库,我可以看到一个排序的部分。 – CGar