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
- 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.
- 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.
- 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.