2010-10-27 116 views
3

我正在运行检测一些P2P活动的Snort,特别是BitTorrent公布请求。我看到HTTP GET /announce.php?info_hash=XXX ...请求,并且我试图将此XXX转换为适当的SHA1哈希以尝试了解正在下载的内容。如何将Bit Torrent info_hash(从Wireshark获取)转换为SHA1哈希

我读过各种说这是URL编码的东西,以及其他人说只是删除%字符 - 但我无法重现这一点。

任何人都可以建议如何做到这一点?

回答

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' 
+0

值得一提的是,虽然这是一个SHA1哈希,它可以用base32编码当在URL中时。 – 2015-02-22 15:49:36

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']。 代码示例如何获得info_hash的SHA1哈希在PHP中:

$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%分贝%D7A%2B%92%F5%C2%EF%DCV%BF%E7%E6%03 %24%85%0A - > 5d97db41d7612b92f5c2efdc76bfe7e60324850a

0

没有,你可以,

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

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