45

I am reading lately a lot about hash from torrents, and magnetic links, etc. But there is a question I don't understand.

I have:

  • hash of a file
  • and the infohash of a torrent

Is the infohash = hash of the file ?

If yes what if the torrent describes 6 Files to download?

If no what does it stand for?

2
  • 1
    possible duplicate of Hash calculation in torrent clients
    – Encombe
    Feb 5, 2015 at 16:34
  • 3
    no not realy, there is the information that the infohash is the hash over the infopart of a torrent. But what is the info part ?
    – Emetiel
    Feb 5, 2015 at 17:19

3 Answers 3

74

So I finally figured it out.

The “infohash” is the SHA1 Hash over the part of a torrent file that includes:

  1. ITEM: length(size) and path (path with filename)
  2. Name: The name to search for
  3. Piece length: The length(size) of a single piece
  4. Pieces: SHA1 Hash of EVERY piece of this torrent
  5. Private: flag for restricted access

To show this a little more I took a random torrent file and used the “BEncode Editor” from Ultima to make it more clearly to me.

BEncode Editor

As you can see the the red box marked the information part of the torrent file. The torrent file includes not the Hash of the items, but the hashes of every piece.

  • For item1 with: 1069496548
  • and item2 with: 223
  • It is together: 1069496771
  • With a piece size of: 524288
  • There are 2040 pieces. (1069496771/524288=2039.9032 approximately)
  • The pieces section includes 40800 byte of data what are 81600 + 2 chars in the file.
  • the +2 because 0x marks that this is hexadecimal.
  • A SHA1 hash has 40 0x chars or 20 Byte of data what are 2040 SHA1 hashes.

enter image description here

I am sorry that this information is about a torrent that leads to a illegal movie, but i wanted to use a torrent that realy exists.

3
  • 49
    If you need examples in the future, most linux distributions provide legal torrent downloads of their releases.
    – Tyzoid
    Jul 18, 2016 at 21:02
  • or try mininova Sep 21, 2016 at 18:41
  • 3
    @Emetiel How to get 20 byte info_hash string?
    – EmptyData
    Nov 18, 2016 at 17:23
18

I wanted to add another example, slightly more concrete.

We start with one of the smallest .torrent files i have:

64 34 3A 69 6E 66 6F 64 35 3A 66 69 6C 65 73 6C 64 36 3A 6C 65 6E 67 74 
68 69 36 31 35 65 34 3A 70 61 74 68 6C 32 36 3A 66 72 65 65 20 61 75 64 
69 6F 62 6F 6F 6B 20 76 65 72 73 69 6F 6E 2E 74 78 74 65 65 64 36 3A 6C 
65 6E 67 74 68 69 33 39 33 34 31 37 65 34 3A 70 61 74 68 6C 36 31 3A 57 
61 72 63 72 61 66 74 5F 20 4F 66 66 69 63 69 61 6C 20 4D 6F 76 69 65 20 
4E 6F 76 65 6C 69 7A 61 74 69 6F 6E 20 62 79 20 43 68 72 69 73 74 69 65 
20 47 6F 6C 64 65 6E 2E 65 70 75 62 65 65 65 34 3A 6E 61 6D 65 36 31 3A 
57 61 72 63 72 61 66 74 5F 20 4F 66 66 69 63 69 61 6C 20 4D 6F 76 69 65 
20 4E 6F 76 65 6C 69 7A 61 74 69 6F 6E 20 62 79 20 43 68 72 69 73 74 69 
65 20 47 6F 6C 64 65 6E 20 45 50 55 42 31 32 3A 70 69 65 63 65 20 6C 65 
6E 67 74 68 69 31 30 34 38 35 37 36 65 36 3A 70 69 65 63 65 73 32 30 3A 
43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 65 65

If we decode the BEncoding:

