2017-09-03 10 views
1

コード(醜さのために謝罪を)計算し、私は急流のためのハッシュを計算し、これを実行しているが、それは私がトランスミッションに直接その急流を開くとは異なる答えを与えている:のpython3は、以下の急流のハッシュ

Iこのページのr_000の「M・テスト:http://gen.lib.rus.ec/repository_torrent/

送信は私を与える:63a04291a8b266d968aa7ab8a276543fa63a9e84

私のコードは私に与える: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) 
0123を

私は何をねじ込みましたか?ありがとう!

+0

。 [この回答](https://stackoverflow.com/a/28162042/3151902)をご覧ください。 – user3151902

+0

あなたは 'info'-dictionaryの代わりに' pieces'-valueをハッシュしているようです。 – Encombe

+0

うん、やり直してもう一度見てください。さて、解決策は、情報辞書全体をbencodeし、それをハッシュすることです。 –

答えて

1

私は同じ間違いを犯しました。検索でこの質問が見つかったので、それを解決できました。しかし、のpython3からそれを行う方法で検索を経由してこの道のりを歩んで他の人のためにそれをより明確にするために+これは、明示的な修正です:

変更:

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

へ:

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

https://stackoverflow.com/questions/28140766/28162042#28162042

0のために Encombeに感謝します。

torrentクライアントのハッシュまたはmagnet-URIで見つかったハッシュは、 torrent-fileの部分である の生のbencoded info-dictionaryのSHA1-hashです。


フルが、ミニマルな例は次のとおりです。

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) 

結果:これはすでに求められている

$ python3 example.py 
63a04291a8b266d968aa7ab8a276543fa63a9e84 
+0

良い解決策ですが、まれにはBdecodingハッシュする前にBencodingすると[wrong info_hash](https://stackoverflow.com/questions/19749085/calculating-the-info-hash-of-a-torrent-file/19800109#19800109)と表示されることがあります。 – Encombe

+0

追加情報をありがとう。どのように私はそのような発生を防ぐだろうか?間違った順序とデコーダライブラリで並べ替えると、それが不一致になるか、他のケースがあるのでしょうか?私が使っているライブラリは実際には[bencoder](https://github.com/utdemir/bencoder)ライブラリであり、私はその部分を見ることができます。 – CGar

関連する問題