bt 介绍以及 bt 种子的hash值(特征值)计算

bt种子的hansh值计算,最近忽然对bt种子感兴趣了(原因勿问)

1. bt种子(概念)

bt 是一个分布式文件分发协议,每个文件下载者在下载的同时向其它下载者不断的上传已经下载的数据,这样保证下载越快,上传越快,从而实现告诉下载

2. bt 如何实现下载同时上传文件

这个需要从文件本身说起,bt文件包含了两部分信息,一部分是Tracker信息,一部分是文件信息,tracker信息主要是记录下载过程中需要的tracker服务器地址和针对tracker服务器的设置,文件信息是根据对目标文件的计算生成的,计算结果会以B编码规则进行编码(英文不太好,这部分信息来自百度百科)。 文件信息里,会把需要下载的文件进行分块,每个块的索引信息会写到torrent文件中,在这里上传一个迅雷的任务详细页面

可以看到具体的任务分块信息,每个下载者都可以上传自己已经下载的分块数据,如何获取其它下载者已经下载的分块信息数据呢,一种方式是通过tracker服务器来实现的,可以记录每个下载者,这也就是我们经常看见局域网的bt分享网站会有对上传下载的流量统计功能,每个人下载多少,上传多少,从而确定每个人的贡献值。

这也就是海盗湾之前被瑞典起诉的原因,tracker服务器提供了给每个下载者下载盗版的可能性和机会,当然现在对于众多的magnet协议,采用了dht技术,这样对于tracker服务器的存在就显得没有必要了,这是后话,慢慢在描述!

3.  bt的hash值计算(特征值计算)

由上可知,对于每一个bt种子,都有包含每个分块的文件信息,这样可以保证即使在tracker服务器有变化的情况下,bt种子的唯一性(这里,插一句,我曾经simple的以为,可以对bt种子取md5值就可以确定其唯一性,too naive啊),那如何计算这个hash值呢,这需要对bt文件组成的一个深入了解,这方面以后相当多的文章,附上一篇:

http://www.cnblogs.com/DxSoft/archive/2012/02/11/2346314.html

根据这篇文章的描述,谢了两段测试程序:

方法1:直接根据info后的字段信息即4:info后的字段,我们可以截取bt种子中的一段

例如:

d8:announce27:http://tk3.5qzone.net:8080/13:announce-listll27:http://tk3.5qzone.net:8080/el36:http://btfans.3322.org:8000/announceel36:http://btfans.3322.org:8080/announceel36:http://btfans.3322.org:6969/announceel42:http://denis.stalker.h3q.com:6969/announceel40:http://torrent-download.to:5869/announceel45:http://tracker.openbittorrent.com:80/announceel39:http://tracker.publicbt.com:80/announceel40:http://tracker.bittorrent.am:80/announceel30:http://tracker.prq.to/announceel34:http://tracker.prq.to/announce.phpel43:http://tracker.torrentbox.com:2710/announceel34:http://tpb.tracker.prq.to/announceel30:http://tr.wjl.cn:8080/announceel37:http://219.152.120.234:6969/announce el34:http://mdbt.3322.org:6969/announceee7:comment19:YYeTs人人影视资源站13:comment.utf-826:YYeTs浜轰汉褰辫璧勬簮绔?0:created by13:BitComet/0.7013:creation datei1261532244e8:encoding3:GBK4:infod5:filesld6:lengthi943e4:path

第一个字节d代表dict意思,字典组成,4:info 代表着info字段长度为4意思,这样我们可以写下解析hash的代码值:

#!python
import hashlib
def sha1sum(src):
     if not len(src):
         return ""
     m = hashlib.sha1(src)
     return m.hexdigest()

#filename is the torrent file name
with open(filename) as f:
     torrent_data = f.read()
     if -1 != torrent_data.find("nodes"):
         info_data =
torrent_data[torrent_data.find("info")+4:torrent_data.find("nodes")-2]
     else:
          info_data =
torrent_data[torrent_data.find("info")+4:len(torrent_data) - 1]
     sha1_data = sha1sum(info_data)
     print "the hash data of torrent is: ", sha1_data.upper()

在实际测试时,发现,在torrent中,有两种情况,一种是包含nodes字段信息的;一种是不包含nodes信息的torrent种子,需要分别处理,但是这种处理的方式较为繁琐,也不清楚后续到底有多少的坑在里面,需要应对不同情况,于是去google了一下,在stackoverflow里面,提到一个库,即bencode库,这就是我们的第二种方案

方案2:

通过bencode库实现对hash值得计算(bencode库后续详细介绍和解读),代码如下(需要安装bencode库),地址:

https://pypi.python.org/pypi/BitTorrent-bencode/5.0.8.1

#!/usr/bin/python

import sys, os, hashlib, StringIO
import bencode

