2010-10-27 114 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網絡上