¿Por qué un mensaje cifrado a veces termina en “==”

22

Como ejercicio de programación necesito descifrar un mensaje. La única pista que tengo es que parece ser:

  • El mensaje codificado contiene solo caracteres Base64
  • una secuencia de n letras (n en 1,4,7,10) veces devuelve un mensaje cifrado con "==".
  • una secuencia de n letras (n en 2,5,8,11) veces devuelve un mensaje cifrado con "=".
  • una secuencia de n letras (n en 3,6,9,12) devuelve un mensaje cifrado sin un carácter específico.

No quiero una solución, solo me pregunto si esta secuencia de ocurrencias para el signo igual proporciona una pista o no.

Gracias.

    
pregunta czioutas 17.11.2015 - 10:23
fuente

3 respuestas

52

Los signos = se relacionan con la longitud de la cadena que se codifica en Base64 . Esencialmente, en probablemente la forma más común de Base64, = se usa como un carácter de relleno para garantizar que el último bloque se pueda decodificar correctamente.

Base64 no es cifrado, no hay ocultación, pero a menudo se utiliza para permitir que los datos binarios se envíen solo en forma de texto. Todos los caracteres utilizados en Base64 se pegarán correctamente y se pueden ingresar usando un teclado sin teclas modificador más allá del turno.

    
respondido por el Matthew 17.11.2015 - 11:06
fuente
3

Como se mencionó anteriormente, Base64, no es un cifrado sino una codificación. Como puede ver en el RFC que especificó el estándar, la base64 funciona de la siguiente manera.

  • Tienes un flujo de caracteres s, de longitud n.
  • Leyó 3 valores de 8 bits del flujo (ahora tiene un total de 24 bits = 3 bytes)
  • Rompe estos 24 bits en 4 grupos de 6 bits cada uno
  • Usando la tabla del alfabeto Base 64, codificas cada uno de los grupos de 6 bits al equivalente de Base64

Ahora, existe la posibilidad de que llegue al final del flujo y no tenga un grupo de 24 bits (s mod 6! = 0). Si esto sucede, agrega ceros al final de la entrada, hasta que tenga un número integral de grupos de 6 bits.

Dado que su flujo de entrada está codificado en ASCII, por lo que está compuesto de caracteres de 8 bits, solo hay dos casos en los que termina en el escenario anterior.

1) Tienes 8 bits en el último grupo

2) Tienes 16 bits en el último grupo

En el primer caso, se agregan 4 ceros (que le dan 12 bits) y la salida serían dos caracteres (2 * 6 bits = 12 bits) codificados según el alfabeto, y dos "=" caracteres de relleno

En el segundo caso, se agregarían 2 ceros (lo que da un total de 18 bits) y la salida sería de tres caracteres (3 * 6 bits = 18 bits) y un "=" carácter de relleno.

Así es como a veces terminas con uno, dos o no "=" al final del texto codificado. Para obtener más información, realmente debería leer el RFC que definió ese estándar y la entrada de wikipedia relacionada.

    
respondido por el G. Kaklam. 25.11.2015 - 13:12
fuente
1

Hay varios otros sistemas de codificación que usan el signo = que algunos incluyen:

ESAB46 (BASE64 hacia atrás)

ATOM128

MEGAN35

FERON74

Como ya se ha indicado, el = es filler / buffer para indicar la longitud del descodificador. Esta es la razón principal por la que los criptólogos buscan una mejor manera de hacer el almacenamiento en búfer porque ese = es un obsequio muerto.

    
respondido por el Chad Baxter 17.11.2015 - 13:42
fuente

Lea otras preguntas en las etiquetas