2017-09-03 6 views
1

code ci-dessous (excuses pour la laideur), je suis en ce pour calculer le hachage pour un torrent, mais il me donne une réponse différente que quand j'ouvre ce torrent directement dans la transmission:python3 calcul torrent hachage

I « m test sur r_000 sur cette page: http://gen.lib.rus.ec/repository_torrent/

Transmission me donne: 63a04291a8b266d968aa7ab8a276543fa63a9e84

Mon code me donne: 1882ff6534ee4aa660e2fbf225c1796638bea4c0

import bencoding 
from io import BytesIO 
import binascii 
import hashlib 

with open("cache/r_000.torrent", "rb") as f: 
    data = bencoding.bdecode(f.read()) 
info = data[b'info'] 
hashed_info = hashlib.sha1(info[b'pieces']).hexdigest() 
print(hashed_info) 

Une idée de ce que j'ai foiré? Merci!

+0

Cela a déjà été demandé. Jetez un oeil à [cette réponse] (https://stackoverflow.com/a/28162042/3151902). – user3151902

+0

On dirait que vous êtes en train de hacher la valeur de 'pieces' au lieu du dictionnaire' info'- – Encombe

+0

Oui, il fallait prendre du recul et regarder à nouveau. Ok, donc la solution est de bencoder tout le dictionnaire d'info, puis hacher cela. –

Répondre

1

J'ai fait la même erreur. La recherche a trouvé cette question et cela m'a aidé à la résoudre. Mais pour le rendre plus clair pour les autres qui viennent de cette façon par des recherches sur la façon de le faire à partir python3 + c'est la solution explicite:

Change:

hashed_info = hashlib.sha1(info[b'pieces']).hexdigest() 

à:

hashed_info = hashlib.sha1(bencoding.bencode(info)).hexdigest() 

Merci à Encombe pour clarifier le hachage d'information ici: https://stackoverflow.com/questions/28140766/28162042#28162042

Le hachage dans un client torrent ou le hachage que vous trouvez dans un aimant-URI est le hachage SHA1 de la partie brute-info-dictionnaire bencodée d'un torrent-fichier .


Un exemple complet, mais est minimaliste:

import bencoding, hashlib 

objTorrentFile = open("r_0000.torrent", "rb") 
decodedDict = bencoding.bdecode(objTorrentFile.read()) 

info_hash = hashlib.sha1(bencoding.bencode(decodedDict[b"info"])).hexdigest() 
print(info_hash) 

Résultat:

$ python3 example.py 
63a04291a8b266d968aa7ab8a276543fa63a9e84 
+0

Bonne solution, mais gardez à l'esprit que dans de rares cas, Bdecoding puis Bencoding avant le hachage, peut donner le [mauvais info_hash] (https://stackoverflow.com/questions/19749085/calculating-the-info-hash-of-a-torrent-file/19800109#19800109). – Encombe

+0

Merci pour l'info supplémentaire. Comment pourrais-je empêcher un tel événement? Est-ce juste quand c'est dans le mauvais ordre et la librairie de décodage le trie que cela ne correspondra pas ou y a-t-il d'autres cas? La bibliothèque que j'utilise est en fait la bibliothèque [bencoder] (https://github.com/utdemir/bencoder) et je peux voir une partie qui trie. – CGar