Whiz Tools

Pengkode/Pengurai Base64

Mengonversi teks ke dan dari pengkodean Base64

Salin

Encoder dan Dekoder Base64

Pendahuluan

Base64 adalah skema pengkodean biner-ke-teks yang mewakili data biner dalam format string ASCII. Ini dirancang untuk membawa data yang disimpan dalam format biner melalui saluran yang hanya mendukung konten teks dengan andal. Pengkodean Base64 mengonversi data biner menjadi satu set 64 karakter (itulah sebabnya namanya) yang dapat ditransmisikan dengan aman melalui protokol berbasis teks tanpa kerusakan data.

Set karakter Base64 terdiri dari:

  • Huruf kapital A-Z (26 karakter)
  • Huruf kecil a-z (26 karakter)
  • Digit 0-9 (10 karakter)
  • Dua karakter tambahan, biasanya "+" dan "/" (2 karakter)

Alat ini memungkinkan Anda untuk dengan mudah mengkodekan teks ke format Base64 atau mendekode string Base64 kembali ke teks aslinya. Ini sangat berguna bagi pengembang, profesional TI, dan siapa saja yang bekerja dengan data yang perlu ditransmisikan dengan aman melalui saluran berbasis teks.

Cara Kerja Pengkodean Base64

Proses Pengkodean

Pengkodean Base64 bekerja dengan mengonversi setiap kelompok tiga byte (24 bit) data biner menjadi empat karakter Base64. Prosesnya mengikuti langkah-langkah ini:

  1. Konversi teks input ke representasi biner (menggunakan pengkodean ASCII atau UTF-8)
  2. Kelompokkan data biner menjadi potongan 24 bit (3 byte)
  3. Pisahkan setiap potongan 24-bit menjadi empat kelompok 6-bit
  4. Konversi setiap kelompok 6-bit menjadi karakter Base64 yang sesuai

Ketika panjang input tidak dapat dibagi dengan 3, padding dengan karakter "=" ditambahkan untuk mempertahankan rasio 4:3 dari panjang output ke input.

Representasi Matematis

Untuk urutan byte b1,b2,b3b_1, b_2, b_3, karakter Base64 yang sesuai c1,c2,c3,c4c_1, c_2, c_3, c_4 dihitung sebagai:

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

Di mana Base64[i]\text{Base64}[i] mewakili karakter ke-ii dalam alfabet Base64.

Proses Dekoding

Dekoding Base64 membalikkan proses pengkodean:

  1. Konversi setiap karakter Base64 ke nilai 6-bitnya
  2. Gabungkan nilai 6-bit ini
  3. Kelompokkan bit menjadi potongan 8-bit (byte)
  4. Konversi setiap byte ke karakter yang sesuai

Padding

Ketika jumlah byte yang akan dikodekan tidak dapat dibagi dengan 3, padding diterapkan:

  • Jika ada satu byte yang tersisa, itu dikonversi menjadi dua karakter Base64 diikuti dengan "=="
  • Jika ada dua byte yang tersisa, mereka dikonversi menjadi tiga karakter Base64 diikuti dengan "="

Contoh

Mari kita encode teks "Hello" ke Base64:

  1. Representasi ASCII dari "Hello": 72 101 108 108 111
  2. Representasi biner: 01001000 01100101 01101100 01101100 01101111
  3. Pengelompokan menjadi potongan 6-bit: 010010 000110 010101 101100 011011 000110 1111
  4. Potongan terakhir hanya memiliki 4 bit, jadi kita padding dengan nol: 010010 000110 010101 101100 011011 000110 111100
  5. Mengonversi ke desimal: 18, 6, 21, 44, 27, 6, 60
  6. Mencari dalam alfabet Base64: S, G, V, s, b, G, 8
  7. Hasilnya adalah "SGVsbG8="

Perhatikan padding "=" di akhir karena panjang input (5 byte) tidak dapat dibagi dengan 3.

Rumus

Rumus umum untuk menghitung panjang string yang dikodekan Base64 adalah:

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

Di mana x\lceil x \rceil mewakili fungsi langit-langit (pembulatan ke atas ke bilangan bulat terdekat).

Kasus Penggunaan

