我遇到了一个问题,无法理解如何"翻译";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(如:594E98760099B1CFC3BFAA4070CC02F6AA90(?我在服务器上使用PHP。
现在我已经阅读了以下声明:
info_hash
元信息文件中信息值的bencoded形式的20字节sha1散列。请注意,这是metainfo文件的子字符串。信息哈希必须是在.torrent文件中找到的编码表单的哈希,无论它是无效的。几乎可以肯定的是,这个值必须被转义。
但这并没有帮助我理解发生了什么。
好的,我找到了解决方案。出于某种原因,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,谢谢你在这件事上给我指明了正确的方向!
# 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 |....|
注意到图案了吗?