El algoritmo base64

Publicado el 12 noviembre 2016 por Juan Luis Lopez @ardufreak

Muy buenas majetes! Hoy vamos a hablar del algoritmo de cifrado base64.

¿Qué es el cifrado base64? ¿Para qué sirve este algoritmo? ¿Cómo se cifra? ¿Los elefantes comen los cacahuetes pelados o sin pelar?.

Bien, base64 es un sistema de cifrado que consta de 64 caracteres ASCII A-Z, a-z, 0-9 "+" y "/". Y que no requiere clave a la hora de cifrar no descifrar el mensaje, por lo que no es un sistema de encriptación. En resumen, Base 64 convierte cualquier cadena de texto que contenga caracteres ASCII en otra cadena de texto que solo tiene los caracteres A-Z, a-z, 0-9 "+" y "/".

Normalmente se emplea para cifrar cadenas de texto o para pasar parámetros por URL ya sean de texto o archivos (normalmente imágenes). También se emplea en el envío de correos electrónicos.

Curiosamente, el número 64 es el más alto que se puede generar con 6 bits y de esto trata este algoritmo. El proceso es muy sencillo. Se convierten los valores ASCII de los caracteres que forman el mensaje a binario, quedando 1 byte por cada caracter. Después se juntan todos los bytes y se separan en grupos de 6 bits. Como últmo paso se convierten esos grupos de 6 bits a letras según la tabla de caracteres base64 (que tiene el caracter "A" como 0 y el caracter "/" como 63).

Cifrando un texto en base64

Vamos a cifrar el texto "Ardufreak" (como no...) pasito a pasito...

Pasamos cada caracter a su valor an binario segun la tabla ASCII:

A = 01000001 r = 01110010 d = 01100100

Una vez convertidos, tenemos que poner todos los bits en una ristra,

010000010111001001100100011101010110011001110010011001010110000101101011

Y los separamos en grupos de 6 bits...

010000 010111 001001 100100 011101 010110 011001 110010 011001 010110 000101 101011

Y emplearemos la tabla base64 para asignar una letra a cada grupo de 6 bits

010000 010111 001001 100100 011101 010110 011001 110010 011001 010110 000101 101011

Q X J k d W Z y Z W F r

Así que nos quedaría la cadena : "QXJkdWZyZWFr"

En ocasiones, al agrupar los bits en grupos de 6, pueden quedar "residuos" al final de la cadena (bits que no forman un grupo de 6) y se soluciona añadiéndoles tantos ceros como bits falten fara rellenar el grupo de 6. Por ejemplo la cadena "Ardu" en binario es: 01000001011100100110010001110101. Si la separamos en grupos de 6 bits:

010000 010111 001001 100100 011101 010000

Q X J k d Q

Ahora viene lo "raro" y es que las cadenas resultantes tras el cifrado deben tener un numero de caracteres múltiplo de 4 y si no lo tienen se les añade tantos "=" como sean necesarios para que se cumpla. En nuestro primer caso (QXJkdWZyZWFr) la longitud de la cadena es 12, que es múltiplo de 4.

En el segundo caso (QXJkdQ) la longitud de la cadena es 6 por lo que hay que añadirle "==" para que la longitud sea múltiplo de 4.

Para descifrar una cadea en base64 solo tenéis que hacer el proceso inverso. A ver si conseguís (a mano) descifrar esto:

Tm9zIHZlbW9zIGVuIGVsIHByb3hpbW8gcG9zdA==

Hasta la próxima!