Pengkodean Base64 banyak digunakan dalam berbagai aplikasi:

  1. Lampiran Email: MIME (Multipurpose Internet Mail Extensions) menggunakan Base64 untuk mengkodekan lampiran biner dalam email.

  2. Data URL: Menyematkan gambar kecil, font, atau sumber daya lainnya langsung dalam HTML, CSS, atau JavaScript menggunakan skema URL data:.

  3. Komunikasi API: Mengirimkan data biner dengan aman dalam payload JSON atau format API berbasis teks lainnya.

  4. Menyimpan Data Biner dalam Format Teks: Ketika data biner perlu disimpan dalam XML, JSON, atau format berbasis teks lainnya.

  5. Sistem Autentikasi: Autentikasi Dasar dalam HTTP menggunakan pengkodean Base64 (meskipun bukan untuk keamanan, hanya untuk pengkodean).

  6. Kriptografi: Sebagai bagian dari berbagai protokol dan sistem kriptografi, sering untuk mengkodekan kunci atau sertifikat.

  7. Nilai Cookie: Mengkodekan struktur data yang kompleks untuk disimpan dalam cookie.

Alternatif

Meskipun Base64 banyak digunakan, ada alternatif yang mungkin lebih sesuai dalam situasi tertentu:

  1. Base64 Aman URL: Varian yang menggunakan "-" dan "_" sebagai pengganti "+" dan "/" untuk menghindari masalah pengkodean URL. Berguna untuk data yang akan disertakan dalam URL.

  2. Base32: Menggunakan set 32 karakter, menghasilkan output yang lebih panjang tetapi dengan keterbacaan manusia yang lebih baik dan ketidakpekaan terhadap huruf besar/kecil.

  3. Pengkodean Hex: Konversi sederhana ke heksadesimal, yang kurang efisien (menggandakan ukuran) tetapi sangat sederhana dan didukung secara luas.

  4. Transfer Biner: Untuk file besar atau ketika efisiensi sangat penting, protokol transfer biner langsung seperti HTTP dengan header Content-Type yang sesuai lebih disukai.

  5. Kompresi + Base64: Untuk data teks besar, mengompres sebelum mengkodekan dapat mengurangi peningkatan ukuran.

  6. Serialisasi JSON/XML: Untuk data terstruktur, menggunakan serialisasi JSON atau XML asli mungkin lebih tepat daripada pengkodean Base64.

Sejarah

Pengkodean Base64 memiliki akar dalam sistem komputasi dan telekomunikasi awal di mana data biner perlu ditransmisikan melalui saluran yang dirancang untuk teks.

Spesifikasi formal Base64 pertama kali diterbitkan pada tahun 1987 sebagai bagian dari RFC 989, yang mendefinisikan Privacy Enhanced Mail (PEM). Ini kemudian diperbarui dalam RFC 1421 (1993) dan RFC 2045 (1996, sebagai bagian dari MIME).

Istilah "Base64" berasal dari fakta bahwa pengkodean menggunakan 64 karakter ASCII yang berbeda untuk mewakili data biner. Pemilihan 64 karakter ini disengaja, karena 64 adalah pangkat dua (2^6), yang membuat konversi antara biner dan Base64 efisien.

Seiring waktu, beberapa varian Base64 telah muncul:

  • Base64 Standar: Seperti yang didefinisikan dalam RFC 4648, menggunakan A-Z, a-z, 0-9, +, / dan = untuk padding
  • Base64 Aman URL: Menggunakan - dan _ sebagai pengganti + dan / untuk menghindari masalah pengkodean URL
  • Base64 Aman Nama File: Mirip dengan Base64 Aman URL, dirancang untuk digunakan dalam nama file
  • Base64 Dimodifikasi untuk IMAP: Digunakan dalam protokol IMAP dengan set karakter khusus yang berbeda

Meskipun sudah lebih dari tiga dekade, Base64 tetap menjadi alat dasar dalam komputasi modern, terutama dengan munculnya aplikasi web dan API yang sangat bergantung pada format data berbasis teks seperti JSON.

Contoh Kode

Berikut adalah contoh pengkodean dan dekoding Base64 dalam berbagai bahasa pemrograman:

// Pengkodean/Pengodekan Base64 JavaScript
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("String Base64 tidak valid");
  }
}

// Contoh penggunaan
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Terenkode:", encoded);  // SGVsbG8sIFdvcmxkIQ==

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

def encode_to_base64(text):
    # Konversi string ke bytes dan kemudian encode
    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:
        # Konversi string base64 ke bytes dan kemudian decode
        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 tidak valid: {e}")

# Contoh penggunaan
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Terenkode: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

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

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