64                                             ; DICTIONARY (d)
|  34 3A 69 6E 66 6F                           ;  - 4:info
|  64                                          ;  - DICTIONARY (d)
|  |  35 3A 66 69 6C 65 73                     ;     - 5:files
|  |  6C                                       ;     - LIST (l)
|  |  |  64                                    ;        - DICTIONARY (d)
|  |  |  |  36 3A 6C 65 6E 67 74 68            ;           - 6:length
|  |  |  |  69 36 31 35 65                     ;           - i615e
|  |  |  |  34 3A 70 61 74 68                  ;           - 4:path
|  |  |  |  6C                                 ;           - LIST (l)
|  |  |  |  |  32 36 3A 66 72 65 65 20 61 75   ;              - 26:free audiobook verison.txt
|  |  |  |  |  64 69 6F 62 6F 6F 6B 20 76 65   ;                  
|  |  |  |  |  72 73 69 6F 6E 2E 74 78 74      ;                  
|  |  |  |  65                                 ;              - END (e)
|  |  |  65                                    ;           - END (e)
|  |  |  64                                    ;           - DICTIONARY (d)
|  |  |  |  36 3A 6C 65 6E 67 74 68            ;              - 6:length
|  |  |  |  69 33 39 33 34 31 37 65            ;              - i393417e
|  |  |  |  34 3A 70 61 74 68                  ;              - 4:path
|  |  |  |  6C                                 ;              - LIST (l)
|  |  |  |  |  36 31 3A 57 61 72 63 72 61 66   ;                 - 61:Warcraft_ Official Movie Novelization by Christie Golden.epub
|  |  |  |  |  74 5F 20 4F 66 66 69 63 69 61   ;                  
|  |  |  |  |  6C 20 4D 6F 76 69 65 20 4E 6F   ;                  
|  |  |  |  |  76 65 6C 69 7A 61 74 69 6F 6E   ;                  
|  |  |  |  |  20 62 79 20 43 68 72 69 73 74   ;                  
|  |  |  |  |  69 65 20 47 6F 6C 64 65 6E 2E   ;                  
|  |  |  |  |  65 70 75 62                     ;                  
|  |  |  |  65                                 ;              - END (e)
|  |  |  65                                    ;           - END (e)
|  |  65                                       ;        - END (e)
|  |  34 3A 6E 61 6D 65                        ;        - 4:name
|  |  36 31 3A 57 61 72 63 72 61 66            ;        - 61:Warcraft_ Official Movie Novelization by Christie Golden EPUB 
|  |  74 5F 20 4F 66 66 69 63 69 61            ;         
|  |  6C 20 4D 6F 76 69 65 20 4E 6F            ;         
|  |  76 65 6C 69 7A 61 74 69 6F 6E            ;         
|  |  20 62 79 20 43 68 72 69 73 74            ;         
|  |  69 65 20 47 6F 6C 64 65 6E 20            ;         
|  |  45 50 55 42                              ;          
|  |  31 32 3A 70 69 65 63 65 20 6C            ;        - 12:piece length
|  |  65 6E 67 74 68                           ;         
|  |  69 31 30 34 38 35 37 36 65               ;        - i10485765e
|  |  36 3A 70 69 65 63 65 73                  ;        - 6:pieces
|  |  32 30 3A 43 92 4C 22 BB 42 9E            ;        - 20:43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 65 65
|  |  EA BD FF 66 C6 79 4C 29 E4 F9            ;
|  |  D0 F3 B9                                 ;
|  65                                          ;     - END (e)
65                                             ;  - END (e)

Or, in pseudo-json:

{
   info: {
      files: [
         { length: 615,    path: ["free audiobook verison.txt"] },
         { length: 393417, path: ["Warcraft_ Official Movie Novelization by Christie Golden.epub"] }
      ],
      name:           "Warcraft_ Official Movie Novelization by Christie Golden EPUB",
      "piece length": 10485765,
      pieces:         43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 65 65
   }
}

InfoHash is hash of the info

The InfoHash is the SHA-1 hash of the info dictionary contents.

We want to take the SHA-1 hash of value of the info dictionary key:

