Whiz Tools

Codificador/Decodificador Base64

Convierte texto a y desde la codificación Base64

Copiar

Codificador y Decodificador Base64

Introducción

Base64 es un esquema de codificación de texto a binario que representa datos binarios en un formato de cadena ASCII. Está diseñado para transportar datos almacenados en formatos binarios a través de canales que solo admiten de manera confiable contenido de texto. La codificación Base64 convierte datos binarios en un conjunto de 64 caracteres (de ahí el nombre) que pueden ser transmitidos de manera segura a través de protocolos basados en texto sin corrupción de datos.

El conjunto de caracteres Base64 consiste en:

  • Letras mayúsculas A-Z (26 caracteres)
  • Letras minúsculas a-z (26 caracteres)
  • Dígitos 0-9 (10 caracteres)
  • Dos caracteres adicionales, típicamente "+" y "/" (2 caracteres)

Esta herramienta te permite codificar fácilmente texto en formato Base64 o decodificar cadenas Base64 de vuelta a su texto original. Es particularmente útil para desarrolladores, profesionales de TI y cualquier persona que trabaje con datos que necesitan ser transmitidos de manera segura a través de canales basados en texto.

Cómo Funciona la Codificación Base64

Proceso de Codificación

La codificación Base64 funciona convirtiendo cada grupo de tres bytes (24 bits) de datos binarios en cuatro caracteres Base64. El proceso sigue estos pasos:

  1. Convierte el texto de entrada a su representación binaria (usando codificación ASCII o UTF-8)
  2. Agrupa los datos binarios en bloques de 24 bits (3 bytes)
  3. Divide cada bloque de 24 bits en cuatro grupos de 6 bits
  4. Convierte cada grupo de 6 bits en su correspondiente carácter Base64

Cuando la longitud de la entrada no es divisible por 3, se añade un relleno con caracteres "=" para mantener la proporción de 4:3 de longitudes de salida a entrada.

Representación Matemática

Para una secuencia de bytes b1,b2,b3b_1, b_2, b_3, los correspondientes caracteres Base64 c1,c2,c3,c4c_1, c_2, c_3, c_4 se calculan como:

c1=Base64[(b1>>2)]c_1 = \text{Base64}[(b_1 >> 2)] c2=Base64[((b1&3)<<4)(b2>>4)]c_2 = \text{Base64}[((b_1 \& 3) << 4) | (b_2 >> 4)] c3=Base64[((b2&15)<<2)(b3>>6)]c_3 = \text{Base64}[((b_2 \& 15) << 2) | (b_3 >> 6)] c4=Base64[(b3&63)]c_4 = \text{Base64}[(b_3 \& 63)]

Donde Base64[i]\text{Base64}[i] representa el carácter ii-ésimo en el alfabeto Base64.

Proceso de Decodificación

La decodificación Base64 invierte el proceso de codificación:

  1. Convierte cada carácter Base64 a su valor de 6 bits
  2. Concatenar estos valores de 6 bits
  3. Agrupa los bits en bloques de 8 bits (bytes)
  4. Convierte cada byte en su correspondiente carácter

Relleno

Cuando el número de bytes a codificar no es divisible por 3, se aplica relleno:

  • Si queda un byte, se convierte en dos caracteres Base64 seguidos de "=="
  • Si quedan dos bytes, se convierten en tres caracteres Base64 seguidos de "="

Ejemplo

Codifiquemos el texto "Hola" a Base64:

  1. Representación ASCII de "Hola": 72 111 108 97
  2. Representación binaria: 01001000 01101111 01101100 01100001
  3. Agrupando en bloques de 6 bits: 010010 000110 111101 101100 000001
  4. El último bloque solo tiene 2 bits, así que rellenamos con ceros: 010010 000110 111101 101100 00000100
  5. Convirtiendo a decimal: 18, 6, 61, 44, 1
  6. Buscando en el alfabeto Base64: S, G, V, s, Y
  7. El resultado es "SG9sYQ=="

Nota el relleno "=" al final porque la longitud de la entrada (4 bytes) no es divisible por 3.

Fórmula

La fórmula general para calcular la longitud de una cadena codificada en Base64 es:

longitud_codificada=4×longitud_entrada3\text{longitud\_codificada} = 4 \times \lceil \frac{\text{longitud\_entrada}}{3} \rceil