def main():
    # Open torrent file
    torrent_file = open(sys.argv[1], "rb")
    metainfo = bencode.bdecode(torrent_file.read())
    info = metainfo['info']
    print hashlib.sha1(bencode.bencode(info)).hexdigest()    

if __name__ == "__main__":
    main()

bt 介绍以及 bt 种子的hash值(特征值)计算

时间: 2024-10-11 01:23:31

bt 介绍以及 bt 种子的hash值(特征值)计算的相关文章

webQQ 中hash值的计算 python实现 2015年7月

目前,在获取群列表时,需要post一个hash值,计算函数在js中,具体位置详见注释部分. 另外,此部分更改的频率很快,应该很快就变了. #!/usr/bin/env python # -*- coding: UTF-8 -*- def getHashCode(b, j): """ get the hash num to achieve the grouplist info (record:gcode) source function: http://0.web.qstati

Java 区块链BLOCKCHAIN中区块BLOCK的hash值的计算

Java 区块链中区块的hash值的计算 计算方法有多种,如,可以直接String拼接,也可以用stringbuffer,或者stringbuilder .这里采用了速度较快的stringbuilder,自己编程的时候可采用stringbuffer.其中index是区块BLOCK的索引,timestamp是区块BLOCK的时间戳,data是区块BLOCK内包含的数据,nonce为该区块的难度系数.总体计算代码如下: /** * 计算hash服务 * @param index 索引 * @para

使用GetHashes获取Windows的用户密码Hash值

GetHashes是InsidePro公司早期的一款Hash密码获取软件.在Win7上试了一下,它已经没办法捉到SAM文件的Hash值了,不过在Windows XP和Windows Server 2003上,这个小工具还是很好用的. GetHashes是一个命令行工具,它的命令格式是:GetHashes [System key file]或者GetHashes $Local(不区分大小写). 下面用Windows XP来演示一下GetHashes的用法. 我将GetHashes程序解压到了D盘的

IPVS基于应用层任意偏移字段HASH值的负载均衡算法

在比较早的那些年,我曾经写了一个负载均衡调度算法模块,是基于应用层协议包任意偏移量开始的一段固定长度的数据计算一个值,然后将这个值hash到不同的服务器.那时觉得没啥用,就没有再继续,直到前一段时间的一段思考以及前几天的一次预研.我决定作文以记之,以后说不定能用得着. 1.UDP服务的负载均衡 以前使用UDP的服务很少,虽然HTTP并没有说一定要是TCP,但事实上几乎没有UDP上的HTTP.但是随着网络可靠性的增加,网络集中控制机制与分布式优化技术的日益成熟,使用UDP的场合越来越多.     

IOS9.0中hash值的bug与解决方案

事件起因 事情是这样的:产品上线发布,突然出现了问题.运营Gg过来反应,当场给露珠演示,运营同事的手机是iphone,bug确实是存在的.奇怪的是露珠用了其他iphone手机(借别人的,露珠的是吊死安卓机),却没有发现这个问题.仔细询问,同事说他最近刚刚升级的ios9,于是问题最初定位在操作系统上.接下来检查代码,发现运行正常,逻辑也没错.问题就卡到这里了.没办法,线上问题,fiddler替换本地脚本调试,一级一级alert,从项目文件到底层库,最后定位到了backbone.查看backbone

WebQQ hash值获取 C#方法 2014/06/20

去年心血来潮,利用闲暇时间做了一个WebQQ的桌面软件,基本功能实现之后,就放那儿了.webQQ的协议时常更新,导致有些参数加密的方法要跟着更新,今天群里一朋友提供了一份最新的WebQQ hash的js,我转成了C#的方法,记在这里,希望对正在做webqq的朋友有所帮助. js方法 p=getqqhsahs(b,j) { for (var a = j + "password error", i = "", E = [];;) if (i.length <= a

域hash值破解的总结经验

1.vsssown.vbs拷贝域数据库: 1.1上传vssown.vbs文件 上传cscript.exe和vssown.vbs到域服务器上 1.2创建快照 reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters //得到ntds的默认路径:c:\ Windows\NTDS\ntds.dit cd 桌面 cscript //nologo vssown.vbs /start //启用 cscript

JAVA-读取文件部分内容计算HASH值

对于一些大文件,有时会需要计算部分内容的Hash,下面的函数计算了 文件头尾各1M,中间跳跃100M取10K 以及文件大小的Hash值 public static String CalHash(String path) throws IOException { File file = new File(path); if (!file.canRead()) return ""; if (file.length() < 150 * 1024 * 1024) { return &qu

gerrit 在git review的时候碰上miss unkown + hash值

案例:gerrit 在git review的时候碰上miss unkown + hash值,现象如下 [email protected]:~/share/37N/master_gerrit/OS_gerrit_ALPS-MP-N0.MP1-V1.0.2_PRI6737M_65_N$ git reviewerror: unpack failed: error Missing unknown b717c6e642d0a5e649099e761d2f6aa37804ac1dfatal: Unpack