FreeToGenerate.com

Decodifica bencode e confere com as regras que o padrão do BitTorrent realmente enuncia, inclusive a que muda em silêncio a identidade de um torrent. Nada é enviado.

Cole bencode, ou abra um .torrent abaixo. Bytes não imprimíveis são resumidos, mas mantidos exatamente como estão.

Experimente:

Lido no seu navegador. O arquivo nunca é enviado.

Veredicto

Quebra uma regra que a especificação enuncia

Recodificar daria outros bytes

Não são a mesma pergunta. Uma chave repetida quebra as regras e ainda assim recodifica para bytes idênticos, de modo que uma simples comparação de ida e volta a daria por boa.

O que a especificação diz sobre isto

  • As chaves do dicionário estão fora de ordem. A especificação exige que apareçam ordenadas como strings de bytes brutos, não alfabeticamente, então maiúsculas vêm antes de minúsculas e uma chave curta vem antes de outra que a estende.no byte 56

Estrutura

  • { }
  • announcehttp://tracker.test
  • info { }
  • namefile.txt
  • length1024
  • piece length16384

Info-hash

Calculando...

Forma canônica

d8:announce19:http://tracker.test4:infod6:lengthi1024e4:name8:file.txt12:piece lengthi16384eee

A única codificação que a especificação admite para este valor.

Tudo roda no seu navegador. Nada é enviado, e recarregar a página apaga o que você digitou.

Também disponível em: English · Español · Français · العربية

Decodificador bencode: o formato com uma única resposta certa

Cole bencode ou abra um .torrent e veja sua estrutura, as regras que ele quebra e seu info-hash.

O que é bencode?

Bencode é a codificação que o BitTorrent usa nos arquivos .torrent e no tráfego com o tracker. Tem quatro tipos e quase nenhuma pontuação: uma string é o seu comprimento, dois-pontos e os bytes, então 4:spam é a palavra spam; um inteiro é um i, os dígitos e um e; uma lista é um l, o conteúdo e um e; um dicionário é um d, chaves e valores alternados, e um e. É o formato inteiro.

O que o torna incomum é ser canônico por construção. A especificação exige que as chaves de um dicionário apareçam ordenadas, proíbe i-0e e proíbe qualquer inteiro com zero à esquerda. Juntas, essas regras fazem com que um valor tenha exatamente uma codificação válida: não há espaços em branco que variem, nem ordem a escolher, nem jeito de escrever o mesmo número de duas formas.

Essa propriedade é a razão de terem escolhido bencode. Um torrent é identificado pelo SHA-1 do seu dicionário info, então a codificação precisa ser reproduzível byte a byte ou a identidade deixa de ser estável. Esta página decodifica o que você colar, aponta cada regra quebrada e calcula esse hash como a especificação exige.

Como usar

  1. Cole bencode, ou abra um .torrent. O arquivo é lido no seu navegador e nunca enviado. Bytes não imprimíveis são resumidos em vez de destruídos, e nada se perde no caminho.
  2. Leia o veredicto e os achados. São duas perguntas diferentes: se a entrada quebra uma regra enunciada, e se recodificá-la devolveria os mesmos bytes. Cada achado diz qual regra e onde.
  3. Compare os dois info-hash. Um vem dos bytes originais e o outro de decodificar e recodificar. Se divergirem, você está vendo exatamente o problema de que a especificação avisa.

Por que recodificar pode mudar a identidade de um torrent

O info-hash não é o hash do conteúdo do torrent em nenhum sentido abstrato. É o SHA-1 dos bytes do dicionário info exatamente como aparecem no arquivo. Então, se um programa decodifica um torrent e o codifica de novo, e o original não era perfeitamente canônico, os bytes mudam e o hash muda junto — e é esse hash que trackers e pares usam para identificar o torrent.

A especificação antecipa isso com um detalhe incomum. Diz que o info-hash é o que se obtém decodificando e recodificando somente se o decodificador validou totalmente a entrada, mencionando pelo nome a ordem das chaves e os zeros à esquerda. Depois diz que os clientes devem ou rejeitar arquivos inválidos ou extrair a substring diretamente, e que não devem fazer uma ida e volta de decodificação sobre dados inválidos. Especificações não costumam dedicar um parágrafo a uma hipótese.

E não é hipotético. Enquanto esta página era construída, uma biblioteca bencode muito usada foi testada contra as cinco formas que a especificação declara inválidas: chaves fora de ordem, uma chave repetida, i-0e, i03e e i-03e. Ela aceitou todas, recodificou cada uma para bytes diferentes e produziu um SHA-1 diferente nos cinco casos. Um documento válido passou pela mesma biblioteca byte a byte com o hash intacto, o que faz dessas cinco um comportamento da biblioteca e não um defeito do teste.

Por isso esta página calcula o hash a partir de um pedaço dos bytes que você deu, nunca recodificando-os, e mostra o recodificado ao lado apenas para você ver os dois se separarem.

Válido e canônico são perguntas diferentes

É tentador testar um documento bencode decodificando, codificando de novo e conferindo se os bytes batem. Isso pega chaves fora de ordem e zeros à esquerda, e é a verificação que quase qualquer ferramenta escolheria. Não pega tudo.

Um dicionário com a mesma chave duas vezes quebra a regra de ordenação, porque uma ordem ordenada não deixa espaço para repetição. Mas um decodificador que preserve as duas entradas vai escrevê-las de volta nos mesmos lugares, e os bytes voltam idênticos. A ida e volta diz que o documento está bom; a especificação diz que não. Então esta página responde as duas perguntas separadamente e diz qual é qual.

Há também uma regra que a especificação não enuncia. Ela proíbe zeros à esquerda em inteiros e dá i0e como única exceção, mas descreve uma string apenas como precedida do comprimento em base dez e nada diz sobre como esse comprimento pode ser escrito. Uma string introduzida como 03:abc é portanto estranha, não ilegal, e esta página a relata como observação sem contá-la no veredicto. Onde a especificação se abstém de decidir, a página também.

O que isto não diz

Não diz se um torrent é seguro, está completo ou aponta para algo útil. Ele lê estrutura, não sentido: os hashes das peças são só cadeias de bytes para ele, e não há tentativa de conferi-los contra nada. Um arquivo pode ser bencode perfeitamente canônico e ainda assim ser o torrent de algo que você não quer.

Ele também não afirma nada sobre nenhum cliente BitTorrent específico. A especificação diz o que um cliente deve fazer; o que qualquer um deles faz de fato não é algo que esta página possa observar, e nada aqui foi testado contra um.

Por fim, bencode é um formato de bytes, não de texto. Uma chave ou um valor podem conter qualquer byte, inclusive alguns que não são texto válido em codificação alguma, e os hashes das peças de um torrent real são exatamente isso. Esta página mantém cada byte intacto na ida e volta, e quando um valor não pode ser exibido como texto ela diz quantos bytes ele tem em vez de inventar caracteres que não estão lá.

Por que é grátis?

Decodificar bencode é manipulação de strings, e o hash é calculado pelo seu próprio navegador. Não há servidor no meio, então não há o que cobrar nem conta a criar.

Nada é enviado. Um .torrent que você abre é lido localmente e não sai da aba, o que aqui importa mais do que o normal.