// Contoh penggunaan
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Terenkode: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Terdecoding: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Kesalahan: " . $e->getMessage() . "\n";
}
?>
// Pengkodean/Pengodekan Base64 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("String Base64 tidak valid");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Terenkode: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Terdecoding: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Kesalahan: {e.Message}");
        }
    }
}
# Pengkodean/Pengodekan Base64 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 "String Base64 tidak valid: #{e.message}"
  end
end

# Contoh penggunaan
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Terenkode: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Terdecoding: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Kesalahan: #{e.message}"
end
// Pengkodean/Pengodekan Base64 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("string Base64 tidak valid: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Terenkode:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Kesalahan:", err)
    } else {
        fmt.Println("Terdecoding:", decoded)  // Hello, World!
    }
}
// Pengkodean/Pengodekan Base64 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
}

// Contoh penggunaan
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Terenkode: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Terdecoding: \(decoded)")  // Hello, World!
    } else {
        print("Kesalahan: Tidak dapat mendekode string Base64")
    }
} else {
    print("Kesalahan: Tidak dapat mengkodekan teks")
}
' Pengkodean/Pengodekan Base64 Excel VBA
' Catatan: Ini memerlukan referensi ke 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 = "Kesalahan: String Base64 tidak valid"
End Function

' Penggunaan dalam worksheet:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# Pengkodean/Pengodekan Base64 R
# Memerlukan paket 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Konversi teks ke byte mentah, lalu encode
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Konversi string base64 ke byte mentah, lalu decode
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("String Base64 tidak valid:", e$message))
  })
}

# Contoh penggunaan
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Terenkode:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Terdecoding:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Kesalahan:", e$message, "\n")
})
% Pengkodean/Pengodekan Base64 MATLAB
function demo_base64()
    originalText = 'Hello, World!';
    
    % Encode
    encoded = encode_to_base64(originalText);
    fprintf('Terenkode: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Decode
    try
        decoded = decode_from_base64(encoded);
        fprintf('Terdecoding: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Kesalahan: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Konversi teks ke array uint8 dan encode
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Decode string base64 ke array uint8
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('String Base64 tidak valid');
    end
end
// Pengkodean/Pengodekan Base64 C menggunakan 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 tidak valid
    }
    
    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("Terenkode: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Terdecoding: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Kesalahan: String Base64 tidak valid\n");
    }
    
    free(encoded);
    
    return 0;
}
// Pengkodean/Pengodekan Base64 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!("Urutan UTF-8 tidak valid: {}", e))
            }
        },
        Err(e) => Err(format!("String Base64 tidak valid: {}", e))
    }
}

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

Kasus Tepi dan Pertimbangan

Saat bekerja dengan pengkodean dan dekoding Base64, perhatikan pertimbangan penting ini:

  1. Karakter Unicode dan Non-ASCII: Saat mengkodekan teks dengan karakter non-ASCII, pastikan pengkodean karakter yang tepat (biasanya UTF-8) sebelum pengkodean Base64.

  2. Padding: Base64 standar menggunakan padding dengan karakter "=" untuk memastikan panjang output adalah kelipatan 4. Beberapa implementasi mengizinkan penghapusan padding, yang dapat menyebabkan masalah kompatibilitas.

  3. Pemisahan Baris: Implementasi Base64 tradisional menyisipkan pemisahan baris (biasanya setiap 76 karakter) untuk keterbacaan, tetapi aplikasi modern sering mengabaikannya.

  4. Base64 Aman URL: Base64 standar menggunakan karakter "+" dan "/" yang memiliki arti khusus dalam URL. Untuk konteks URL, gunakan Base64 aman URL yang mengganti ini dengan "-" dan "_".

  5. Whitespace: Saat mendekode, beberapa implementasi bersifat toleran dan mengabaikan whitespace, sementara yang lain memerlukan input yang tepat.

  6. Peningkatan Ukuran: Pengkodean Base64 meningkatkan ukuran data sekitar 33% (4 byte output untuk setiap 3 byte input).

  7. Kinerja: Pengkodean/dekoding Base64 bisa sangat intensif secara komputasi untuk data yang sangat besar. Pertimbangkan pendekatan streaming untuk file besar.

Referensi

  1. RFC 4648 - Pengkodean Data Base16, Base32, dan Base64
  2. RFC 2045 - MIME Bagian Satu: Format Isi Pesan Internet
  3. MDN Web Docs: Pengkodean dan Dekoding Base64
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Umpan balik