Whiz Tools

Codificatore/Decodificatore Base64

Converti testo in e da codifica Base64

Copia

Codificatore e Decodificatore Base64

Introduzione

Base64 è uno schema di codifica binaria in testo che rappresenta i dati binari in un formato di stringa ASCII. È progettato per trasmettere dati memorizzati in formati binari attraverso canali che supportano in modo affidabile solo contenuti testuali. La codifica Base64 converte i dati binari in un insieme di 64 caratteri (da qui il nome) che possono essere trasmessi in sicurezza attraverso protocolli basati su testo senza corruzione dei dati.

Il set di caratteri Base64 è composto da:

  • Lettere maiuscole A-Z (26 caratteri)
  • Lettere minuscole a-z (26 caratteri)
  • Cifre 0-9 (10 caratteri)
  • Due caratteri aggiuntivi, tipicamente "+" e "/" (2 caratteri)

Questo strumento ti consente di codificare facilmente il testo in formato Base64 o di decodificare le stringhe Base64 nel loro testo originale. È particolarmente utile per sviluppatori, professionisti IT e chiunque lavori con dati che devono essere trasmessi in sicurezza attraverso canali basati su testo.

Come Funziona la Codifica Base64

Processo di Codifica

La codifica Base64 funziona convertendo ogni gruppo di tre byte (24 bit) di dati binari in quattro caratteri Base64. Il processo segue questi passaggi:

  1. Converti il testo di input nella sua rappresentazione binaria (utilizzando la codifica ASCII o UTF-8)
  2. Raggruppa i dati binari in blocchi di 24 bit (3 byte)
  3. Suddividi ogni blocco da 24 bit in quattro gruppi da 6 bit
  4. Converti ogni gruppo da 6 bit nel suo carattere Base64 corrispondente

Quando la lunghezza dell'input non è divisibile per 3, vengono aggiunti caratteri di riempimento "=" per mantenere il rapporto di 4:3 tra lunghezze di output e input.

Rappresentazione Matematica

Per una sequenza di byte b1,b2,b3b_1, b_2, b_3, i corrispondenti caratteri Base64 c1,c2,c3,c4c_1, c_2, c_3, c_4 vengono calcolati come:

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)]

Dove Base64[i]\text{Base64}[i] rappresenta il ii-esimo carattere nell'alfabeto Base64.

Processo di Decodifica

La decodifica Base64 inverte il processo di codifica:

  1. Converti ogni carattere Base64 nel suo valore da 6 bit
  2. Concatenare questi valori da 6 bit
  3. Raggruppa i bit in blocchi da 8 bit (byte)
  4. Converti ogni byte nel suo carattere corrispondente

Riempimento

Quando il numero di byte da codificare non è divisibile per 3, viene applicato il riempimento:

  • Se rimane un byte, viene convertito in due caratteri Base64 seguiti da "=="
  • Se rimangono due byte, vengono convertiti in tre caratteri Base64 seguiti da "="

Esempio

Codifichiamo il testo "Hello" in Base64:

  1. Rappresentazione ASCII di "Hello": 72 101 108 108 111
  2. Rappresentazione binaria: 01001000 01100101 01101100 01101100 01101111
  3. Raggruppamento in chunk da 6 bit: 010010 000110 010101 101100 011011 000110 1111
  4. L'ultimo chunk ha solo 4 bit, quindi riempiamo con zeri: 010010 000110 010101 101100 011011 000110 111100
  5. Conversione in decimale: 18, 6, 21, 44, 27, 6, 60
  6. Ricerca nell'alfabeto Base64: S, G, V, s, b, G, 8
  7. Il risultato è "SGVsbG8="

Nota il riempimento "=" alla fine perché la lunghezza dell'input (5 byte) non è divisibile per 3.

Formula

La formula generale per calcolare la lunghezza di una stringa codificata in Base64 è:

lunghezza_codificata=4×lunghezza_input3\text{lunghezza\_codificata} = 4 \times \lceil \frac{\text{lunghezza\_input}}{3} \rceil

