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:

  1. Para iniciar debemos dividir el contenido original en bloques de 3 octetos o bytes. 8 * 3 = 24 bits
  2. Cada bloque de 24 bits se dividen en grupos de 6 bits, obteniendo 4 grupos como resultado. 24/6 = 4
  3. 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.
  4. 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.
  5. Cada caracter resultante será agregado al final de la cadena de texto hasta finalizar con el total de los datos.
  6. 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”

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”

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=”

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”

Decode(“SG9s”) = “Hol”

Implementación en Go

https://play.golang.org/p/chz9riQ1e7u

main.go.log