Whiz Tools

Base64 Encoder/Decoder

Preveďte text na a z Base64 kódovania

Kopírovať

Kódovač a dekodér Base64

Úvod

Base64 je schéma kódovania binárnych údajov do textu, ktoré predstavuje binárne dáta vo formáte ASCII reťazca. Je navrhnuté na prenášanie údajov uložených v binárnych formátoch cez kanály, ktoré spoľahlivo podporujú iba textový obsah. Kódovanie Base64 prevádza binárne dáta do súboru 64 znakov (odtiaľ názov), ktoré môžu byť bezpečne prenášané cez textové protokoly bez poškodenia údajov.

Znaková sada Base64 pozostáva z:

  • Veľkých písmen A-Z (26 znakov)
  • Malých písmen a-z (26 znakov)
  • Čísel 0-9 (10 znakov)
  • Dvoch ďalších znakov, typicky "+" a "/" (2 znaky)

Tento nástroj vám umožňuje jednoducho kódovať text do formátu Base64 alebo dekódovať Base64 reťazce späť do ich pôvodného textu. Je obzvlášť užitočný pre vývojárov, IT profesionálov a každého, kto pracuje s údajmi, ktoré musia byť bezpečne prenášané cez textové kanály.

Ako funguje kódovanie Base64

Proces kódovania

Kódovanie Base64 funguje tak, že prevádza každú skupinu troch bajtov (24 bitov) binárnych údajov na štyri znaky Base64. Proces nasleduje tieto kroky:

  1. Preveďte vstupný text na jeho binárnu reprezentáciu (používajúc ASCII alebo UTF-8 kódovanie)
  2. Skupinujte binárne dáta do blokov po 24 bitoch (3 bajty)
  3. Rozdeľte každý 24-bitový blok na štyri 6-bitové skupiny
  4. Preveďte každú 6-bitovú skupinu na jej zodpovedajúci znak Base64

Keď dĺžka vstupu nie je deliteľná tromi, pridáva sa padding s "=" znakmi, aby sa udržal pomer 4:3 medzi dĺžkami výstupu a vstupu.

Matematická reprezentácia

Pre sekvenciu bajtov b1,b2,b3b_1, b_2, b_3 sa zodpovedajúce znaky Base64 c1,c2,c3,c4c_1, c_2, c_3, c_4 vypočítajú ako:

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

Kde Base64[i]\text{Base64}[i] predstavuje ii-tý znak v abecede Base64.

Proces dekódovania

Dekódovanie Base64 obracia proces kódovania:

  1. Preveďte každý znak Base64 na jeho 6-bitovú hodnotu
  2. Spojte tieto 6-bitové hodnoty
  3. Skupinujte bity do 8-bitových blokov (bajty)
  4. Preveďte každý bajt na jeho zodpovedajúci znak

Padding

Keď počet bajtov na kódovanie nie je deliteľný tromi, aplikuje sa padding:

  • Ak zostáva jeden bajt, prevádza sa na dva Base64 znaky nasledované "=="
  • Ak zostávajú dva bajty, prevádzajú sa na tri Base64 znaky nasledované "="

Príklad

Poďme zakódovať text "Hello" do Base64:

  1. ASCII reprezentácia "Hello": 72 101 108 108 111
  2. Binárna reprezentácia: 01001000 01100101 01101100 01101100 01101111
  3. Skupinovanie do 6-bitových blokov: 010010 000110 010101 101100 011011 000110 1111
  4. Posledný blok má iba 4 bity, takže pridáme nuly: 010010 000110 010101 101100 011011 000110 111100
  5. Prevádzanie na desiatkovú sústavu: 18, 6, 21, 44, 27, 6, 60
  6. Hľadanie v abecede Base64: S, G, V, s, b, G, 8
  7. Výsledok je "SGVsbG8="

Poznámka: "=" padding na konci, pretože dĺžka vstupu (5 bajtov) nie je deliteľná tromi.

Formula

Všeobecný vzorec na výpočet dĺžky Base64 zakódovaného reťazca je:

encoded_length=4×input_length3\text{encoded\_length} = 4 \times \lceil \frac{\text{input\_length}}{3} \rceil

Kde x\lceil x \rceil predstavuje funkciu zaokrúhľovania nahor (zaokrúhľovanie na najbližšie celé číslo).

Použitie

