Problemas resolvidos na íntegra
-
Chegar a 68 carateres a partir de um payload JSON ASCII de 49 carateres e voltar 5 passos
A entrada é
eyJuYW1lIjoiU3BvY2siLCJyb2xlIjoic2NpZW50aXN0IiwiYWN0aXZlIjp0cnVlfQ==e a carga útil sob ela é o JSON ASCII de 49 carateres{"name":"Spock","role":"scientist","active":true}. O painel apresenta 68 para Carateres e 68 para Bytes. Chegue a 68 a partir de 49 sem contar a cadeia codificada — e depois faça o caminho inverso.-
O Base64 é uma mudança de base, não uma cifra. 64 = 26, pelo que cada carater de saída transporta 6 bits; 3 bytes de entrada transportam 24; e 6 divide 24 exatamente. É este todo o formato: 3 bytes de entrada, 4 carateres de saída, sem resto.
-
49 bytes são 16 triplos completos com 1 byte sobrante. Os triplos são a parte fácil — 16 × 4 = 64 carateres, cada um deles a transportar 6 bits completos.
-
O byte órfão é a origem do preenchimento. 8 bits não é um múltiplo de 6, pelo que é complementado com 4 bits a zero para perfazer 12, o que corresponde a 2 carateres, e 2 sinais '=' completam o quarteto. 64 + 2 + 2 = 68. Cada '=' assinala uma posição de carater que não tinha bits próprios.
-
Ambas as linhas do painel indicam 68, e essa concordância nada diz sobre esta cadeia. O alfabeto base64 é ASCII, pelo que cada carater emitido é exatamente 1 byte; a linha Bytes acompanharia a linha Carateres para qualquer entrada em base64.
-
Agora faça o inverso. 68 ÷ 4 = 17 quartetos, 17 × 3 = 51 posições de byte, menos as 2 posições que o preenchimento indica estarem vazias: 49. Acabou de recuperar o tamanho da carga útil sem descodificar um único byte da mesma.
Resposta
68 carateres para 49 bytes, e os sinais '=' são o que permite ler o 49 diretamente a partir do invólucro. Essa inversão é a metade útil. O comprimento de uma cadeia base64 depende do comprimento da sua carga útil e de mais nada, pelo que pode indicar o tamanho exato de algo que não tem permissão para abrir — o que é uma afirmação mais forte do que qualquer detetor nesta página faz sobre o conteúdo. A outra metade é a conta a pagar. 4 carateres por 3 bytes nunca melhora, pelo que o base64 custa 4/3 no limite: um ficheiro de 1 MiB chega como 1 398 104 carateres, 341 KiB de puro empacotamento. Esta cadeia faz pior, com 68/49 = 1,388, porque os 2 carateres de preenchimento são uma sobretaxa fixa e 49 bytes é demasiado curto para a diluir.
-
-
Bits aleatórios num GUID/UUID v4 e identificadores criados antes de uma repetição 6 passos
A entrada é
550e8400-e29b-41d4-a716-446655440000, que o painel classifica como GUID/UUID v4 ao mesmo tempo que oferece a opção de a descodificar como Base64URL. Calcule quantos dos seus bits foram efetivamente escolhidos ao acaso e quantos identificadores deste tipo podem ser gerados antes que uma repetição deixe de ser improvável.-
Conte primeiro a estrutura: 8-4-4-4-12 dígitos hexadecimais com 4 hífenes entre os grupos, ou seja, 32 + 4 = 36 carateres, e a linha Bytes coincide em 36 porque os dígitos hexadecimais e os hífenes são todos ASCII. Note o valor desses 4 hífenes. Estão em posições fixas, pelo que transportam 0 bits.
-
Cada dígito hexadecimal tem 4 bits, pelo que os 32 que contam contêm 128. Esse é o número habitualmente indicado para um UUID, e para esta cadeia é demasiado elevado.
-
O dígito 13 e o dígito 17 são a razão. O dígito 13 é 4 e corresponde ao campo da versão — um UUID de versão 4 é obrigado a colocar um 4 nessa posição, pelo que esses 4 bits nunca foram uma escolha. O dígito 17 é 'a', que é 1010 em binário, e os seus 2 bits iniciais são a etiqueta de variante, fixa em 10. Gastar 6 bits a definir o formato deixa 122.
-
O espaço é, portanto, 2122, cerca de 5,32 × 1036 — e não os 3,40 × 1038 que 128 bits teriam proporcionado.
-
As repetições seguem a regra do aniversário em vez do tamanho do espaço. Ao extrair n identificadores ao acaso, a probabilidade de algum par coincidir cresce como n2/(2N), e igualar essa probabilidade a 0,5 resulta em n = 1,177√N. A contagem varia com a raiz quadrada, razão pela qual os 6 bits perdidos no passo 3 custam um fator de 8 e não um fator de 64.
-
√N é 2,31 × 1018, pelo que n resulta em 2,7 × 1018.
Resposta
122 bits, e 2,7 × 1018 UUIDs antes que a probabilidade de qualquer repetição atinja 0,5. Gerados a 109 por segundo, isso equivale a 86 anos, sendo este todo o argumento para permitir que cada máquina gere o seu próprio sem registo e sem coordenação — não é um protocolo, apenas um número demasiado grande para ser alcançado. Coloque este problema ao lado do primeiro e o contraste revela a finalidade desta página. O Base64 agrupa 6 bits em cada carater; esta cadeia gasta 36 carateres em 122 bits, o que equivale a 3,4 bits por carater, pelo que o mesmo identificador caberia em 21 carateres base64url. Os outros 15 compram legibilidade, não informação. E a descodificação em Base64URL oferecida pelo painel regressa assinalada como binário em vez de texto pela razão mais simples possível: nunca nada foi codificado ali para ser encontrado.
-
Referências (1)
- The alphabets and padding rules the detector reasons about, normatively: S. Josefsson, "The Base16, Base32, and Base64 Data Encodings." RFC 4648, IETF, 2006.