Descodificador de cadeias de codificação — cada camada identificada, cada suposição rotulada
Descodificador de cadeias de codificação
Um texto que passou por mais de um codificador é o caso normal, e não o exótico: um corpo JSON dentro de um token Base64, um URL dentro de uma linha de registo, um valor de formulário que foi escapado por percentagem e depois codificado em Base64 para poder viajar num cabeçalho. Esta página desfaz essas camadas uma a uma, indica a técnica usada em cada passo, mostra o grau de confiança e porquê, e lista as técnicas que rejeitou nesse passo para que possa discordar dela. Para quando o texto deixa de parecer codificado, quando atinge o limite de passos, ou quando o passo seguinte devolveria um texto que já foi visto. Nada é adivinhado em silêncio: uma técnica cujo alfabeto se sobrepõe a palavras comuns nunca é aplicada por si só, apenas é oferecida. Todo o processamento é feito localmente no seu navegador — os seus dados nunca são enviados para nenhum servidor.
Aplicar uma camada por si só apenas quando a confiança for pelo menos:
Parar depois de
Executa o limite de camadas acima de uma só vez. A mesma tabela é construída em qualquer dos casos, pelo que pode mudar para o modo passo a passo em qualquer momento.
Ou escolha uma técnica à mão:
Esta lista é o que a página consegue ver no texto neste momento. As cifras de rotação estão sempre incluídas, porque não podem ser detetadas de todo; também estão incluídas as opções que só se tornam reconhecíveis depois de os espaços em branco serem retirados de um texto dividido, que são marcadas como tal e nunca aplicadas por si só.
Texto codificado
Esta entrada é mais longa do que esta página gosta de executar sem perguntar, e a estimativa acima diz que pode demorar . Carregue em Desfazer a cadeia inteira de novo para avançar mesmo assim, ou encurte primeiro o texto.
O que a página vê no texto neste momento
(escreva ou cole algo primeiro)
(a cadeia aparecerá aqui)
Camadas, pela ordem em que foram retiradas
#
Técnica
Confiança
Entrada → resultado
Tamanho
Porquê esta
Por camada
Copiar devolve o texto tal como estava após essa camada. Repor elimina essa camada e todas as camadas acima dela, que é a forma de desfazer mais do que um passo de cada vez.
Resultado depois de0camada(s)(nada ainda)
O que é uma cadeia de codificação, e porque precisa de um descodificador próprio?
Uma camada é um codificador aplicado a um texto. Uma cadeia é dois ou mais deles aplicados um após o outro. Quase todos os exemplos do dia a dia têm esta forma: alguém precisa de pôr um bocado de binário — uma imagem, um token assinado — num sítio que só transporta texto, pelo que o codifica em Base64. Esse resultado Base64 tem depois de viajar num URL, pelo que é escapado por percentagem. Esse URL inteiro acaba depois numa linha de registo ou num ficheiro de configuração, pelo que as barras invertidas ou as aspas também são escapadas. O que vê quando encontra o problema é a camada mais exterior, e é ilegível pela razão simples de que as camadas internas continuam presentes.
Os descodificadores de finalidade única não ajudam nisso. Um descodificador Base64 alimentado com JTI2bHQlM0JiJTI2Z3QlM0JoaSUyNmx0JTNCJTJGYiUyNmd0JTNC produzirá uma resposta perfeitamente correta que continua ilegível, porque as escapagens por percentagem e as referências de caracteres ainda estão por cima do texto que queria. O que realmente precisa é de algo que decida, em cada passo, qual o codificador a retirar — e esta página é essa decisão tornada visível.
A codificação não é cifragem, e esta página não parte nada. Cada técnica desta página é uma forma pública e reversível de escrever a mesma informação. O Base64 não tem chave. A escapagem por percentagem não tem chave. Se a camada mais interna estiver cifrada, esta página descodifica as camadas exteriores e entrega-lhe o texto cifrado, dizendo-o claramente em vez de fingir que é um resultado. Não há nada aqui para executar e nada para esconder.
Os exemplos trabalhados desta página
Cada linha abaixo é uma entrada real do ficheiro de dados desta página, e a coluna do meio é o que o próprio desfazedor da página encontra nela. A última coluna é o texto que resta quando para.
O que é a entrada
Camadas encontradas
Entrada, entre aspas, tal como chega
O que resta quando para
Estas linhas são geradas pela página a partir da sua própria lista de casos e voltam a ser executadas em cada visita, pelo que não podem divergir do que o código faz. O autoteste abaixo verifica cada uma.
Como a página decide qual a camada a retirar
Olhe para a forma, e não para o significado. Cada técnica tem uma assinatura — uma escapagem por percentagem, um número par de dígitos hexadecimais, um alfabeto e um comprimento que encaixam no Base64. A página lista todas as técnicas cuja assinatura corresponde ao texto, com uma confiança entre 0 e 1.
Descodifique e depois verifique se o resultado é texto. Uma técnica só vale a pena aplicar se produzir algo legível. Cada candidata é de facto executada, e o seu resultado é avaliado pela quantidade de caracteres imprimíveis que contém.
Aplique apenas o que passa a fasquia, por ordem de confiança. O candidato de maior confiança acima do seu limiar é aplicado, e o processo repete-se sobre o resultado. Abaixo do limiar, as técnicas são listadas mas não aplicadas.
Uma regra que esta página acrescenta por cima. Mesmo quando uma técnica passa o limiar, esta página não a aplica por si só, a menos que o resultado seja realmente texto legível — os caracteres de substituição e os caracteres de controlo contam contra ele. Sem essa regra, a palavra comum cafe seria descodificada validamente como três bytes que só são imprimíveis em Latin-1, e getUserName seria descodificada validamente como oito bytes de ruído. O detetor tem razão em que essas cadeias encaixam no alfabeto; esta página decide que encaixar no alfabeto não basta. Pode ainda aplicá-las à mão, e a lista de candidatas diz-lhe que as recusou e porquê.
Parar, deliberadamente. Quando nenhuma técnica passa a fasquia, quando o texto deixa de mudar, quando é atingido o limite de passos, ou quando o passo seguinte devolveria um texto que já apareceu nesta cadeia. Este último ponto importa: o ROT13 é o seu próprio inverso, pelo que uma cadeia que pudesse dar esse passo duas vezes nunca terminaria.
Um texto dividido é oferecido, nunca aplicado. Se o texto estiver cortado por várias linhas, o detetor vê espaços em branco, lê prosa comum e não encontra nada. Por isso, a página retira os espaços em branco de uma cópia do texto, volta a perguntar ao detetor, e oferece o que encontrar como um passo a escolher à mão. Retirar espaços do seu texto é reescrever o seu texto, e esta página não reescreve nada que não lhe tenha pedido para reescrever.
O que esta página não faz
Descodifica, e nada mais. O texto que cola nunca é executado: sem eval, sem new Function, sem injeção de scripts, sem abrir um documento. Nunca é enviado para lado nenhum: sem envio, sem pedido, sem análises. Além do espaço publicitário no fundo da página e da linha de botões de partilha (são os únicos dois widgets de terceiros que esta página carrega), nenhum tipo de letra ou script é obtido de outro servidor. O resultado descodificado é escrito na página como texto, pelo que uma etiqueta HTML que saia de uma camada é apresentada como etiqueta e não é transformada em etiqueta. Pode verificar tudo isso: carregue em Autoteste e ele verifica o código-fonte desta página à procura de qualquer uma dessas construções, falhando se encontrar uma.
O que consegue reconhecer, e o que não consegue
Técnica
Quão certo, por si só
A armadilha
O texto citado nesta página foi escrito para este site. Os alfabetos Base64, Base32, Base58, Base91 e quoted-printable, bem como o formato de blocos uuencode, são os publicados; a descodificação segue essas definições e não as particularidades de qualquer ferramenta. Os vetores de referência dos alfabetos estão nas páginas irmãs, que trazem os vetores de teste da RFC 4648.
Texto que chega dividido por várias linhas
Um bloco que passou por uma mensagem de correio, um ficheiro PEM, um token num cabeçalho ou um hash colado a partir de um terminal costuma estar dividido: o codificador partiu-o numa coluna fixa — 76 caracteres é a convenção MIME — e pôs uma quebra de linha onde a coluna terminava. Essas quebras de linha não fazem parte dos dados. Existem para que uma linha longa sobreviva ao transporte, e espera-se que todo o descodificador que leia esse bloco as ignore.
Esta página não as ignora por conta própria, e a razão é a regra que usa em todo o lado. Os espaços em branco são o sinal único mais forte de que uma cadeia é prosa e não dados, e é esse o teste que impede que The quick brown fox jumps over the lazy dog. seja lido como coisa nenhuma. Um bloco dividido parece exatamente prosa para esse teste, pelo que a página não encontra nada nele — e depois faz a metade honesta do trabalho: calcula o que encontraria se os espaços em branco fossem retirados, lista isso no seletor manual marcado como espaços em branco fora primeiro, e fica por aí. Fica listado e não aplicado porque retirar espaços altera o seu texto, e esta página só altera textos quando consegue provar qual é a alteração. Aqui consegue provar qual é a alteração, e ainda assim recusa fazê-la por si, porque um texto com uma quebra de linha a meio de um valor e um texto com uma quebra de linha entre dois campos parecem iguais por dentro.
Os dois passos quando a página para num texto dividido. Mude para Avançar à mão, carregue Aplicar a camada seguinte uma vez (é isso que dá à página uma cadeia à qual acrescentar, e não altera nada), e depois escolha a entrada marcada como espaços em branco fora primeiro e carregue em Aplicar. A linha que surge diz quantos caracteres de espaço em branco foram removidos, e indica o tamanho da entrada como o texto que colou, pelo que a diferença entre as duas contagens dessa linha é exatamente o espaço em branco que saiu.
O mesmo raciocínio cobre os casos que vão no sentido contrário. Um bloco uuencode traz uma linha begin e um carácter de comprimento em cada linha, pelo que é reconhecível tal como está e é aplicado por si só; um corpo quoted-printable mantém as suas próprias quebras de linha suaves e é descodificado pelo seu próprio descodificador, que sabe que um único = no fim de uma linha é uma continuação e não dados. Quando um teste de forma não consegue distinguir prosa de dados, a página recusa e mostra-lhe a alternativa em vez de escolher por si.
O que esta página executa, e o que recusa
A tabela abaixo é construída a partir das mesmas constantes que a página aplica, pelo que uma linha e um aviso desta página não podem divergir. Os dois números que surpreendem as pessoas são as linhas Base58 e Base62: essas duas técnicas são convertidas por divisão longa cujo custo cresce com o quadrado do comprimento, pelo que esta página só as executa numa cadeia curta e diz isso no passo, em vez de parecer bloqueada.
As estimativas são deliberadamente pessimistas. Vêm de um sistema de medição de tempo e não da sua máquina, e um navegador de secretária costuma ser várias vezes mais rápido do que o valor indicado.
🔷 Ferramentas de codificação
Desfaz texto que foi codificado mais de uma vez, uma camada de cada vez.