Kódovanie Base64 sa široko používa v rôznych aplikáciách:

  1. Prílohy e-mailov: MIME (Multipurpose Internet Mail Extensions) používa Base64 na kódovanie binárnych príloh v e-maile.

  2. Dátové URL: Vkladanie malých obrázkov, písiem alebo iných zdrojov priamo do HTML, CSS alebo JavaScriptu pomocou schémy URL data:.

  3. Komunikácie API: Bezpečné prenášanie binárnych údajov v JSON payloadoch alebo iných textových formátoch API.

  4. Ukladanie binárnych údajov v textových formátoch: Keď je potrebné uložiť binárne údaje v XML, JSON alebo iných textových formátoch.

  5. Systémy autentifikácie: Základná autentifikácia v HTTP používa Base64 kódovanie (aj keď to nie je pre bezpečnosť, len pre kódovanie).

  6. Kryptografia: Ako súčasť rôznych kryptografických protokolov a systémov, často na kódovanie kľúčov alebo certifikátov.

  7. Hodnoty cookies: Kódovanie zložitých dátových štruktúr na uloženie v cookies.

Alternatívy

Aj keď je Base64 široko používané, existujú alternatívy, ktoré môžu byť vhodnejšie v určitých situáciách:

  1. URL-safe Base64: Variant, ktorý používa "-" a "_" namiesto "+" a "/" na vyhnutie sa problémom s URL kódovaním. Užitečné pre dáta, ktoré budú zahrnuté v URL.

  2. Base32: Používa 32-znakovú sadu, čo vedie k dlhšiemu výstupu, ale s lepšou čitateľnosťou pre ľudí a bez ohľadu na veľkosť písmen.

  3. Hex kódovanie: Jednoduchá konverzia na hexadecimálne, ktorá je menej efektívna (zdvojnásobuje veľkosť), ale veľmi jednoduchá a široko podporovaná.

  4. Binárny prenos: Pre veľké súbory alebo keď je efektívnosť kľúčová, sú preferované prenosové protokoly ako HTTP s vhodnými hlavičkami Content-Type.

  5. Komprimácia + Base64: Pre veľké textové dáta môže kompresia pred kódovaním zmierniť nárast veľkosti.

  6. JSON/XML serializácia: Pre štruktúrované dáta môže byť použitie natívnej JSON alebo XML serializácie vhodnejšie ako Base64 kódovanie.

História

Kódovanie Base64 má svoje korene v raných počítačových a telekomunikačných systémoch, kde bolo potrebné prenášať binárne dáta cez kanály navrhnuté pre text.

Formálna špecifikácia Base64 bola prvýkrát publikovaná v roku 1987 ako súčasť RFC 989, ktorá definovala Privacy Enhanced Mail (PEM). To bolo neskôr aktualizované v RFC 1421 (1993) a RFC 2045 (1996, ako súčasť MIME).

Termín "Base64" pochádza z toho, že kódovanie používa 64 rôznych ASCII znakov na reprezentáciu binárnych údajov. Tento výber 64 znakov bol zámerný, pretože 64 je mocninou 2 (2^6), čo robí konverziu medzi binárnymi a Base64 efektívnou.

V priebehu času sa objavilo niekoľko variantov Base64:

  • Štandardné Base64: Ako je definované v RFC 4648, používa A-Z, a-z, 0-9, +, / a = na padding
  • URL-safe Base64: Používa - a _ namiesto + a / na vyhnutie sa problémom s URL kódovaním
  • Bezpečné názvy súborov Base64: Podobné URL-safe, navrhnuté na použitie v názvoch súborov
  • Modifikované Base64 pre IMAP: Používané v protokole IMAP s inou sadou špeciálnych znakov

Napriek tomu, že má viac ako tri desaťročia, Base64 zostáva základným nástrojom v modernej informatike, najmä s nástupom webových aplikácií a API, ktoré sa silne spoliehajú na textové formáty dát ako JSON.

Kódové príklady

Tu sú príklady kódovania a dekódovania Base64 v rôznych programovacích jazykoch:

// JavaScript Base64 Kódovanie/Dekódovanie
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Neplatný Base64 reťazec");
  }
}

// Príklad použitia
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Zakódované:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Dekódované:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Python Base64 Kódovanie/Dekódovanie
import base64

def encode_to_base64(text):
    # Preveďte reťazec na bajty a potom zakódujte
    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:
        # Preveďte Base64 reťazec na bajty a potom dekódujte
        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"Neplatný Base64 reťazec: {e}")

# Príklad použitia
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Zakódované: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Dekódované: {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Java Base64 Kódovanie/Dekódovanie
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("Neplatný Base64 reťazec: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Zakódované: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Dekódované: " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Base64 Kódovanie/Dekódovanie
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Neplatný Base64 reťazec");
    }
    return $decoded;
}

// Príklad použitia
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Zakódované: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Dekódované: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Chyba: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Kódovanie/Dekódovanie
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("Neplatný Base64 reťazec");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Zakódované: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Dekódované: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Chyba: {e.Message}");
        }
    }
}
# Ruby Base64 Kódovanie/Dekódovanie
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 "Neplatný Base64 reťazec: #{e.message}"
  end
end

# Príklad použitia
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Zakódované: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Dekódované: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Chyba: #{e.message}"
end
// Go Base64 Kódovanie/Dekódovanie
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("neplatný Base64 reťazec: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Zakódované:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Chyba:", err)
    } else {
        fmt.Println("Dekódované:", decoded)  // Hello, World!
    }
}
// Swift Base64 Kódovanie/Dekódovanie
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
}

// Príklad použitia
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Zakódované: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Dekódované: \(decoded)")  // Hello, World!
    } else {
        print("Chyba: Nepodarilo sa dekódovať Base64 reťazec")
    }
} else {
    print("Chyba: Nepodarilo sa zakódovať text")
}
' Excel VBA Base64 Kódovanie/Dekódovanie
' Poznámka: Toto vyžaduje referenciu na 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 = "Chyba: Neplatný Base64 reťazec"
End Function

' Použitie v hárku:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Kódovanie/Dekódovanie
# Vyžaduje balík 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Preveďte text na surové bajty, potom zakódujte
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Preveďte Base64 reťazec na surové, potom dekódujte
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Neplatný Base64 reťazec:", e$message))
  })
}

# Príklad použitia
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Zakódované:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Dekódované:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Chyba:", e$message, "\n")
})
% MATLAB Base64 Kódovanie/Dekódovanie
function demo_base64()
    originalText = 'Hello, World!';
    
    % Kódovanie
    encoded = encode_to_base64(originalText);
    fprintf('Zakódované: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Dekódovanie
    try
        decoded = decode_from_base64(encoded);
        fprintf('Dekódované: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Chyba: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Preveďte text na uint8 pole a zakódujte
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Dekódujte Base64 reťazec na uint8 pole
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Neplatný Base64 reťazec');
    end
end
// C Base64 Kódovanie/Dekódovanie pomocou 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; // Neplatný Base64 vstup
    }
    
    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("Zakódované: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Dekódované: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Chyba: Neplatný Base64 reťazec\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Kódovanie/Dekódovanie
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!("Neplatná UTF-8 sekvencia: {}", e))
            }
        },
        Err(e) => Err(format!("Neplatný Base64 reťazec: {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Zakódované: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Dekódované: {}", decoded),  // Hello, World!
        Err(e) => println!("Chyba: {}", e)
    }
}

Okrajové prípady a úvahy

Pri práci s kódovaním a dekódovaním Base64 si dávajte pozor na tieto dôležité úvahy:

  1. Unicode a ne-ASCII znaky: Pri kódovaní textu s ne-ASCII znakmi zabezpečte správne kódovanie znakov (zvyčajne UTF-8) pred kódovaním Base64.

  2. Padding: Štandardné Base64 používa padding s "=" znakmi na zabezpečenie, aby dĺžka výstupu bola násobkom 4. Niektoré implementácie umožňujú vynechanie paddingu, čo môže spôsobiť problémy s kompatibilitou.

  3. Riadkové zlomy: Tradičné implementácie Base64 vkladajú riadkové zlomy (typicky každých 76 znakov) pre čitateľnosť, ale moderné aplikácie často tieto vynechávajú.

  4. URL-Safe Base64: Štandardné Base64 používa "+" a "/" znaky, ktoré majú špeciálne významy v URL. Pre kontexty URL používajte URL-safe Base64, ktoré tieto nahrádza "-" a "_".

  5. Biele znaky: Pri dekódovaní niektoré implementácie sú zhovievavé a ignorujú biele znaky, zatiaľ čo iné vyžadujú presný vstup.

  6. Zvýšenie veľkosti: Kódovanie Base64 zvyšuje veľkosť údajov približne o 33% (4 výstupné bajty pre každé 3 vstupné bajty).

  7. Výkon: Kódovanie/dekódovanie Base64 môže byť výpočtovo náročné pre veľmi veľké dáta. Zvážte prístup streamovania pre veľké súbory.

Odkazy

  1. RFC 4648 - Kódovania Base16, Base32 a Base64
  2. RFC 2045 - MIME Časť Prvá: Formát Internetových Správ
  3. MDN Web Docs: Kódovanie a dekódovanie Base64
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback