3

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

我读过各种说这是 URL 编码的东西,还有一些说只是删除 % 字符 - 但是我无法重现这一点。

谁能建议如何做到这一点?

4

3 回答 3

4

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

如果要将其转换为十六进制编码的哈希,则需要从 URL、URL-decode 和 hex-encode 中提取它。例如在 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'
于 2010-10-27T19:16:30.060 回答
0

好吧,知道我知道。info_hash是一个 SHA1 哈希。一个例子是:%5d%97%dbA%d7a%2b%92%f5%c2%ef%dcv%bf%e7%e6%03%24%85%0a. 如果您使用$_GET['info_hash'],它将无法工作,因为%s. 你需要使用$_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

于 2016-02-21T07:46:12.660 回答
0

不,你可以,

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

但是你可以使用 info_hash 作为键在 DHT 网络上搜索它

于 2016-07-04T08:43:14.770 回答