64                                          ;  - DICTIONARY (d)
|  35 3A 66 69 6C 65 73                     ;     - 5:files
|  6C                                       ;     - LIST (l)
|  |  64                                    ;        - DICTIONARY (d)
|  |  |  36 3A 6C 65 6E 67 74 68            ;           - 6:length
|  |  |  69 36 31 35 65                     ;           - i615e
|  |  |  34 3A 70 61 74 68                  ;           - 4:path
|  |  |  6C                                 ;           - LIST (l)
|  |  |  |  32 36 3A 66 72 65 65 20 61 75   ;              - 26:free audiobook verison.txt
|  |  |  |  64 69 6F 62 6F 6F 6B 20 76 65   ;                  
|  |  |  |  72 73 69 6F 6E 2E 74 78 74      ;                  
|  |  |  65                                 ;              - END (e)
|  |  65                                    ;           - END (e)
|  |  64                                    ;           - DICTIONARY (d)
|  |  |  36 3A 6C 65 6E 67 74 68            ;              - 6:length
|  |  |  69 33 39 33 34 31 37 65            ;              - i393417e
|  |  |  34 3A 70 61 74 68                  ;              - 4:path
|  |  |  6C                                 ;              - LIST (l)
|  |  |  |  36 31 3A 57 61 72 63 72 61 66   ;                 - 61:Warcraft_ Official Movie Novelization by Christie Golden.epub
|  |  |  |  74 5F 20 4F 66 66 69 63 69 61   ;                  
|  |  |  |  6C 20 4D 6F 76 69 65 20 4E 6F   ;                  
|  |  |  |  76 65 6C 69 7A 61 74 69 6F 6E   ;                  
|  |  |  |  20 62 79 20 43 68 72 69 73 74   ;                  
|  |  |  |  69 65 20 47 6F 6C 64 65 6E 2E   ;                  
|  |  |  |  65 70 75 62                     ;                  
|  |  |  65                                 ;              - END (e)
|  |  65                                    ;           - END (e)
|  65                                       ;        - END (e)
|  34 3A 6E 61 6D 65                        ;        - 4:name
|  36 31 3A 57 61 72 63 72 61 66            ;        - 61:Warcraft_ Official Movie Novelization by Christie Golden EPUB 
|  74 5F 20 4F 66 66 69 63 69 61            ;         
|  6C 20 4D 6F 76 69 65 20 4E 6F            ;         
|  76 65 6C 69 7A 61 74 69 6F 6E            ;         
|  20 62 79 20 43 68 72 69 73 74            ;         
|  69 65 20 47 6F 6C 64 65 6E 20            ;         
|  45 50 55 42                              ;          
|  31 32 3A 70 69 65 63 65 20 6C            ;        - 12:piece length
|  65 6E 67 74 68                           ;         
|  69 31 30 34 38 35 37 36 65               ;        - i10485765e
|  36 3A 70 69 65 63 65 73                  ;        - 6:pieces
|  32 30 3A 43 92 4C 22 BB 42 9E            ;        - 20:43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 65 65
|  EA BD FF 66 C6 79 4C 29 E4 F9            ;
|  D0 F3 B9                                 ;
65                                          ;     - END (e)

We run all these bytes together:

64 35 3A 66 69 6C 65 73 6C 64 36 3A 6C 65 6E 67 74 68 69 36 31 35 65 34 
3A 70 61 74 68 6C 32 36 3A 66 72 65 65 20 61 75 64 69 6F 62 6F 6F 6B 20 
76 65 72 73 69 6F 6E 2E 74 78 74 65 65 64 36 3A 6C 65 6E 67 74 68 69 33 
39 33 34 31 37 65 34 3A 70 61 74 68 6C 36 31 3A 57 61 72 63 72 61 66 74 
5F 20 4F 66 66 69 63 69 61 6C 20 4D 6F 76 69 65 20 4E 6F 76 65 6C 69 7A 
61 74 69 6F 6E 20 62 79 20 43 68 72 69 73 74 69 65 20 47 6F 6C 64 65 6E 
2E 65 70 75 62 65 65 65 34 3A 6E 61 6D 65 36 31 3A 57 61 72 63 72 61 66 
74 5F 20 4F 66 66 69 63 69 61 6C 20 4D 6F 76 69 65 20 4E 6F 76 65 6C 69 
7A 61 74 69 6F 6E 20 62 79 20 43 68 72 69 73 74 69 65 20 47 6F 6C 64 65 
6E 20 45 50 55 42 31 32 3A 70 69 65 63 65 20 6C 65 6E 67 74 68 69 31 30 
34 38 35 37 36 65 36 3A 70 69 65 63 65 73 32 30 3A 43 92 4C 22 BB 42 9E 
EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 65

