如何将Bit Torrent info_hash(从Wireshark获取)转换为SHA1哈希

时间:2010-10-27 18:34:02

标签: sha1 bittorrent info-hash

我正在运行Snort,它会检测到一些P2P活动,特别是BitTorrent宣布请求。我看到HTTP GET /announce.php?info_hash=XXX ...请求,我正在尝试将此XXX转换为正确的SHA1哈希,以尝试了解正在下载的内容。

我已经阅读过各种说明这是URL编码的内容,还有其他人说只删除%字符 - 但是我无法重现这一点。

有人可以建议怎么做吗?

3 个答案:

答案 0 :(得分:4)

info_hash SHA1哈希。它是一个二进制哈希,URL编码以包含在URL中。

如果要将其转换为十六进制编码哈希,则需要从URL,URL解码和十六进制编码中提取它。例如在Python中:

>>> '%00%01%02%20%25ABC+XYZabc%7F%80%81%FE%FF'
'%00%01%02%20%25ABC+XYZabc%7F%80%81%FE%FF'
>>> urllib.unquote_plus(_)
'\x00\x01\x02 %ABC XYZabc\x7f\x80\x81\xfe\xff'
>>> _.encode('hex')
'00010220254142432058595a6162637f8081feff'

答案 1 :(得分:0)

好的,知道我知道。 info_hash是一个SHA1哈希值。它的一个例子是:%5d%97%dbA%d7a%2b%92%f5%c2%ef%dcv%bf%e7%e6%03%24%85%0a。如果您使用$_GET['info_hash'],则无法使用%。 您需要使用$_SERVER['QUERY_STRING']。 代码示例如何在PHP中获取info_hash的SHA1哈希:

$arye = $_SERVER['QUERY_STRING'];
$arye = explode('info_hash=', $arye)[1];
$arye = explode('&', $arye)[0];
$arye = explode('%', $arye);
$arp = '';
foreach($arye as $ara) {
    if (strlen($ara) == 2) {
        $arp .= $ara;
    }else{
        $e1 = substr($ara, 0, 2);
        $e2 = substr($ara, 2, 1);
        $e2 = unpack('H*', $e2)[1];
        $arp .= $e1;
        $arp .= $e2;
    }
}

echo $arp; // This will be your SHA1 hash

哈希:%5d%97%dbA%d7a%2b%92%f5%c2%ef%dcv%bf%e7%e6%03%24%85%0a - > 5d97db41d7612b92f5c2efdc76bfe7e60324850a

答案 2 :(得分:0)

不,你可以,

infohash == sha1(torrentfile["info"])

但您可以使用info_hash作为密钥在DHT网络上搜索