Python3计算种子哈希

Posted

技术标签:

【中文标题】Python3计算种子哈希【英文标题】:Python3 calculating torrent hash 【发布时间】:2017-09-03 16:52:50 【问题描述】:

下面的代码(为丑陋道歉),我正在运行它来计算种子的哈希值,但它给我的答案与我直接在传输中打开该种子时不同:

我正在此页面上的 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)

知道我搞砸了什么吗?谢谢!

【问题讨论】:

这已经被问过了。看看this answer。 似乎您正在散列 pieces-value 而不是 info-dictionary 先看看这个answer。但是,如果您想对其他文件进行哈希处理,我在 Google 上找到了此指南:Hashing files with Python | Python Central 是的,需要退后一步再看一遍。好的,所以解决方案是对整个信息字典进行编码,然后对其进行哈希处理。 Bdecode 然后 Bencode 可能在一些罕见的追逐中给出错误的 info_hash。看到这个答案:***.com/questions/19749085/… 【参考方案1】:

我犯了同样的错误。搜索发现了这个问题,这帮助我解决了这个问题。但是为了让其他通过从 python3+ 搜索如何做到这一点的人更清楚,这是明确的修复:

变化:

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

到:

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

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

torrent 客户端中的哈希值或您在磁​​铁 URI 中找到的哈希值是 原始编码信息字典部分的 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

【讨论】:

很好的解决方案,但请记住,在极少数情况下,Bdecoding 然后在散列之前进行 Bencoding,可能会给出wrong info_hash。 感谢您提供额外信息。我将如何防止这种情况发生?只是当它的顺序错误并且解码器库对其进行排序时它会不匹配还是有其他情况?我正在使用的库实际上是 bencoder 库,我可以看到排序的部分。

以上是关于Python3计算种子哈希的主要内容,如果未能解决你的问题,请参考以下文章

json 使用哈希密码对种子用户进

Ruby gem,用于通过信息哈希检索种子的详细信息/信息

如何实现 ora_hash(将任何 sql 数据类型划分为 n 个桶的可种子哈希)

torrent hash怎么用

如何从磁力链接或 infohash 创建种子文件

如何使用 rtorrent 中的移动/删除文件自动删除种子?