2010-04-03 21 views
21

मैंने इसका जवाब देखने के लिए चारों ओर देखा है, लेकिन मुझे लगता है कि यह आपके लिए ऐसा सॉफ़्टवेयर ढूंढने में सक्षम है। क्या किसी को पता है कि पाइथन में ऐसा करने के बारे में कैसे जाना है?एक धार फ़ाइल से SHA1 हैश निकालें

+5

एक धार फ़ाइल भंडार प्रत्येक * टुकड़े की SHA1 * साझा फ़ाइलों और धार मेटाडाटा के SHA1 * (मेटाइन्फो हैश) *। आप वास्तव में कौन सा हैश चाहते हैं? –

+0

यह प्रत्येक टुकड़े के लिए हैश होगा। क्या फ़ाइल में त्रुटियों की जांच करने के लिए पूर्ण फ़ाइल के लिए हैश भी नहीं है? –

+2

कुछ .torrent फ़ाइलों में प्रत्येक फ़ाइल का md5 हैश शामिल है लेकिन यह फ़ाइल प्रारूप में एक वैकल्पिक एक्सटेंशन है। पाठ्यक्रमों की वैधता की जांच करने के लिए टुकड़े हैश का उपयोग किया जा सकता है। आप बस जांचें कि क्या सभी टुकड़े हैं और यदि उनके पास सही हैश है। –

उत्तर

27

मैं अजगर कोड का एक टुकड़ा है कि डाउनलोड की गई फ़ाइलें क्या एक धार फ़ाइल में है के खिलाफ की हैश की पुष्टि करता है लिखा था। मान लीजिए कि आप भ्रष्टाचार के लिए डाउनलोड देखना चाहते हैं, आपको यह उपयोगी लगेगा।

इसका उपयोग करने के लिए आपको bencode package की आवश्यकता है। बेनकोड .torrent फ़ाइलों में इस्तेमाल serialization प्रारूप है। यह जेएसओएन की तरह कुछ हद तक मार्शल सूचियों, शब्दकोशों, तारों और संख्याओं को कर सकता है।

कोड हैश info['pieces'] स्ट्रिंग में निहित लेता है:

torrent_file = open(sys.argv[1], "rb") 
metainfo = bencode.bdecode(torrent_file.read()) 
info = metainfo['info'] 
pieces = StringIO.StringIO(info['pieces']) 

कि स्ट्रिंग 20 बाइट हैश का एक उत्तराधिकार (प्रत्येक टुकड़ा के लिए एक) शामिल हैं। इन हैंशों की तब ऑन-डिस्क फ़ाइल के टुकड़ों के हैश की तुलना की जाती है।

इस कोड के केवल जटिल हिस्सा बहु फ़ाइल टोरेंट से निपटने है, क्योंकि एक भी धार टुकड़ा एक से अधिक फ़ाइल (आंतरिक BitTorrent एक भी सन्निहित फ़ाइल के रूप में बहु फ़ाइल डाउनलोड व्यवहार करता है) अवधि कर सकते हैं। मैं जनरेटर फ़ंक्शन pieces_generator() का उपयोग उस सार को दूर करने के लिए कर रहा हूं।

अधिक जानकारी में इसे समझने के लिए आप BitTorrent spec पढ़ना चाहेंगे।

पूर्ण bellow कोड:

import sys, os, hashlib, StringIO, bencode 

def pieces_generator(info): 
    """Yield pieces from download file(s).""" 
    piece_length = info['piece length'] 
    if 'files' in info: # yield pieces from a multi-file torrent 
     piece = "" 
     for file_info in info['files']: 
      path = os.sep.join([info['name']] + file_info['path']) 
      print path 
      sfile = open(path.decode('UTF-8'), "rb") 
      while True: 
       piece += sfile.read(piece_length-len(piece)) 
       if len(piece) != piece_length: 
        sfile.close() 
        break 
       yield piece 
       piece = "" 
     if piece != "": 
      yield piece 
    else: # yield pieces from a single file torrent 
     path = info['name'] 
     print path 
     sfile = open(path.decode('UTF-8'), "rb") 
     while True: 
      piece = sfile.read(piece_length) 
      if not piece: 
       sfile.close() 
       return 
      yield piece 

def corruption_failure(): 
    """Display error message and exit""" 
    print("download corrupted") 
    exit(1) 

