在PHP的torrent的通知请求中翻译info_hash

时间:2015-10-02 17:33:12

标签: php tracker utorrent info-hash

我有一个问题需要了解如何将info_hash值“转换”为真正的哈希值。 这是我在向跟踪器宣布时从uTorrent获得的一个例子:

{
passkey: "77ec6a27adcc441648d66d0b873550e4",
info_hash: "YNvÿ@p",
peer_id: "-UT3430-89 ",
port: "54790",
uploaded: "0",
downloaded: "491520",
left: "24928863",
corrupt: "0",
key: "A2DD5E96",
numwant: "200",
compact: "1",
no_peer_id: "1"
}

我想要了解的是如何使用这个奇怪的值:“YNvÿ@ p”并获取信息哈希为sha1(如:594E98760099B1CFC3BFAA4070C0CC02F6C1AA90)? 我在我的服务器上使用PHP。

现在我已经阅读了以下陈述:

  

info_hash

     

来自metainfo文件的信息值的bencoded形式的20字节sha1哈希。请注意,这是元信息文件的子字符串。 info-hash必须是.torrent文件中找到的编码表单的哈希值,无论它是否无效。几乎肯定必须逃避这个值。

但是,了解发生了什么并没有帮助我。

2 个答案:

答案 0 :(得分:3)

好的,我找到了解决方法。 出于某种原因,PHP中的$ _GET(我们使用CodeIgniter)将无法获得完整的二进制数据,看起来它出于某种原因正在剥离它。剩下的只是'YNvÿ@ p',但实际上还有更多未知的二进制符号被抛弃了。

所以......我所做的就是获取完整的URL参数:

$parts = parse_url($_SERVER['REQUEST_URI']);

然后,我在'info_hash'键中得到了这个值:

D%3b%16%01%b2%af%d7%cbT%e1%a1%d0A%20%20%f7%ce%c2%d3%bf

之后我才做了这个动作:

$info_hash = bin2hex(urldecode($parts["info_hash"]));

得到一个完整的哈希!

@Sammitch,谢谢你指点我正确的方向!

答案 1 :(得分:1)

# php -r 'echo(hex2bin("594E98760099B1CFC3BFAA4070C0CC02F6C1AA90"));' | hexdump -C
00000000  59 4e 98 76 00 99 b1 cf  c3 bf aa 40 70 c0 cc 02  |YN.v.......@p...|
00000010  f6 c1 aa 90                                       |....|

注意一个模式?