And then take the SHA-1 hash to generate a 160-bit (20-byte) digest:

7EDA978ED7628595BB91C48B947F025BAE78CB77

Which is the right answer:

enter image description here

3
  • Shouldn't the big hex at "We run all these bytes together" finish by F9 D0 F3 B9 65 65 65 (that is, 3* 65 at the end instead of one. I find this hash: 61FF4229183898FC2A184CEC914A933903DAFEEA. Why does 20:43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 65 65 translate to 32 30 3A 43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 ?
    – lud
    Jun 18, 2022 at 23:03
  • @lud No. The info dictionary ends with ... E4 F9 D0 F3 B9 65. And when you hash the info dictionary using sha-1 you get 7eda978ed7628595bb91c48b947f025bae78cb77. That is the info dictionary hash, also known as the "infohash".
    – Ian Boyd
    Jun 28, 2022 at 17:10
  • Yeah sorry. I think there is a copy paste error, 20:43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9 65 65 should be 20:43 92 4C 22 BB 42 9E EA BD FF 66 C6 79 4C 29 E4 F9 D0 F3 B9. But I find the good hash now. Thank you.
    – lud
    Jul 5, 2022 at 16:40
1

Here's how to pull the pertinent segment of a *.torrent datum for a bittorrent “info hash”.

I made this for an example.

0000000: 6438 3A61 6E6E 6F75 6E63 6530 3A31 303A  d8:announce0:10:
0000010: 6372 6561 7465 6420 6279 3133 3A6D 6B74  created by13:mkt
0000020: 6F72 7265 6E74 2031 2E30 3133 3A63 7265  orrent 1.013:cre
0000030: 6174 696F 6E20 6461 7465 6931 3537 3037  ation datei15707
0000040: 3530 3238 3565 343A 696E 666F 6436 3A6C  50285e4:infod6:l
0000050: 656E 6774 6869 3230 6534 3A6E 616D 6534  engthi20e4:name4
0000060: 3A70 7269 7631 323A 7069 6563 6520 6C65  :priv12:piece le
0000070: 6E67 7468 6932 3632 3134 3465 363A 7069  ngthi262144e6:pi
0000080: 6563 6573 3230 3AF1 D7EE 4236 3434 D06F  eces20:...B644.o
0000090: 27C4 BBAD 87F0 F089 7A22 2B37 3A70 7269  '.......z"+7:pri
00000a0: 7661 7465 6931 6565 65                   vatei1eee

The content of the “info” key is between (inclusive) offsets 0x4D and 0xA7. So…

#!/crit/shell/bsh
bbe  \
    -e '
        d 0x0 0x4C ;
        d 0xA8 * ;
      '  \
    ${example}   \
 |
shasum  -a 1  -b

You should see this:

1799a58b9f8ff2b9b9bcecd0d438c5f37f19a31c *-

Here is the xxd output, in–lieu of shasum, for more elucidation:

0000000: 6436 3A6C 656E 6774 6869 3230 6534 3A6E  d6:lengthi20e4:n
0000010: 616D 6534 3A70 7269 7631 323A 7069 6563  ame4:priv12:piec
0000020: 6520 6C65 6E67 7468 6932 3632 3134 3465  e lengthi262144e
0000030: 363A 7069 6563 6573 3230 3AF1 D7EE 4236  6:pieces20:...B6
0000040: 3434 D06F 27C4 BBAD 87F0 F089 7A22 2B37  44.o'.......z"+7
0000050: 3A70 7269 7661 7465 6931 6565            :privatei1ee

You can refer to The BitTorrent Protocol Specification for an explanation, albeit a terse and rather grammatically inelegant one, as to their nomenclature and why the final 0x65 needs be excluded.
Concisely: the entire datum is encased in a pair of US-ASCII ‘d’ and ‘e’; the content of the “info” key, or field, is similarly so encased. You want everything between the first 0x64 — ‘d’, — which succeeds the US-ASCII string 4:info, and the terminal 0x65 — ‘e’, — which is paired with the aforementioned 0x64.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.