def main(): 
    # Open torrent file 
    torrent_file = open(sys.argv[1], "rb") 
    metainfo = bencode.bdecode(torrent_file.read()) 
    info = metainfo['info'] 
    pieces = StringIO.StringIO(info['pieces']) 
    # Iterate through pieces 
    for piece in pieces_generator(info): 
     # Compare piece hash with expected hash 
     piece_hash = hashlib.sha1(piece).digest() 
     if (piece_hash != pieces.read(20)): 
      corruption_failure() 
    # ensure we've read all pieces 
    if pieces.read(): 
     corruption_failure() 

if __name__ == "__main__": 
    main() 
+0

यह नहीं पता कि क्या ओपी की समस्या हल हो गई है, लेकिन यह निश्चित रूप से मेरा हल हो गया है (एक बार जब मैं बेनकोड पैकेज की टूटी हुई: http://stackoverflow.com/questions/2693963/importing-bittorrent-bencode-module)। धन्यवाद! –

+0

मैं हमेशा ऐसा टूल चाहता था, और यह लिखने के लिए पुराने आधिकारिक पायथन क्लाइंट में खोदने वाला था। धन्यवाद!! – netvope

-2

this के अनुसार, आप डेटा है कि लग रहा है के भाग के लिए खोज के द्वारा फ़ाइलों के md5sums को खोजने के लिए सक्षम होना चाहिए की तरह:

d[...]6:md5sum32:[hash is here][...]e

(एसएचए spec का हिस्सा नहीं है)

+1

बस आपके द्वारा लिंक किए गए पृष्ठ पर SHA की खोज करें, आप देखेंगे कि इसका व्यापक रूप से उपयोग किया जाता है। यह भी उद्धरण दें: 'md5sum: (वैकल्पिक) 32-वर्ण हेक्स [...] इसका उपयोग बिटटोरेंट द्वारा बिल्कुल नहीं किया जाता है, लेकिन इसमें कुछ प्रोग्रामों द्वारा शामिल किया गया है' –

+0

आह मैं देखता हूं, इसलिए कुछ 'डी [... ] 9: info_hash [लंबाई]: [SHA हैश] e' –

+1

मुझे डर नहीं है। जैसा कि मैंने प्रश्न टिप्पणी में उल्लेख किया है कि फाइलों के लिए कोई SHA1 हैश नहीं है लेकिन प्रत्येक छोटी फ़ाइल के टुकड़े के लिए। टुकड़े हैंश उपयोगी हैं क्योंकि उन्हें डाउनलोड प्रक्रिया में जल्दी से सत्यापित किया जा सकता है। जैसे ही आपके पास एक वैध टुकड़ा है, आप इसे अन्य सहकर्मियों के साथ साझा कर सकते हैं ... उसने कहा कि आपके एमडी 5 समाधान में सरल होने का लाभ है। यह सभी। टोरेंट फ़ाइलों में उपलब्ध होने की गारंटी नहीं है। –

16

यहां कैसे Iv ई निकाले धार फ़ाइल से हैश मान:

#!/usr/bin/python 

import sys, os, hashlib, StringIO 
import bencode 



def main(): 
    # Open torrent file 
    torrent_file = open(sys.argv[1], "rb") 
    metainfo = bencode.bdecode(torrent_file.read()) 
    info = metainfo['info'] 
    print hashlib.sha1(bencode.bencode(info)).hexdigest()  

if __name__ == "__main__": 
    main() 

यह चल आदेश के रूप में ही है:

transmissioncli -i test.torrent 2>/dev/null | grep "^hash:" | awk '{print $2}' 

आशा है, यह मदद करता है :)

+1

जो आपको देता है वह * धार की जानकारी हैश * है। –

+1

+1 क्योंकि यह वही है जब मैं "टोरेंट फ़ाइल से SHA1 हैश निकालने" के बारे में एक प्रश्न पर गया था। – sjy

+0

कोड का अच्छा छोटा टुकड़ा, बेनकोड डेबियन/उबंटू डिस्ट में नहीं है, इसलिए आपको इसे इंस्टॉल करने के लिए _pip करना होगा, या _python-bzrlib_ से 'bzrlib.bencode' मॉड्यूल का उपयोग करना आसान लगता है। – marcz

संबंधित मुद्दे