Donde x\lceil x \rceil representa la función techo (redondeando hacia arriba al entero más cercano).

Casos de Uso

La codificación Base64 se utiliza ampliamente en diversas aplicaciones:

  1. Adjuntos de Correo Electrónico: MIME (Extensiones de Correo de Internet Multipropósito) utiliza Base64 para codificar adjuntos binarios en correos electrónicos.

  2. URLs de Datos: Incrustando pequeñas imágenes, fuentes u otros recursos directamente en HTML, CSS o JavaScript utilizando el esquema de URL data:.

  3. Comunicaciones API: Transmitiendo de manera segura datos binarios en cargas útiles JSON u otros formatos de API basados en texto.

  4. Almacenamiento de Datos Binarios en Formatos de Texto: Cuando los datos binarios necesitan ser almacenados en XML, JSON u otros formatos basados en texto.

  5. Sistemas de Autenticación: La Autenticación Básica en HTTP utiliza la codificación Base64 (aunque no es para seguridad, solo para codificación).

  6. Criptografía: Como parte de varios protocolos y sistemas criptográficos, a menudo para codificar claves o certificados.

  7. Valores de Cookies: Codificando estructuras de datos complejas para ser almacenadas en cookies.

Alternativas

Si bien Base64 se utiliza ampliamente, existen alternativas que pueden ser más apropiadas en ciertas situaciones:

  1. Base64 Seguro para URL: Una variante que utiliza "-" y "_" en lugar de "+" y "/" para evitar problemas de codificación de URL. Útil para datos que se incluirán en URLs.

  2. Base32: Utiliza un conjunto de 32 caracteres, resultando en una salida más larga pero con mejor legibilidad humana e insensibilidad a mayúsculas y minúsculas.

  3. Codificación Hexadecimal: Conversión simple a hexadecimal, que es menos eficiente (duplica el tamaño) pero muy simple y ampliamente soportada.

  4. Transferencia Binaria: Para archivos grandes o cuando la eficiencia es crucial, los protocolos de transferencia binaria directa como HTTP con encabezados de tipo de contenido apropiados son preferibles.

  5. Compresión + Base64: Para grandes datos de texto, comprimir antes de codificar puede mitigar el aumento de tamaño.

  6. Serialización JSON/XML: Para datos estructurados, usar la serialización nativa JSON o XML puede ser más apropiado que la codificación Base64.

Historia

La codificación Base64 tiene sus raíces en los primeros sistemas de computación y telecomunicaciones donde los datos binarios necesitaban ser transmitidos a través de canales diseñados para texto.

La especificación formal de Base64 se publicó por primera vez en 1987 como parte de la RFC 989, que definió el Correo Electrónico Mejorado por Privacidad (PEM). Esto fue posteriormente actualizado en la RFC 1421 (1993) y la RFC 2045 (1996, como parte de MIME).

El término "Base64" proviene del hecho de que la codificación utiliza 64 caracteres ASCII diferentes para representar datos binarios. Esta elección de 64 caracteres fue deliberada, ya que 64 es una potencia de 2 (2^6), lo que hace que la conversión entre binario y Base64 sea eficiente.

Con el tiempo, han surgido varias variantes de Base64:

  • Base64 Estándar: Como se define en la RFC 4648, utilizando A-Z, a-z, 0-9, +, / y = para el relleno
  • Base64 Seguro para URL: Utiliza - y _ en lugar de + y / para evitar problemas de codificación de URL
  • Base64 Seguro para Nombres de Archivo: Similar a Base64 seguro para URL, diseñado para su uso en nombres de archivo
  • Base64 Modificado para IMAP: Utilizado en el protocolo IMAP con un conjunto diferente de caracteres especiales

A pesar de tener más de tres décadas, Base64 sigue siendo una herramienta fundamental en la computación moderna, particularmente con el auge de aplicaciones web y APIs que dependen en gran medida de formatos de datos basados en texto como JSON.

Ejemplos de Código

Aquí hay ejemplos de codificación y decodificación Base64 en varios lenguajes de programación:

// Codificación/Decodificación Base64 en JavaScript
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Cadena Base64 no válida");
  }
}

// Ejemplo de uso
const originalText = "Hola, Mundo!";
const encoded = encodeToBase64(originalText);
console.log("Codificado:", encoded);  // SG9sYSwgTXVuZG8h

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Decodificado:", decoded);  // Hola, Mundo!
} catch (error) {
  console.error(error.message);
}
# Codificación/Decodificación Base64 en Python
import base64

def encode_to_base64(text):
    # Convertir cadena a bytes y luego codificar
    text_bytes = text.encode('utf-8')
    base64_bytes = base64.b64encode(text_bytes)
    return base64_bytes.decode('utf-8')

def decode_from_base64(base64_string):
    try:
        # Convertir cadena base64 a bytes y luego decodificar
        base64_bytes = base64_string.encode('utf-8')
        text_bytes = base64.b64decode(base64_bytes)
        return text_bytes.decode('utf-8')
    except Exception as e:
        raise ValueError(f"Cadena Base64 no válida: {e}")

# Ejemplo de uso
original_text = "Hola, Mundo!"
encoded = encode_to_base64(original_text)
print(f"Codificado: {encoded}")  # SG9sYSwgTXVuZG8h

try:
    decoded = decode_from_base64(encoded)
    print(f"Decodificado: {decoded}")  # Hola, Mundo!
except ValueError as e:
    print(e)
// Codificación/Decodificación Base64 en Java
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class Base64Example {
    public static String encodeToBase64(String text) {
        byte[] textBytes = text.getBytes(StandardCharsets.UTF_8);
        byte[] encodedBytes = Base64.getEncoder().encode(textBytes);
        return new String(encodedBytes, StandardCharsets.UTF_8);
    }
    
    public static String decodeFromBase64(String base64String) {
        try {
            byte[] base64Bytes = base64String.getBytes(StandardCharsets.UTF_8);
            byte[] decodedBytes = Base64.getDecoder().decode(base64Bytes);
            return new String(decodedBytes, StandardCharsets.UTF_8);
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("Cadena Base64 no válida: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hola, Mundo!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Codificado: " + encoded);  // SG9sYSwgTXVuZG8h
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Decodificado: " + decoded);  // Hola, Mundo!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// Codificación/Decodificación Base64 en PHP
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Cadena Base64 no válida");
    }
    return $decoded;
}

// Ejemplo de uso
$originalText = "Hola, Mundo!";
$encoded = encodeToBase64($originalText);
echo "Codificado: " . $encoded . "\n";  // SG9sYSwgTXVuZG8h

try {
    $decoded = decodeFromBase64($encoded);
    echo "Decodificado: " . $decoded . "\n";  // Hola, Mundo!
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}
?>
// Codificación/Decodificación Base64 en C#
using System;
using System.Text;

class Base64Example
{
    public static string EncodeToBase64(string text)
    {
        byte[] textBytes = Encoding.UTF8.GetBytes(text);
        return Convert.ToBase64String(textBytes);
    }
    
    public static string DecodeFromBase64(string base64String)
    {
        try
        {
            byte[] base64Bytes = Convert.FromBase64String(base64String);
            return Encoding.UTF8.GetString(base64Bytes);
        }
        catch (FormatException)
        {
            throw new FormatException("Cadena Base64 no válida");
        }
    }
    
    static void Main()
    {
        string originalText = "Hola, Mundo!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Codificado: {encoded}");  // SG9sYSwgTXVuZG8h
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Decodificado: {decoded}");  // Hola, Mundo!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Error: {e.Message}");
        }
    }
}
# Codificación/Decodificación Base64 en Ruby
require 'base64'

def encode_to_base64(text)
  Base64.strict_encode64(text)
end

def decode_from_base64(base64_string)
  begin
    Base64.strict_decode64(base64_string)
  rescue ArgumentError => e
    raise "Cadena Base64 no válida: #{e.message}"
  end
end

# Ejemplo de uso
original_text = "Hola, Mundo!"
encoded = encode_to_base64(original_text)
puts "Codificado: #{encoded}"  # SG9sYSwgTXVuZG8h

begin
  decoded = decode_from_base64(encoded)
  puts "Decodificado: #{decoded}"  # Hola, Mundo!
rescue StandardError => e
  puts "Error: #{e.message}"
end
// Codificación/Decodificación Base64 en Go
package main

import (
    "encoding/base64"
    "fmt"
)

func encodeToBase64(text string) string {
    return base64.StdEncoding.EncodeToString([]byte(text))
}

func decodeFromBase64(base64String string) (string, error) {
    bytes, err := base64.StdEncoding.DecodeString(base64String)
    if err != nil {
        return "", fmt.Errorf("cadena Base64 no válida: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hola, Mundo!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Codificado:", encoded)  // SG9sYSwgTXVuZG8h
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Decodificado:", decoded)  // Hola, Mundo!
    }
}
// Codificación/Decodificación Base64 en Swift
import Foundation

func encodeToBase64(_ text: String) -> String? {
    if let data = text.data(using: .utf8) {
        return data.base64EncodedString()
    }
    return nil
}

func decodeFromBase64(_ base64String: String) -> String? {
    if let data = Data(base64Encoded: base64String) {
        return String(data: data, encoding: .utf8)
    }
    return nil
}

// Ejemplo de uso
let originalText = "Hola, Mundo!"
if let encoded = encodeToBase64(originalText) {
    print("Codificado: \(encoded)")  // SG9sYSwgTXVuZG8h
    
    if let decoded = decodeFromBase64(encoded) {
        print("Decodificado: \(decoded)")  // Hola, Mundo!
    } else {
        print("Error: No se pudo decodificar la cadena Base64")
    }
} else {
    print("Error: No se pudo codificar el texto")
}
' Codificación/Decodificación Base64 en VBA de Excel
' Nota: Esto requiere una referencia a Microsoft XML, v6.0
Function EncodeToBase64(text As String) As String
    Dim xmlObj As Object
    Set xmlObj = CreateObject("MSXML2.DOMDocument")
    
    Dim xmlNode As Object
    Set xmlNode = xmlObj.createElement("b64")
    
    xmlNode.DataType = "bin.base64"
    xmlNode.nodeTypedValue = StrConv(text, vbFromUnicode)
    
    EncodeToBase64 = xmlNode.text
    
    Set xmlNode = Nothing
    Set xmlObj = Nothing
End Function

Function DecodeFromBase64(base64String As String) As String
    On Error GoTo ErrorHandler
    
    Dim xmlObj As Object
    Set xmlObj = CreateObject("MSXML2.DOMDocument")
    
    Dim xmlNode As Object
    Set xmlNode = xmlObj.createElement("b64")
    
    xmlNode.DataType = "bin.base64"
    xmlNode.text = base64String
    
    DecodeFromBase64 = StrConv(xmlNode.nodeTypedValue, vbUnicode)
    
    Set xmlNode = Nothing
    Set xmlObj = Nothing
    Exit Function
    
ErrorHandler:
    DecodeFromBase64 = "Error: Cadena Base64 no válida"
End Function

' Uso en una hoja de cálculo:
' =EncodeToBase64("Hola, Mundo!")
' =DecodeFromBase64("SG9sYSwgTXVuZG8h")
# Codificación/Decodificación Base64 en R
# Requiere el paquete 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Convertir texto a bytes crudos, luego codificar
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Convertir cadena base64 a crudos, luego decodificar
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Cadena Base64 no válida:", e$message))
  })
}

# Ejemplo de uso
original_text <- "Hola, Mundo!"
encoded <- encode_to_base64(original_text)
cat("Codificado:", encoded, "\n")  # SG9sYSwgTXVuZG8h

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Decodificado:", decoded, "\n")  # Hola, Mundo!
}, error = function(e) {
  cat("Error:", e$message, "\n")
})
% Codificación/Decodificación Base64 en MATLAB
function demo_base64()
    originalText = 'Hola, Mundo!';
    
    % Codificar
    encoded = encode_to_base64(originalText);
    fprintf('Codificado: %s\n', encoded);  % SG9sYSwgTXVuZG8h
    
    % Decodificar
    try
        decoded = decode_from_base64(encoded);
        fprintf('Decodificado: %s\n', decoded);  % Hola, Mundo!
    catch e
        fprintf('Error: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Convertir texto a arreglo uint8 y codificar
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Decodificar cadena base64 a arreglo uint8
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Cadena Base64 no válida');
    end
end
// Codificación/Decodificación Base64 en C usando OpenSSL
#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <stdint.h>

char* encode_to_base64(const char* input) {
    BIO *bio, *b64;
    BUF_MEM *bufferPtr;
    
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);
    
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(bio, input, strlen(input));
    BIO_flush(bio);
    BIO_get_mem_ptr(bio, &bufferPtr);
    
    char* result = (char*)malloc(bufferPtr->length + 1);
    memcpy(result, bufferPtr->data, bufferPtr->length);
    result[bufferPtr->length] = '\0';
    
    BIO_free_all(bio);
    
    return result;
}

char* decode_from_base64(const char* input) {
    BIO *bio, *b64;
    size_t length = strlen(input);
    char* buffer = (char*)malloc(length);
    
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new_mem_buf(input, -1);
    bio = BIO_push(b64, bio);
    
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    int decoded_length = BIO_read(bio, buffer, length);
    
    if (decoded_length <= 0) {
        free(buffer);
        BIO_free_all(bio);
        return NULL; // Entrada Base64 no válida
    }
    
    buffer[decoded_length] = '\0';
    
    BIO_free_all(bio);
    
    return buffer;
}

int main() {
    const char* original_text = "Hola, Mundo!";
    
    char* encoded = encode_to_base64(original_text);
    printf("Codificado: %s\n", encoded);  // SG9sYSwgTXVuZG8h
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Decodificado: %s\n", decoded);  // Hola, Mundo!
        free(decoded);
    } else {
        printf("Error: Cadena Base64 no válida\n");
    }
    
    free(encoded);
    
    return 0;
}
// Codificación/Decodificación Base64 en Rust
use base64::{encode, decode};
use std::str;

fn encode_to_base64(text: &str) -> String {
    encode(text)
}

fn decode_from_base64(base64_string: &str) -> Result<String, String> {
    match decode(base64_string) {
        Ok(bytes) => {
            match str::from_utf8(&bytes) {
                Ok(text) => Ok(text.to_string()),
                Err(e) => Err(format!("Secuencia UTF-8 no válida: {}", e))
            }
        },
        Err(e) => Err(format!("Cadena Base64 no válida: {}", e))
    }
}

fn main() {
    let original_text = "Hola, Mundo!";
    let encoded = encode_to_base64(original_text);
    println!("Codificado: {}", encoded);  // SG9sYSwgTXVuZG8h
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Decodificado: {}", decoded),  // Hola, Mundo!
        Err(e) => println!("Error: {}", e)
    }
}

Casos Límite y Consideraciones

Al trabajar con codificación y decodificación Base64, ten en cuenta estas consideraciones importantes:

  1. Unicode y Caracteres No ASCII: Al codificar texto con caracteres no ASCII, asegúrate de la codificación de caracteres adecuada (generalmente UTF-8) antes de la codificación Base64.

  2. Relleno: La Base64 estándar utiliza relleno con caracteres "=" para asegurar que la longitud de salida sea un múltiplo de 4. Algunas implementaciones permiten omitir el relleno, lo que puede causar problemas de compatibilidad.

  3. Saltos de Línea: Las implementaciones tradicionales de Base64 insertan saltos de línea (típicamente cada 76 caracteres) para la legibilidad, pero las aplicaciones modernas a menudo omiten esto.

  4. Base64 Seguro para URL: La Base64 estándar utiliza los caracteres "+" y "/" que tienen significados especiales en URLs. Para contextos de URL, utiliza Base64 seguro para URL que reemplaza estos con "-" y "_".

  5. Espacios en Blanco: Al decodificar, algunas implementaciones son indulgentes y ignoran los espacios en blanco, mientras que otras requieren una entrada exacta.

  6. Aumento de Tamaño: La codificación Base64 aumenta el tamaño de los datos aproximadamente en un 33% (4 bytes de salida por cada 3 bytes de entrada).

  7. Rendimiento: La codificación/decodificación Base64 puede ser intensiva en recursos para datos muy grandes. Considera enfoques de transmisión para archivos grandes.

Referencias

  1. RFC 4648 - Las Codificaciones de Datos Base16, Base32 y Base64
  2. RFC 2045 - MIME Parte Uno: Formato de Cuerpos de Mensajes de Internet
  3. MDN Web Docs: Codificación y Decodificación Base64
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback