Python3 计算种子文件哈希值

3
抱歉代码有些丑陋,以下是计算种子哈希的代码。我运行这段代码时得到的结果与在Transmission中直接打开该种子时得到的结果不同:
我正在测试r_000页面上的内容:http://gen.lib.rus.ec/repository_torrent/ Transmission给出的结果为: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)

有任何想法是我搞砸了什么吗?谢谢!

这个问题已经被问过了。请看这个答案 - user3151902
似乎你正在对“pieces”值进行哈希,而不是“info”字典。 - Encombe
首先看看这个答案。 但是,如果你想要对其他文件进行哈希计算,我在谷歌上找到了这个指南: 使用Python计算文件哈希值 | Python Central - CFV
是的,需要退一步重新审视。好的,解决方案是对整个信息字典进行bencode编码,然后进行哈希处理。 - M. Who
Bdecode和Bencode可能在某些罕见情况下给出错误的info_hash。请参考此答案: https://dev59.com/THjZa4cB1Zd3GeqPhLIB#19800109 - Encombe
1个回答

5

我也犯了同样的错误。在搜索中发现了这个问题,并且这帮助我解决了它。但是为了让其他通过搜索了解如何从Python3+执行此操作的人更清楚,以下是显式修复:

更改为:

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

to:

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

感谢Encombe在这里澄清了信息哈希值: https://dev59.com/TIfca4cB1Zd3GeqPgDxs

种子客户端中的哈希值或磁力链接中的哈希值是 torrent 文件的原始 bencoded 信息字典部分的 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

2
好的解决方案,但请注意,在某些罕见情况下,在哈希之前进行B解码和B编码可能会导致错误的info_hash - Encombe
1
感谢提供额外信息。我该如何防止这种情况发生?只有当顺序错误且解码器库对其进行排序时,才会导致不匹配吗?还是还有其他情况?实际上我使用的是bencoder库,我可以看到其中一部分进行了排序。 - CGar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接