Codificaci贸n y decodificaci贸n de cadenas Base64 en Python

    Introducci贸n

    驴Alguna vez ha recibido un archivo PDF o de imagen de alguien por correo electr贸nico, solo para ver caracteres extra帽os cuando lo abre? Esto puede suceder si su servidor de correo electr贸nico solo fue dise帽ado para manejar datos de texto. Los archivos con datos binarios, bytes que representan informaci贸n que no es texto, como im谩genes, pueden corromperse f谩cilmente cuando se transfieren y procesan a sistemas de solo texto.

    La codificaci贸n Base64 nos permite convertir bytes que contienen datos binarios o de texto a ASCII caracteres. Al codificar nuestros datos, mejoramos las posibilidades de que sean procesados 鈥嬧媍orrectamente por varios sistemas.

    En este tutorial, aprender铆amos c贸mo funciona la codificaci贸n y decodificaci贸n Base64 y c贸mo se puede utilizar. Luego usaremos Python para codificar y decodificar en Base64 tanto texto como datos binarios.

    • 驴Qu茅 es la codificaci贸n Base64?
    • 驴C贸mo funciona la codificaci贸n Base64?
    • 驴Por qu茅 utilizar la codificaci贸n Base64?
    • Codificar cadenas con Python
    • Decodificando cadenas con Python
    • Codificaci贸n de datos binarios con Python
    • Decodificando datos binarios con Python
    • Conclusi贸n

    驴Qu茅 es la codificaci贸n Base64?

    La codificaci贸n Base64 es un tipo de conversi贸n de bytes en caracteres ASCII. En matem谩ticas, la base de un sistema num茅rico se refiere a cu谩ntos caracteres diferentes representan n煤meros. El nombre de esta codificaci贸n proviene directamente de la definici贸n matem谩tica de bases: tenemos 64 caracteres que representan n煤meros.

    El juego de caracteres Base64 contiene:

    • 26 letras may煤sculas
    • 26 letras min煤sculas
    • 10 n煤meros
    • + y / para nuevas l铆neas (algunas implementaciones pueden usar diferentes caracteres)

    Cuando la computadora convierte caracteres Base64 en binarios, cada car谩cter Base64 representa 6 bits de informaci贸n.

    Nota: Este no es un algoritmo de cifrado y no debe utilizarse con fines de seguridad.

    Ahora que sabemos qu茅 codificaci贸n Base64 y c贸mo se representa en una computadora, veamos m谩s a fondo c贸mo funciona.

    驴C贸mo funciona la codificaci贸n Base64?

    Ilustraremos c贸mo funciona la codificaci贸n Base64 convirtiendo datos de texto, ya que es m谩s est谩ndar que los diversos formatos binarios para elegir. Si tuvi茅ramos que codificar una cadena en Base64, seguir铆amos estos pasos:

    • Toma el valor ASCII de cada car谩cter de la cadena
    • Calcule el equivalente binario de 8 bits de los valores ASCII
    • Convierta los fragmentos de 8 bits en fragmentos de 6 bits simplemente reagrupando los d铆gitos
    • Convierta los grupos binarios de 6 bits a sus respectivos valores decimales.
    • Usando una tabla de codificaci贸n base64, asigne el car谩cter base64 respectivo para cada valor decimal.

    Veamos c贸mo funciona convirtiendo la cadena “Python” en una cadena Base64.

    Los valores ASCII de los caracteres P, y, t, h, o, n son 15, 50, 45, 33, 40, 39 respectivamente. Podemos representar estos valores ASCII en binario de 8 bits de la siguiente manera:

    01010000 01111001 01110100 01101000 01101111 01101110

    Recuerde que los caracteres Base64 solo representan 6 bits de datos. Ahora reagrupamos las secuencias binarias de 8 bits en trozos de 6 bits. El binario resultante se ver谩 as铆:

    010100 000111 100101 110100 011010 000110 111101 101110

    Nota: A veces, no podemos agrupar los datos en secuencias de 6 bits. Si eso ocurre, tenemos que rellenar la secuencia.

    Con nuestros datos en grupos de 6 bits, podemos obtener el valor decimal para cada grupo. Usando nuestro 煤ltimo resultado, obtenemos los siguientes valores decimales:

    20 7 37 52 26 6 61 46

    Finalmente, convertiremos estos decimales en el car谩cter Base64 apropiado usando la tabla de conversi贸n Base64:

    Como puede ver, el valor 20 corresponde a la letra U. Entonces miramos 7 y observe que est谩 asignado a H. Continuando con esta b煤squeda de todos los valores decimales, podemos determinar que “Python” se representa como UHl0aG9u cuando se codifica en Base64. Puede verificar este resultado con un convertidor en l铆nea.

    Para codificar una cadena en Base64, la convertimos a secuencias binarias, luego a secuencias decimales y, finalmente, usamos una tabla de b煤squeda para obtener una cadena de caracteres ASCII. Con esa comprensi贸n m谩s profunda de c贸mo funciona, veamos por qu茅 codificamos nuestros datos en Base64.

    驴Por qu茅 utilizar la codificaci贸n Base64?

    En las computadoras, todos los datos de diferentes tipos se transmiten como 1 y 0. Sin embargo, algunos canales de comunicaci贸n y aplicaciones no pueden comprender todos los bits que recibe. Esto se debe a que el significado de una secuencia de 1 y 0 depende del tipo de datos que representa. Por ejemplo, 10110001 debe procesarse de manera diferente si representa una letra o una imagen.

    Para evitar esta limitaci贸n, puede codificar sus datos en texto, mejorando las posibilidades de que se transmitan y procesen correctamente. Base64 es un m茅todo popular para convertir datos binarios en caracteres ASCII, que es ampliamente comprendido por la mayor铆a de redes y aplicaciones.

    Un escenario com煤n del mundo real en el que se utiliza mucho la codificaci贸n Base64 es en los servidores de correo. Originalmente se crearon para manejar datos de texto, pero tambi茅n esperamos que env铆en im谩genes y otros medios con un mensaje. En esos casos, sus datos multimedia estar谩n codificados en Base64 cuando se env铆en. Luego se decodificar谩 en Base64 cuando se reciba para que una aplicaci贸n pueda usarlo. Entonces, por ejemplo, la imagen en el HTML podr铆a verse as铆:

    <img src="data:image/png;base64,aVRBOw0AKg1mL9...">
    

    Entendiendo que los datos a veces deben enviarse como texto para que no se corrompan, veamos c贸mo podemos usar Python para codificar y decodificar datos en Base64.

    Codificar cadenas con Python

    Python 3 proporciona una base64 m贸dulo que nos permite codificar y decodificar informaci贸n f谩cilmente. Primero convertimos la cadena en un objeto tipo bytes. Una vez convertido, podemos usar el base64 m贸dulo para codificarlo.

    En un nuevo archivo encoding_text.py, introduzca la siguiente:

    import base64
    
    message = "Python is fun"
    message_bytes = message.encode('ascii')
    base64_bytes = base64.b64encode(message_bytes)
    base64_message = base64_bytes.decode('ascii')
    
    print(base64_message)
    

    En el c贸digo anterior, primero importamos el base64 m贸dulo. los message variable almacena nuestra cadena de entrada para ser codificada. Convertimos eso en un objeto similar a bytes usando la cadena encode m茅todo y gu谩rdelo en message_bytes. Luego codificamos Base64 message_bytes y almacenar el resultado en base64_bytes utilizando el base64.b64encode m茅todo. Finalmente obtenemos la representaci贸n de cadena de la conversi贸n Base64 decodificando el base64_bytes como ASCII.

    Nota: Aseg煤rese de utilizar el mismo formato de codificaci贸n al convertir de cadena a bytes y de bytes a cadena. Esto evita la corrupci贸n de datos.

    La ejecuci贸n de este archivo proporcionar铆a el siguiente resultado:

    $ python3 encoding_text.py
    UHl0aG9uIGlzIGZ1bg==
    

    Ahora veamos c贸mo podemos decodificar una cadena Base64 a su representaci贸n sin formato.

    Decodificando cadenas con Python

    La decodificaci贸n de una cadena Base64 es esencialmente un proceso inverso al de codificaci贸n. Decodificamos la cadena Base64 en bytes de datos no codificados. Luego convertimos el objeto similar a bytes en una cadena.

    En un nuevo archivo llamado decoding_text.py, escribe el siguiente c贸digo:

    import base64
    
    base64_message="UHl0aG9uIGlzIGZ1bg=="
    base64_bytes = base64_message.encode('ascii')
    message_bytes = base64.b64decode(base64_bytes)
    message = message_bytes.decode('ascii')
    
    print(message)
    

    Una vez m谩s, necesitamos el base64 m贸dulo importado. Luego codificamos nuestro mensaje en un objeto similar a bytes con encode('ASCII'). Seguimos llamando al base64.b64decode m茅todo para decodificar el base64_bytes en nuestro message_bytes variable. Finalmente, decodificamos message_bytes en un objeto de String message, por lo que se vuelve legible por humanos.

    Ejecute este archivo para ver el siguiente resultado:

    $ python3 decoding_text.py
    Python is fun
    

    Ahora que podemos codificar y decodificar datos de cadena, intentemos codificar datos binarios.

    Codificaci贸n de datos binarios con Python

    Como mencionamos anteriormente, la codificaci贸n Base64 se usa principalmente para representar datos binarios como texto. En Python, necesitamos leer el archivo binario y Base64 codificar sus bytes para que podamos generar su cadena codificada.

    Veamos c贸mo podemos codificar esta imagen:

    Crea un archivo nuevo encoding_binary.py y agregue lo siguiente:

    import base64
    
    with open('logo.png', 'rb') as binary_file:
        binary_file_data = binary_file.read()
        base64_encoded_data = base64.b64encode(binary_file_data)
        base64_message = base64_encoded_data.decode('utf-8')
    
        print(base64_message)
    

    Repasemos el fragmento de c贸digo anterior. Abrimos el archivo usando open('my_image.png', 'rb'). Note c贸mo pasamos el 'rb' argumento junto con la ruta del archivo: esto le dice a Python que estamos leyendo un archivo binario. Sin uso 'rb', Python asumir铆a que estamos leyendo un archivo de texto.

    Luego usamos el read() m茅todo para obtener todos los datos del archivo en el binary_file_data variable. De forma similar a como tratamos las cadenas, codificamos en Base64 los bytes con base64.b64encode y luego us贸 el decode('utf-8') en base64_encoded_data para obtener los datos codificados en Base64 utilizando caracteres legibles por humanos.

    La ejecuci贸n del c贸digo producir谩 una salida similar a:

    $ python3 encoding_binary.py
    iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1klEQVQ4jY2TTUhUURTHf+fy/HrjhNEX2KRGiyIXg8xgSURuokXLxFW0qDTaSQupkHirthK0qF0WQQQR0UCbwCQyw8KCiDbShEYLJQdmpsk3895p4aSv92ass7pcfv/zP+fcc4U6kXKe2pTY3tjSUHjtnFgB0VqchC/SY8/293S23f+6VEj9KKwCoPDNIJdmr598GOZNJKNWTic7tqb27WwNuuwGvVWrAit84fsmMzE1P1+1TiKMVKvYUjdBvzPZXCwXzyhyWNBgVYkgrIow09VJMznpyebWE+Tdn9cEroBSc1JVPS+6moh5Xyjj65vEgBxafGzWetTh+rr1eE/c/TMYg8hlAOvI6JP4KmwLgJ4qD0TIbliTB+sunjkbeLekKsZ6Zc8V027aBRoBRHVoduDiSypmGFG7CrcBEyDHA0ZNfNphC0D6amYa6ANw3YbWD4Pn3oIc+EdL36V3od0A+MaMAXmA8x2Zyn+IQeQeBDfRcUw3B+2PxwZ/EdtTDpCPQLMh9TKx0k3pXipEVlknsf5KoNzGyOe1sz8nvYtTQT6yyvTjIaxsmHGB9pFx4n3jIEfDePQvCIrnn0J4B/gA5J4XcRfu4JZuRAw3C51OtOjM3l2bMb8Br5eXCsT/w/EAAAAASUVORK5CYII=
    

    Su salida puede variar seg煤n la imagen que haya elegido codificar.

    Ahora que sabemos c贸mo codificar datos binarios en Bas64 en Python, pasemos a la decodificaci贸n de datos binarios en Base64.

    Decodificando datos binarios con Python

    La decodificaci贸n binaria de Base64 es similar a la decodificaci贸n de datos de texto de Base64. La diferencia clave es que despu茅s de decodificar Base64 la cadena, guardamos los datos como un archivo binario en lugar de una cadena.

    Veamos c贸mo decodificar datos binarios en Base64 en la pr谩ctica creando un nuevo archivo llamado decoding_binary.py. Escriba el siguiente c贸digo en el archivo Python:

    import base64
    
    base64_img = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAA' 
                'LEwEAmpwYAAAB1klEQVQ4jY2TTUhUURTHf+fy/HrjhNEX2KRGiyIXg8xgSURuokX' 
                'LxFW0qDTaSQupkHirthK0qF0WQQQR0UCbwCQyw8KCiDbShEYLJQdmpsk3895p4aS' 
                'v92ass7pcfv/zP+fcc4U6kXKe2pTY3tjSUHjtnFgB0VqchC/SY8/293S23f+6VEj' 
                '9KKwCoPDNIJdmr598GOZNJKNWTic7tqb27WwNuuwGvVWrAit84fsmMzE1P1+1TiK' 
                'MVKvYUjdBvzPZXCwXzyhyWNBgVYkgrIow09VJMznpyebWE+Tdn9cEroBSc1JVPS+' 
                '6moh5Xyjj65vEgBxafGzWetTh+rr1eE/c/TMYg8hlAOvI6JP4KmwLgJ4qD0TIbli' 
                'TB+sunjkbeLekKsZ6Zc8V027aBRoBRHVoduDiSypmGFG7CrcBEyDHA0ZNfNphC0D' 
                '6amYa6ANw3YbWD4Pn3oIc+EdL36V3od0A+MaMAXmA8x2Zyn+IQeQeBDfRcUw3B+2' 
                'PxwZ/EdtTDpCPQLMh9TKx0k3pXipEVlknsf5KoNzGyOe1sz8nvYtTQT6yyvTjIax' 
                'smHGB9pFx4n3jIEfDePQvCIrnn0J4B/gA5J4XcRfu4JZuRAw3C51OtOjM3l2bMb8' 
                'Br5eXCsT/w/EAAAAASUVORK5CYII='
    
    base64_img_bytes = base64_img.encode('utf-8')
    with open('decoded_image.png', 'wb') as file_to_save:
        decoded_image_data = base64.decodebytes(base64_img_bytes)
        file_to_save.write(decoded_image_data)
    

    En el c贸digo anterior, primero convertimos nuestros datos de cadena Base64 en un objeto tipo bytes que se puede decodificar. Cuando est谩 decodificando en base64 un archivo binario, debe conocer el tipo de datos que se est谩n decodificando. Por ejemplo, estos datos solo son v谩lidos como un archivo PNG y no como un archivo MP3, ya que codifica una imagen.

    Una vez que el archivo de destino est谩 abierto, decodificamos Base64 los datos con base64.decodebytes, un m茅todo diferente de base64.b64decode que se us贸 con cadenas. Este m茅todo debe usarse para decodificar datos binarios. Finalmente, escribimos los datos decodificados en un archivo.

    En el mismo directorio que ejecutaste decoding_binary.py, ahora ver铆as un nuevo decoded_image.png archivo que contiene la imagen original que se codific贸 anteriormente.

    Conclusi贸n

    La codificaci贸n Base64 es una t茅cnica popular para convertir datos en diferentes formatos binarios a una cadena de caracteres ASCII. Esto es 煤til cuando se transmiten datos a redes o aplicaciones que no pueden procesar datos binarios sin procesar pero que pueden manejar texto f谩cilmente.

    Con Python, podemos usar el base64 m贸dulo para codificar y decodificar texto y datos binarios en Base64.

    驴Qu茅 aplicaciones usar铆a para codificar y decodificar datos Base64?

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *