Problemas resueltos al detalle
-
Llegar a 68 caracteres desde una carga útil JSON ASCII de 49 caracteres y viceversa 5 pasos
La entrada es
eyJuYW1lIjoiU3BvY2siLCJyb2xlIjoic2NpZW50aXN0IiwiYWN0aXZlIjp0cnVlfQ==y la carga útil subyacente es el JSON ASCII de 49 caracteres{"name":"Spock","role":"scientist","active":true}. El panel muestra 68 para Caracteres y 68 para Bytes. Llega a 68 a partir de los 49 sin contar la cadena codificada y, a continuación, deshaz el camino.-
Base64 es un cambio de base, no un cifrado. 64 = 26, por lo que cada carácter de salida lleva 6 bits; 3 bytes de entrada llevan 24; y 6 divide a 24 de forma exacta. Ese es todo el formato: entran 3 bytes, salen 4 caracteres, sin resto.
-
49 bytes son 16 tríos completos y 1 byte sobrante. Los tríos son la parte fácil: 16 × 4 = 64 caracteres, cada uno de los cuales lleva 6 bits completos.
-
El byte huérfano es de donde proviene el relleno. 8 bits no es un múltiplo de 6, por lo que se completa con 4 bits a cero para llegar a 12, que son 2 caracteres, y 2 signos '=' completan el cuarteto. 64 + 2 + 2 = 68. Cada '=' marca una posición de carácter que no tenía bits propios.
-
Ambas filas del panel muestran 68, y esa coincidencia no dice nada sobre esta cadena. El alfabeto base64 es ASCII, por lo que cada carácter que emite es exactamente de 1 byte; la fila Bytes coincidiría con la fila Caracteres para cualquier entrada base64.
-
Ahora haz el proceso inverso. 68 ÷ 4 = 17 cuartetos, 17 × 3 = 51 huecos de byte, menos los 2 huecos que el relleno indica que están vacíos: 49. Acabas de recuperar el tamaño de la carga útil sin decodificar ni un solo byte de ella.
Respuesta
68 caracteres para 49 bytes, y los signos '=' son los que te permiten recuperar los 49 directamente del envoltorio. Esa inversión es la mitad útil. La longitud de una cadena base64 depende de la longitud de su carga útil y de nada más, de modo que puedes indicar el tamaño exacto de algo que no tienes permitido abrir, lo cual es una afirmación más contundente que la de cualquier detector de esta página sobre el contenido. La otra mitad es la cuenta a pagar. 4 caracteres por cada 3 bytes nunca mejora, por lo que base64 cuesta 4/3 en el límite: un archivo de 1 MiB llega como 1.398.104 caracteres, 341 KiB de puro empaquetado. Esta cadena sale peor parada, con 68/49 = 1,388, porque los 2 caracteres de relleno son un recargo fijo y 49 bytes es demasiado corto para diluirlo.
-
-
Bits aleatorios en un GUID/UUID v4 e identificadores generados antes de una repetición 6 pasos
La entrada es
550e8400-e29b-41d4-a716-446655440000, a la cual el panel llama GUID/UUID v4 mientras que también ofrece decodificarla como Base64URL. Calcula cuántos de sus bits se eligieron realmente al azar y cuántos identificadores de este tipo se pueden generar antes de que una repetición deje de ser improbable.-
Cuenta primero la estructura: 8-4-4-4-12 dígitos hexadecimales con 4 guiones entre los grupos, de modo que 32 + 4 = 36 caracteres, y la fila Bytes coincide en 36 porque los dígitos hexadecimales y los guiones son todos ASCII. Observa lo que valen esos 4 guiones. Se sitúan en posiciones fijas, por lo que llevan 0 bits.
-
Cada dígito hexadecimal son 4 bits, por lo que los 32 que cuentan albergan 128. Ese es el número que se suele citar para un UUID, y para esta cadena es demasiado alto.
-
El dígito 13 y el dígito 17 son la razón. El dígito 13 es 4 y es el campo de versión: un UUID versión 4 está obligado a poner un 4 ahí, por lo que esos 4 bits nunca fueron una elección. El dígito 17 es 'a', que es 1010 en binario, y sus 2 bits iniciales son la etiqueta de variante, fijada en 10. Gastar 6 bits en nombrar el formato deja 122.
-
El espacio es por tanto 2122, aproximadamente 5,32 × 1036, no los 3,40 × 1038 que habrían dado 128 bits.
-
Las repeticiones siguen la regla del cumpleaños en lugar del tamaño del espacio. Al extraer n identificadores al azar, la probabilidad de que algún par coincida crece como n2/(2N), y fijar eso en 0,5 da n = 1,177√N. El recuento evoluciona con la raíz cuadrada, motivo por el cual los 6 bits perdidos en el paso 3 cuestan un factor de 8 y no un factor de 64.
-
√N es 2,31 × 1018, por lo que n resulta ser 2,7 × 1018.
Respuesta
122 bits, y 2,7 × 1018 UUIDs antes de que la probabilidad de cualquier repetición alcance 0,5. Generados a razón de 109 por segundo eso son 86 años, y es todo el argumento para permitir que cada máquina genere el suyo propio sin registro ni coordinación: no un protocolo, simplemente un número demasiado grande como para alcanzarlo. Ponlo junto al primer problema y el contraste es el propósito de esta página. Base64 empaqueta 6 bits en cada carácter; esta cadena emplea 36 caracteres para 122 bits, lo que supone 3,4 bits cada uno, por lo que el mismo identificador cabría en 21 caracteres base64url. Los otros 15 compran legibilidad, no información. Y la decodificación Base64URL que ofrece el panel vuelve marcada como binario en lugar de texto por la razón más simple disponible: nunca hubo nada codificado ahí dentro que encontrar.
-
Referencias (1)
- The alphabets and padding rules the detector reasons about, normatively: S. Josefsson, "The Base16, Base32, and Base64 Data Encodings." RFC 4648, IETF, 2006.