Codificando/Decodificando Base64
Repo: https://github.com/umarquez/100DaysOfC0D3/tree/master/2-base64
Es un sistema de codificación binario→texto que utiliza 64 caracteres imprimibles como base para representar el contenido codificado, permitiendo que este sea manejado como cadena de texto y pueda ser enviado a través de la red o almacenado como texto plano.
Lista de caracteres:
Codificar:
- Para iniciar debemos dividir el contenido original en bloques de 3 octetos o bytes.
8 * 3 = 24 bits
- Cada bloque de 24 bits se dividen en grupos de 6 bits, obteniendo 4 grupos como resultado. 24/6 = 4
- Cada grupo será almacenado dentro de los 6 bits menos significativos de un nuevo octeto llenando los dos bits más significativos con cero 00.
- El número resultante representa una posición dentro de la lista de 64 caracteres, que van del 0 al 63 (0x00 -> 0x3F), por lo que el octeto será sustituido por el caracter dentro de la posición dada por su valor.
- Cada caracter resultante será agregado al final de la cadena de texto hasta finalizar con el total de los datos.
- Debido a que se espera que la cantidad de octetos de entrada sea múltiplo de 3, se deberán agregar signos “=” hasta alcanzar el siguiente múltiplo de 3 (1, 2 o ninguno, según sea el caso).
Ejemplo:
Procesaremos los 3 primeros octetos de la cadena de texto: Hola Mundo! de manera manual.
Base64("Hol") = "SG9s"
Nota: Como podemos observar la entrada han sido 3 octetos y la salida 4 octetos, esto quiere decir que el tamaño de nuestra información incrementará al rededor del 33%, debemos considerar esta incremento al momento de calcular el espacio necesario para almacenar y transmitir datos bajo esta codificación.
El siguiente diagrama explica a detalle el procesamiento de los 2 primeros bloques:
Base64(“Hola M”) = “SG9sYSBN”
Debido a que la cantidad de caracteres en Hola Mundo! no es múltiplo de 3 será necesario agregar un caracter “=”:| Hol | a_M | und | o!- | → =
El resultado final será:
Base64(“Hola Mundo!”) = “SG9sYSBNdW5kbyE=”
Decodificar
Para realizar el proceso de decodificación solo debemos recuperar la posición de cada caracter dentro de la lista, tomar los 6 bits menos significativos de cada grupo de 4 octetos 6 bits * 4 octetos = 24 bits / 8 = 3 bytes e ir rellenando las posiciones de 3 nuevos octetos con estos bits, estos octetos formarán parte de nuestro texto decodificado.
Decode(“SG9s”) = “Hol”