Dove x\lceil x \rceil rappresenta la funzione di soffitto (arrotondando all'intero più vicino).

Casi d'Uso

La codifica Base64 è ampiamente utilizzata in varie applicazioni:

  1. Allegati Email: MIME (Multipurpose Internet Mail Extensions) utilizza Base64 per codificare allegati binari nelle email.

  2. Data URL: Incorporare piccole immagini, font o altre risorse direttamente in HTML, CSS o JavaScript utilizzando lo schema URL data:.

  3. Comunicazioni API: Trasmettere in sicurezza dati binari nei payload JSON o in altri formati API basati su testo.

  4. Memorizzazione di Dati Binari in Formati Testuali: Quando i dati binari devono essere memorizzati in XML, JSON o altri formati basati su testo.

  5. Sistemi di Autenticazione: L'autenticazione di base in HTTP utilizza la codifica Base64 (anche se non per sicurezza, solo per codifica).

  6. Criptografia: Come parte di vari protocolli e sistemi crittografici, spesso per codificare chiavi o certificati.

  7. Valori dei Cookie: Codificare strutture di dati complesse da memorizzare nei cookie.

Alternative

Sebbene Base64 sia ampiamente utilizzato, ci sono alternative che potrebbero essere più appropriate in determinate situazioni:

  1. Base64 sicura per URL: Una variante che utilizza "-" e "_" invece di "+" e "/" per evitare problemi di codifica URL. Utile per dati che saranno inclusi negli URL.

  2. Base32: Utilizza un set di 32 caratteri, risultando in un output più lungo ma con una migliore leggibilità umana e insensibilità al caso.

  3. Codifica Esadecimale: Conversione semplice in esadecimale, che è meno efficiente (raddoppia la dimensione) ma molto semplice e ampiamente supportata.

  4. Trasferimento Binario: Per file di grandi dimensioni o quando l'efficienza è cruciale, i protocolli di trasferimento binario diretto come HTTP con intestazioni Content-Type appropriate sono preferibili.

  5. Compressione + Base64: Per grandi dati testuali, comprimere prima di codificare può mitigare l'aumento di dimensione.

  6. Serializzazione JSON/XML: Per dati strutturati, utilizzare la serializzazione JSON o XML nativa potrebbe essere più appropriato rispetto alla codifica Base64.

Storia

La codifica Base64 ha le sue radici nei primi sistemi informatici e di telecomunicazione in cui i dati binari dovevano essere trasmessi su canali progettati per il testo.

La specifica formale della Base64 è stata pubblicata per la prima volta nel 1987 come parte del RFC 989, che definiva la Privacy Enhanced Mail (PEM). Questo è stato successivamente aggiornato nel RFC 1421 (1993) e nel RFC 2045 (1996, come parte di MIME).

Il termine "Base64" deriva dal fatto che la codifica utilizza 64 caratteri ASCII diversi per rappresentare i dati binari. Questa scelta di 64 caratteri è stata deliberata, poiché 64 è una potenza di 2 (2^6), il che rende la conversione tra binario e Base64 efficiente.

Nel tempo, sono emerse diverse varianti di Base64:

  • Base64 standard: Come definito nel RFC 4648, utilizzando A-Z, a-z, 0-9, +, / e = per il riempimento
  • Base64 sicura per URL: Utilizza - e _ invece di + e / per evitare problemi di codifica URL
  • Base64 sicura per nomi di file: Simile alla Base64 sicura per URL, progettata per l'uso nei nomi di file
  • Base64 modificata per IMAP: Utilizzata nel protocollo IMAP con un diverso insieme di caratteri speciali

Nonostante abbia più di tre decenni, Base64 rimane uno strumento fondamentale nell'informatica moderna, in particolare con l'ascesa delle applicazioni web e delle API che si basano pesantemente su formati di dati basati su testo come JSON.

Esempi di Codice

Ecco esempi di codifica e decodifica Base64 in vari linguaggi di programmazione:

// Codifica/Decodifica Base64 in JavaScript
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Stringa Base64 non valida");
  }
}

// Esempio di utilizzo
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Codificato:", encoded);  // SGVsbG8sIFdvcmxkIQ==

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

def encode_to_base64(text):
    # Converti la stringa in byte e poi codifica
    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:
        # Converti la stringa base64 in byte e poi decodifica
        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"Stringa Base64 non valida: {e}")

# Esempio di utilizzo
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Codificato: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

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

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Stringa Base64 non valida");
    }
    return $decoded;
}

// Esempio di utilizzo
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Codificato: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Decodificato: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Errore: " . $e->getMessage() . "\n";
}
?>
// Codifica/Decodifica Base64 in 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("Stringa Base64 non valida");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Codificato: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Decodificato: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Errore: {e.Message}");
        }
    }
}
# Codifica/Decodifica Base64 in 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 "Stringa Base64 non valida: #{e.message}"
  end
end

# Esempio di utilizzo
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Codificato: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Decodificato: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Errore: #{e.message}"
end
// Codifica/Decodifica Base64 in 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("stringa Base64 non valida: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Codificato:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Errore:", err)
    } else {
        fmt.Println("Decodificato:", decoded)  // Hello, World!
    }
}
// Codifica/Decodifica Base64 in 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
}

// Esempio di utilizzo
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Codificato: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Decodificato: \(decoded)")  // Hello, World!
    } else {
        print("Errore: Impossibile decodificare la stringa Base64")
    }
} else {
    print("Errore: Impossibile codificare il testo")
}
' Codifica/Decodifica Base64 in Excel VBA
' Nota: Questo richiede un riferimento 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 = "Errore: Stringa Base64 non valida"
End Function

' Utilizzo in un foglio di lavoro:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# Codifica/Decodifica Base64 in R
# Richiede il pacchetto 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Converti il testo in byte raw, poi codifica
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Converti la stringa base64 in raw, poi decodifica
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Stringa Base64 non valida:", e$message))
  })
}

# Esempio di utilizzo
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Codificato:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Decodificato:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Errore:", e$message, "\n")
})
% Codifica/Decodifica Base64 in MATLAB
function demo_base64()
    originalText = 'Hello, World!';
    
    % Codifica
    encoded = encode_to_base64(originalText);
    fprintf('Codificato: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Decodifica
    try
        decoded = decode_from_base64(encoded);
        fprintf('Decodificato: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Errore: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Converti il testo in array uint8 e codifica
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Decodifica la stringa base64 in array uint8
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Stringa Base64 non valida');
    end
end
// Codifica/Decodifica Base64 in C utilizzando 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; // Input Base64 non valido
    }
    
    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("Codificato: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Decodificato: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Errore: Stringa Base64 non valida\n");
    }
    
    free(encoded);
    
    return 0;
}
// Codifica/Decodifica Base64 in 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!("Sequenza UTF-8 non valida: {}", e))
            }
        },
        Err(e) => Err(format!("Stringa Base64 non valida: {}", e))
    }
}

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

Casi Ed Eccezioni e Considerazioni

Quando si lavora con la codifica e la decodifica Base64, sii consapevole di queste importanti considerazioni:

  1. Caratteri Unicode e Non-ASCII: Quando si codificano testi con caratteri non ASCII, assicurati di utilizzare la corretta codifica dei caratteri (di solito UTF-8) prima della codifica Base64.

  2. Riempimento: La Base64 standard utilizza il riempimento con caratteri "=" per garantire che la lunghezza dell'output sia un multiplo di 4. Alcune implementazioni consentono di omettere il riempimento, il che può causare problemi di compatibilità.

  3. Interruzioni di Riga: Le implementazioni Base64 tradizionali inseriscono interruzioni di riga (tipicamente ogni 76 caratteri) per la leggibilità, ma le applicazioni moderne spesso omettono queste.

  4. Base64 Sicura per URL: La Base64 standard utilizza i caratteri "+" e "/" che hanno significati speciali negli URL. Per contesti URL, utilizza la Base64 sicura per URL che sostituisce questi con "-" e "_".

  5. Spazi Bianchi: Durante la decodifica, alcune implementazioni sono tolleranti e ignorano gli spazi bianchi, mentre altre richiedono un input esatto.

  6. Aumento delle Dimensioni: La codifica Base64 aumenta la dimensione dei dati di circa il 33% (4 byte di output per ogni 3 byte di input).

  7. Prestazioni: La codifica/decodifica Base64 può essere computazionalmente intensiva per dati molto grandi. Considera approcci di streaming per file di grandi dimensioni.

Riferimenti

  1. RFC 4648 - Le codifiche di dati Base16, Base32 e Base64
  2. RFC 2045 - MIME Parte Prima: Formato dei Corpi dei Messaggi Internet
  3. MDN Web Docs: Codifica e decodifica Base64
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback