Whiz Tools

Codificador/Decodificador Base64

Converter texto para e de codificação Base64

Copiar

Codificador e Decodificador Base64

Introdução

Base64 é um esquema de codificação de texto binário que representa dados binários em um formato de string ASCII. Ele foi projetado para transportar dados armazenados em formatos binários através de canais que suportam apenas conteúdo de texto de forma confiável. A codificação Base64 converte dados binários em um conjunto de 64 caracteres (daí o nome) que podem ser transmitidos com segurança por meio de protocolos baseados em texto, sem corrupção de dados.

O conjunto de caracteres Base64 consiste em:

  • Letras maiúsculas A-Z (26 caracteres)
  • Letras minúsculas a-z (26 caracteres)
  • Dígitos 0-9 (10 caracteres)
  • Dois caracteres adicionais, tipicamente "+" e "/" (2 caracteres)

Esta ferramenta permite que você codifique facilmente texto para o formato Base64 ou decodifique strings Base64 de volta para seu texto original. É particularmente útil para desenvolvedores, profissionais de TI e qualquer pessoa que trabalhe com dados que precisam ser transmitidos com segurança através de canais baseados em texto.

Como Funciona a Codificação Base64

Processo de Codificação

A codificação Base64 funciona convertendo cada grupo de três bytes (24 bits) de dados binários em quatro caracteres Base64. O processo segue estas etapas:

  1. Converta o texto de entrada para sua representação binária (usando codificação ASCII ou UTF-8)
  2. Agrupe os dados binários em blocos de 24 bits (3 bytes)
  3. Divida cada bloco de 24 bits em quatro grupos de 6 bits
  4. Converta cada grupo de 6 bits em seu caractere Base64 correspondente

Quando o comprimento da entrada não é divisível por 3, o preenchimento com caracteres "=" é adicionado para manter a proporção de 4:3 dos comprimentos de saída para entrada.

Representação Matemática

Para uma sequência de bytes b1,b2,b3b_1, b_2, b_3, os caracteres Base64 correspondentes c1,c2,c3,c4c_1, c_2, c_3, c_4 são calculados 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)]

Onde Base64[i]\text{Base64}[i] representa o ii-ésimo caractere no alfabeto Base64.

Processo de Decodificação

A decodificação Base64 reverte o processo de codificação:

  1. Converta cada caractere Base64 em seu valor de 6 bits
  2. Concatene esses valores de 6 bits
  3. Agrupe os bits em blocos de 8 bits (bytes)
  4. Converta cada byte em seu caractere correspondente

Preenchimento

Quando o número de bytes a serem codificados não é divisível por 3, o preenchimento é aplicado:

  • Se houver um byte restante, ele é convertido em dois caracteres Base64 seguidos de "=="
  • Se houver dois bytes restantes, eles são convertidos em três caracteres Base64 seguidos de "="

Exemplo

Vamos codificar o texto "Hello" para Base64:

  1. Representação ASCII de "Hello": 72 101 108 108 111
  2. Representação binária: 01001000 01100101 01101100 01101100 01101111
  3. Agrupando em blocos de 6 bits: 010010 000110 010101 101100 011011 000110 1111
  4. O último bloco tem apenas 4 bits, então preenchermos com zeros: 010010 000110 010101 101100 011011 000110 111100
  5. Convertendo para decimal: 18, 6, 21, 44, 27, 6, 60
  6. Consultando no alfabeto Base64: S, G, V, s, b, G, 8
  7. O resultado é "SGVsbG8="

Note o preenchimento "=" no final porque o comprimento da entrada (5 bytes) não é divisível por 3.

Fórmula

A fórmula geral para calcular o comprimento de uma string codificada em Base64 é:

comprimento_codificado=4×comprimento_entrada3\text{comprimento\_codificado} = 4 \times \lceil \frac{\text{comprimento\_entrada}}{3} \rceil

Onde x\lceil x \rceil representa a função teto (arredondando para o inteiro mais próximo).

Casos de Uso

A codificação Base64 é amplamente utilizada em várias aplicações:

  1. Anexos de Email: MIME (Extensões de Email Multipropósito da Internet) usa Base64 para codificar anexos binários em emails.

  2. URLs de Dados: Incorporando pequenas imagens, fontes ou outros recursos diretamente em HTML, CSS ou JavaScript usando o esquema de URL data:.

  3. Comunicações de API: Transmitindo com segurança dados binários em cargas úteis JSON ou outros formatos de API baseados em texto.

  4. Armazenando Dados Binários em Formatos de Texto: Quando dados binários precisam ser armazenados em XML, JSON ou outros formatos baseados em texto.

  5. Sistemas de Autenticação: A Autenticação Básica em HTTP usa codificação Base64 (embora não seja para segurança, apenas para codificação).

  6. Criptografia: Como parte de vários protocolos e sistemas criptográficos, muitas vezes para codificar chaves ou certificados.

  7. Valores de Cookies: Codificando estruturas de dados complexas para serem armazenadas em cookies.

Alternativas

Embora o Base64 seja amplamente utilizado, existem alternativas que podem ser mais apropriadas em certas situações:

  1. Base64 Seguro para URL: Uma variante que usa "-" e "_" em vez de "+" e "/" para evitar problemas de codificação de URL. Útil para dados que serão incluídos em URLs.

  2. Base32: Usa um conjunto de 32 caracteres, resultando em uma saída mais longa, mas com melhor legibilidade humana e insensibilidade a maiúsculas e minúsculas.

  3. Codificação Hexadecimal: Conversão simples para hexadecimal, que é menos eficiente (dobra o tamanho), mas muito simples e amplamente suportada.

  4. Transferência Binária: Para arquivos grandes ou quando a eficiência é crucial, protocolos de transferência binária direta, como HTTP com cabeçalhos de Content-Type apropriados, são preferíveis.

  5. Compressão + Base64: Para grandes dados de texto, comprimir antes de codificar pode mitigar o aumento de tamanho.

  6. Serialização JSON/XML: Para dados estruturados, usar a serialização nativa JSON ou XML pode ser mais apropriado do que a codificação Base64.

História

A codificação Base64 tem suas raízes em sistemas de computação e telecomunicações antigos, onde dados binários precisavam ser transmitidos por canais projetados para texto.

A especificação formal do Base64 foi publicada pela primeira vez em 1987 como parte do RFC 989, que definiu o Email Privado Aprimorado (PEM). Isso foi posteriormente atualizado no RFC 1421 (1993) e RFC 2045 (1996, como parte do MIME).

O termo "Base64" vem do fato de que a codificação usa 64 caracteres ASCII diferentes para representar dados binários. Essa escolha de 64 caracteres foi deliberada, uma vez que 64 é uma potência de 2 (2^6), o que torna a conversão entre binário e Base64 eficiente.

Com o tempo, várias variantes de Base64 surgiram:

  • Base64 Padrão: Conforme definido no RFC 4648, usando A-Z, a-z, 0-9, +, / e = para preenchimento
  • Base64 Seguro para URL: Usa - e _ em vez de + e / para evitar problemas de codificação de URL
  • Base64 Seguro para Nomes de Arquivo: Semelhante ao seguro para URL, projetado para uso em nomes de arquivo
  • Base64 Modificado para IMAP: Usado no protocolo IMAP com um conjunto diferente de caracteres especiais

Apesar de ter mais de três décadas, o Base64 continua sendo uma ferramenta fundamental na computação moderna, particularmente com o aumento de aplicativos da web e APIs que dependem fortemente de formatos de dados baseados em texto como JSON.

Exemplos de Código

Aqui estão exemplos de codificação e decodificação Base64 em várias linguagens de programação:

// JavaScript Codificação/Decodificação Base64
function encodeToBase64(text) {
  return btoa(text);
}

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

// Exemplo de uso
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Codificado:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Decodificado:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Python Codificação/Decodificação Base64
import base64

def encode_to_base64(text):
    # Converter string para bytes e depois 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:
        # Converter string base64 para bytes e depois 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"String Base64 inválida: {e}")

# Exemplo de uso
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Codificado: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Decodificado: {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Java Codificação/Decodificação Base64
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("String Base64 inválida: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Codificado: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Decodificado: " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Codificação/Decodificação Base64
function encodeToBase64($text) {
    return base64_encode($text);
}

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

// Exemplo de uso
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Codificado: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Decodificado: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Erro: " . $e->getMessage() . "\n";
}
?>
// C# Codificação/Decodificação Base64
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("String Base64 inválida");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Codificado: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Decodificado: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Erro: {e.Message}");
        }
    }
}
# Ruby Codificação/Decodificação Base64
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 "String Base64 inválida: #{e.message}"
  end
end

# Exemplo de uso
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Codificado: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Decodificado: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Erro: #{e.message}"
end
// Go Codificação/Decodificação Base64
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("string Base64 inválida: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Codificado:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Erro:", err)
    } else {
        fmt.Println("Decodificado:", decoded)  // Hello, World!
    }
}
// Swift Codificação/Decodificação Base64
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
}

// Exemplo de uso
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Codificado: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Decodificado: \(decoded)")  // Hello, World!
    } else {
        print("Erro: Não foi possível decodificar a string Base64")
    }
} else {
    print("Erro: Não foi possível codificar o texto")
}
' Excel VBA Codificação/Decodificação Base64
' Nota: Isso requer uma referência ao 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 = "Erro: String Base64 inválida"
End Function

' Uso em uma planilha:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Codificação/Decodificação Base64
# Requer o pacote 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Converter texto para bytes brutos, depois codificar
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Converter string base64 para bytes brutos, depois decodificar
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("String Base64 inválida:", e$message))
  })
}

# Exemplo de uso
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Codificado:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Decodificado:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Erro:", e$message, "\n")
})
% MATLAB Codificação/Decodificação Base64
function demo_base64()
    originalText = 'Hello, World!';
    
    % Codificar
    encoded = encode_to_base64(originalText);
    fprintf('Codificado: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Decodificar
    try
        decoded = decode_from_base64(encoded);
        fprintf('Decodificado: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Erro: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Converter texto para array uint8 e codificar
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Decodificar string base64 para array uint8
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('String Base64 inválida');
    end
end
// C Codificação/Decodificação Base64 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 inválida
    }
    
    buffer[decoded_length] = '\0';
    
    BIO_free_all(bio);
    
    return buffer;
}

int main() {
    const char* original_text = "Hello, World!";
    
    char* encoded = encode_to_base64(original_text);
    printf("Codificado: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Decodificado: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Erro: String Base64 inválida\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Codificação/Decodificação Base64
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!("Sequência UTF-8 inválida: {}", e))
            }
        },
        Err(e) => Err(format!("String Base64 inválida: {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Codificado: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Decodificado: {}", decoded),  // Hello, World!
        Err(e) => println!("Erro: {}", e)
    }
}

Casos de Borda e Considerações

Ao trabalhar com codificação e decodificação Base64, esteja ciente dessas considerações importantes:

  1. Unicode e Caracteres Não ASCII: Ao codificar texto com caracteres não ASCII, garanta a codificação de caracteres apropriada (geralmente UTF-8) antes da codificação Base64.

  2. Preenchimento: O Base64 padrão usa preenchimento com caracteres "=" para garantir que o comprimento da saída seja um múltiplo de 4. Algumas implementações permitem omitir o preenchimento, o que pode causar problemas de compatibilidade.

  3. Quebras de Linha: Implementações tradicionais de Base64 inserem quebras de linha (tipicamente a cada 76 caracteres) para legibilidade, mas aplicativos modernos frequentemente omitem isso.

  4. Base64 Seguro para URL: O Base64 padrão usa os caracteres "+" e "/" que têm significados especiais em URLs. Para contextos de URL, use Base64 seguro para URL que substitui esses por "-" e "_".

  5. Espaços em Branco: Ao decodificar, algumas implementações são tolerantes e ignoram espaços em branco, enquanto outras exigem a entrada exata.

  6. Aumento de Tamanho: A codificação Base64 aumenta o tamanho dos dados em aproximadamente 33% (4 bytes de saída para cada 3 bytes de entrada).

  7. Desempenho: A codificação/decodificação Base64 pode ser computacionalmente intensiva para dados muito grandes. Considere abordagens de streaming para arquivos grandes.

Referências

  1. RFC 4648 - As Codificações de Dados Base16, Base32 e Base64
  2. RFC 2045 - MIME Parte Um: Formato de Corpos de Mensagens da Internet
  3. MDN Web Docs: Codificação e Decodificação Base64
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback