Whiz Tools

Base64 Enkoder/Decodera

Konvertujte tekst u i iz Base64 kodiranja

Kopiraj

Base64 Encoder i Dekoder

Uvod

Base64 je shema kodiranja binarnih podataka u tekst koja predstavlja binarne podatke u ASCII string formatu. Dizajnirana je da prenosi podatke pohranjene u binarnim formatima preko kanala koji pouzdano podržavaju samo tekstualni sadržaj. Base64 kodiranje pretvara binarne podatke u skup od 64 karaktera (otuda i naziv) koji se mogu sigurno prenositi preko protokola zasnovanih na tekstu bez oštećenja podataka.

Skup karaktera Base64 se sastoji od:

  • Velikih slova A-Z (26 karaktera)
  • Malih slova a-z (26 karaktera)
  • Brojeva 0-9 (10 karaktera)
  • Dva dodatna karaktera, obično "+" i "/" (2 karaktera)

Ovaj alat vam omogućava da lako kodirate tekst u Base64 format ili dekodirate Base64 stringove nazad u njihov izvorni tekst. Posebno je koristan za programere, IT stručnjake i svakoga ko radi sa podacima koji treba da se prenose sigurno preko kanala zasnovanih na tekstu.

Kako funkcioniše Base64 kodiranje

Proces kodiranja

Base64 kodiranje funkcioniše tako što pretvara svaku grupu od tri bajta (24 bita) binarnih podataka u četiri Base64 karaktera. Proces se sastoji od sledećih koraka:

  1. Pretvorite ulazni tekst u njegovu binarnu reprezentaciju (koristeći ASCII ili UTF-8 kodiranje)
  2. Grupisanje binarnih podataka u delove od 24 bita (3 bajta)
  3. Deljenje svake 24-bitne grupe u četiri 6-bitne grupe
  4. Pretvaranje svake 6-bitne grupe u njen odgovarajući Base64 karakter

Kada dužina ulaza nije deljiva sa 3, dodaje se padding sa "=" karakterima kako bi se održala 4:3 proporcija dužina izlaza i ulaza.

Matematička reprezentacija

Za niz bajtova b1,b2,b3b_1, b_2, b_3, odgovarajući Base64 karakteri c1,c2,c3,c4c_1, c_2, c_3, c_4 se računaju kao:

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

Gde Base64[i]\text{Base64}[i] predstavlja ii-ti karakter u Base64 abecedi.

Proces dekodiranja

Base64 dekodiranje obrnuto je od procesa kodiranja:

  1. Pretvorite svaki Base64 karakter u njegovu 6-bitnu vrednost
  2. Spojite ove 6-bitne vrednosti
  3. Grupisanje bitova u 8-bitne delove (bajte)
  4. Pretvorite svaki bajt u njegov odgovarajući karakter

Padding

Kada broj bajtova koji se kodiraju nije deljiv sa 3, primenjuje se padding:

  • Ako ostane jedan bajt, on se pretvara u dva Base64 karaktera praćena "=="
  • Ako ostanu dva bajta, oni se pretvaraju u tri Base64 karaktera praćena "="

Primer

Hajde da kodiramo tekst "Hello" u Base64:

  1. ASCII reprezentacija "Hello": 72 101 108 108 111
  2. Binarna reprezentacija: 01001000 01100101 01101100 01101100 01101111
  3. Grupisanje u 6-bitne delove: 010010 000110 010101 101100 011011 000110 1111
  4. Poslednji deo ima samo 4 bita, pa dodajemo nule: 010010 000110 010101 101100 011011 000110 111100
  5. Pretvaranje u decimalne vrednosti: 18, 6, 21, 44, 27, 6, 60
  6. Pretraživanje u Base64 abecedi: S, G, V, s, b, G, 8
  7. Rezultat je "SGVsbG8="

Napomena: "=" padding na kraju jer dužina ulaza (5 bajtova) nije deljiva sa 3.

Formula

Opšta formula za izračunavanje dužine Base64 kodirane stringa je:

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

Gde x\lceil x \rceil predstavlja funkciju zaokruživanja (zaokruživanje na najbliži ceo broj naviše).

Upotrebe

Base64 kodiranje se široko koristi u raznim aplikacijama:

  1. Email Prilozi: MIME (Multipurpose Internet Mail Extensions) koristi Base64 za kodiranje binarnih priloga u emailovima.

  2. Data URL-ovi: Uključivanje malih slika, fontova ili drugih resursa direktno u HTML, CSS ili JavaScript koristeći data: URL shemu.

  3. API Komunikacije: Sigurno prenošenje binarnih podataka u JSON payload-ima ili drugim formatima API-ja zasnovanim na tekstu.

  4. Skladištenje binarnih podataka u tekstualnim formatima: Kada je potrebno skladištiti binarne podatke u XML-u, JSON-u ili drugim tekstualnim formatima.

  5. Sistemi autentifikacije: Osnovna autentifikacija u HTTP-u koristi Base64 kodiranje (iako to nije zbog sigurnosti, već zbog kodiranja).

  6. Kriptografija: Kao deo različitih kriptografskih protokola i sistema, često za kodiranje ključeva ili sertifikata.

  7. Vrednosti kolačića: Kodiranje složenih struktura podataka za skladištenje u kolačićima.

Alternativa

Iako je Base64 široko korišćen, postoje alternative koje bi mogle biti prikladnije u određenim situacijama:

  1. URL-sigurna Base64: Varijanta koja koristi "-" i "_" umesto "+" i "/" kako bi se izbegli problemi sa URL kodiranjem. Korisna za podatke koji će biti uključeni u URL-ove.

  2. Base32: Koristi skup od 32 karaktera, što rezultira dužim izlazom, ali sa boljom čitljivošću za ljude i bez obzira na velika i mala slova.

  3. Hex Kodiranje: Jednostavna konverzija u heksadecimalni oblik, što je manje efikasno (udvostručava veličinu) ali vrlo jednostavno i široko podržano.

  4. Binarni Prenos: Za velike datoteke ili kada je efikasnost ključna, direktni binarni protokoli kao što je HTTP sa odgovarajućim Content-Type zaglavljima su poželjniji.

  5. Kompresija + Base64: Za velike tekstualne podatke, kompresija pre kodiranja može umanjiti povećanje veličine.

  6. JSON/XML Serijalizacija: Za strukturirane podatke, korišćenje nativne JSON ili XML serijalizacije može biti prikladnije od Base64 kodiranja.

Istorija

Base64 kodiranje ima svoje korene u ranim računarima i telekomunikacionim sistemima gde su binarni podaci morali biti prenošeni preko kanala dizajniranih za tekst.

Formalna specifikacija Base64 prvi put je objavljena 1987. godine kao deo RFC 989, koji je definisao Privatno poboljšano poštansko (PEM). Ovo je kasnije ažurirano u RFC 1421 (1993) i RFC 2045 (1996, kao deo MIME).

Termin "Base64" dolazi od činjenice da kodiranje koristi 64 različita ASCII karaktera za predstavljanje binarnih podataka. Ovaj izbor od 64 karaktera bio je nameran, jer je 64 stepen od 2 (2^6), što čini konverziju između binarnog i Base64 efikasnom.

Tokom vremena, pojavile su se nekoliko varijanti Base64:

  • Standardna Base64: Kako je definisano u RFC 4648, koristeći A-Z, a-z, 0-9, +, / i = za padding
  • URL-sigurna Base64: Koristi - i _ umesto + i / kako bi se izbegli problemi sa URL kodiranjem
  • Sigurna Base64 za nazive datoteka: Slična URL-sigurnoj, dizajnirana za korišćenje u nazivima datoteka
  • Izmenjena Base64 za IMAP: Koristi se u IMAP protokolu sa različitim skupom specijalnih karaktera

I pored toga što je star više od tri decenije, Base64 ostaje osnovni alat u modernom računarstvu, posebno sa porastom web aplikacija i API-ja koji se oslanjaju na tekstualne formate podataka kao što je JSON.

Primeri Koda

Evo primera Base64 kodiranja i dekodiranja u raznim programskim jezicima:

// JavaScript Base64 Kodiranje/Dekodiranje
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Nevažeći Base64 string");
  }
}

// Primer korišćenja
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Kodirano:", encoded);  // SGVsbG8sIFdvcmxkIQ==

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

def encode_to_base64(text):
    # Pretvorite string u bajtove i zatim kodirajte
    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:
        # Pretvorite base64 string u bajtove i zatim dekodirajte
        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"Nevažeći Base64 string: {e}")

# Primer korišćenja
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Kodirano: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Dekodirano: {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Java Base64 Kodiranje/Dekodiranje
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("Nevažeći Base64 string: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Kodirano: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Dekodirano: " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Base64 Kodiranje/Dekodiranje
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Nevažeći Base64 string");
    }
    return $decoded;
}

// Primer korišćenja
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Kodirano: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Dekodirano: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Greška: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Kodiranje/Dekodiranje
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("Nevažeći Base64 string");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Kodirano: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Dekodirano: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Greška: {e.Message}");
        }
    }
}
# Ruby Base64 Kodiranje/Dekodiranje
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 "Nevažeći Base64 string: #{e.message}"
  end
end

# Primer korišćenja
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Kodirano: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Dekodirano: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Greška: #{e.message}"
end
// Go Base64 Kodiranje/Dekodiranje
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("nevažeći Base64 string: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Kodirano:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Greška:", err)
    } else {
        fmt.Println("Dekodirano:", decoded)  // Hello, World!
    }
}
// Swift Base64 Kodiranje/Dekodiranje
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
}

// Primer korišćenja
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Kodirano: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Dekodirano: \(decoded)")  // Hello, World!
    } else {
        print("Greška: Ne može se dekodirati Base64 string")
    }
} else {
    print("Greška: Ne može se kodirati tekst")
}
' Excel VBA Base64 Kodiranje/Dekodiranje
' Napomena: Ovo zahteva referencu 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 = "Greška: Nevažeći Base64 string"
End Function

' Korišćenje u radnom listu:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Kodiranje/Dekodiranje
# Zahteva 'base64enc' paket
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Pretvorite tekst u sirove bajtove, zatim kodirajte
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Pretvorite base64 string u sirove, zatim dekodirajte
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Nevažeći Base64 string:", e$message))
  })
}

# Primer korišćenja
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Kodirano:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Dekodirano:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Greška:", e$message, "\n")
})
% MATLAB Base64 Kodiranje/Dekodiranje
function demo_base64()
    originalText = 'Hello, World!';
    
    % Kodirajte
    encoded = encode_to_base64(originalText);
    fprintf('Kodirano: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Dekodirajte
    try
        decoded = decode_from_base64(encoded);
        fprintf('Dekodirano: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Greška: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Pretvorite tekst u uint8 niz i kodirajte
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Dekodirajte base64 string u uint8 niz
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Nevažeći Base64 string');
    end
end
// C Base64 Kodiranje/Dekodiranje koristeći 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; // Nevažeći Base64 ulaz
    }
    
    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("Kodirano: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Dekodirano: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Greška: Nevažeći Base64 string\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Kodiranje/Dekodiranje
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!("Nevažeća UTF-8 sekvenca: {}", e))
            }
        },
        Err(e) => Err(format!("Nevažeći Base64 string: {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Kodirano: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Dekodirano: {}", decoded),  // Hello, World!
        Err(e) => println!("Greška: {}", e)
    }
}

Ivica i razmatranja

Kada radite sa Base64 kodiranjem i dekodiranjem, obratite pažnju na ove važne aspekte:

  1. Unicode i ne-ASCII karakteri: Kada kodirate tekst sa ne-ASCII karakterima, osigurajte pravilno kodiranje karaktera (obično UTF-8) pre Base64 kodiranja.

  2. Padding: Standardna Base64 koristi padding sa "=" karakterima kako bi se osigurala dužina izlaza višekratnik 4. Neki implementacije dozvoljavaju izostavljanje padding-a, što može izazvati probleme sa kompatibilnošću.

  3. Prelomi linija: Tradicionalne Base64 implementacije umetnu prelome linija (obično svaka 76 karaktera) radi čitljivosti, ali moderne aplikacije često izostavljaju ove.

  4. URL-sigurna Base64: Standardna Base64 koristi "+" i "/" karaktere koji imaju posebna značenja u URL-ovima. Za kontekste URL-a, koristite URL-sigurnu Base64 koja zamenjuje ove sa "-" i "_".

  5. Razmak: Kada dekodirate, neke implementacije su blage i ignorišu razmake, dok druge zahtevaju tačan ulaz.

  6. Povećanje veličine: Base64 kodiranje povećava veličinu podataka za otprilike 33% (4 izlazna bajta za svaki 3 ulazna bajta).

  7. Performanse: Base64 kodiranje/dekodiranje može biti računski intenzivno za veoma velike podatke. Razmotrite pristupe strimovanja za velike datoteke.

Reference

  1. RFC 4648 - Base16, Base32, i Base64 podaci
  2. RFC 2045 - MIME Prvi deo: Format internet poruka
  3. MDN Web Docs: Base64 kodiranje i dekodiranje
  4. Base64 - Vikipedija
  5. MIME - Vikipedija
Feedback