Eksplorasi mendalam algoritma AES-256-CBC, dasar matematika Galois Field, visualisasi proses round, metodologi pengujian latensi, dan integrasi sistem dashboard.
Double-klik file web-dashboard/index.html di File Explorer. Atau jika memakai VS
Code, gunakan Live Server untuk menghindari masalah CORS.
Dashboard secara otomatis memuat kunci default SkadutaPresensi2025SecureKey1234
dari project Dart. Indikator hijau di pojok kanan atas menandakan kunci aktif.
Navigasi menggunakan sidebar kiri. Di perangkat mobile, sidebar dapat dibuka dengan tombol hamburger (≡) di pojok kiri atas.
Halaman utama berisi:
Setara dengan menu "Enkripsi Manual" di program Dart:
Setara dengan menuBatchTest() di aes_test.dart:
code/original/,
code/enkripsi/, code/dekripsi/
latency.log dari Dartdata.log dari DartSkadutaPresensi2025SecureKey1234Fitur ini memungkinkan pengguna melihat representasi data di level bit (binary). Sangat berguna untuk analisis struktur data sebelum dan sesudah diproses oleh algoritma AES.
01011010.
Navigasi secepat kilat tanpa perlu melepas tangan dari keyboard:
| Tombol | Aksi / Fungsi |
|---|---|
1 - 9 |
Berpindah antar tab secara instan |
T |
Ganti Tema (Dark ↔ Light) |
Esc |
Buka / Tutup Sidebar navigasi |
Enter |
Terapkan Kunci Enkripsi (di modal kunci) |
.json.
AES tidak menggunakan matematika bilangan bulat biasa, melainkan Galois Field GF(2⁸). Dalam medan ini, semua hasil operasi (penjumlahan, perkalian) dijamin tetap berada dalam rentang 0–255 (1 byte).
Perkalian dengan {02} (x) dalam GF(2⁸) sering disebut xtime:
Kriptografi membutuhkan sifat **"Avalanche Effect"** (efek domino). Dalam GF(2⁸), perubahan 1 bit pada input akan menyebar secara merata dan tidak terduga ke seluruh output setelah operasi perkalian. Ini mencegah pola linear yang mudah dipecah oleh kriptanalisis.
0x53 (biner: 01010011) dalam AES direpresentasikan sebagai
polinomial:
x⁶ + x⁴ + x + 1.
AES (Advanced Encryption Standard) dipilih oleh NIST (National Institute of Standards and Technology) pada tahun 2001 sebagai standar enkripsi simetris pengganti DES. Algoritma yang terpilih adalah Rijndael, karya kriptografer Belgia Joan Daemen dan Vincent Rijmen.
| Varian | Ukuran Kunci | Jumlah Round | Keamanan |
|---|---|---|---|
| AES-128 | 128-bit (16 byte) | 10 round | ~128-bit security |
| AES-192 | 192-bit (24 byte) | 12 round | ~192-bit security |
| AES-256 ✓ | 256-bit (32 byte) | 14 round | ~256-bit security |
Dashboard ini menggunakan AES-256 dengan kunci 32 karakter ASCII = 256-bit. Ini adalah level tertinggi dan paling aman yang tersedia di AES.
AES adalah enkripsi simetris — kunci yang sama digunakan untuk enkripsi dan dekripsi. Ini berbeda dengan enkripsi asimetris (RSA) yang menggunakan pasangan kunci publik-privat.
AES beroperasi pada blok data 128-bit (16 byte) tetap. Jika plaintext lebih panjang dari 16 byte, ia dibagi menjadi beberapa blok, dan mode operasi (seperti CBC) menentukan cara memproses blok-blok tersebut. Jika panjang data tidak kelipatan 16, ditambahkan padding PKCS7.
AES merepresentasikan tiap blok 16 byte sebagai matriks 4×4 byte yang disebut state. Semua operasi internal AES dilakukan pada matriks ini:
State matrix 4×4 (tiap sel = 1 byte)
Byte-byte input diisikan kolom per kolom (column-major order). Sel diagonal yang disorot adalah diagonal utama yang dipakai dalam operasi ShiftRows.
Setiap operasi round AES (SubBytes, ShiftRows, MixColumns, AddRoundKey) memanipulasi matriks ini secara berurutan.
Karena AES membutuhkan input kelipatan 16 byte, padding PKCS7 ditambahkan:
0x03 0x03 0x030x10// Contoh PKCS7: "Hello" (5 byte) → perlu 11 byte padding "Hello" → [48 65 6C 6C 6F | 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B] (5 byte) (11 byte padding = nilai 0x0B = 11)
Ulangi untuk Round 1 – 13:
Setiap byte dalam state diganti menggunakan S-Box (Substitution Box) — tabel lookup 256 entri yang sudah ditetapkan di standar AES. Operasi ini bersifat non-linear, sehingga menyulitkan analisis kriptografi.
0x53 → S-Box → 0xEDSetiap baris dalam state matrix digeser ke kiri secara siklik:
Tujuan: menyebarkan byte-byte dari kolom yang sama ke kolom berbeda (diffusion).
// Sebelum ShiftRows: [b0 b4 b8 b12] // baris 0 — tidak berubah [b1 b5 b9 b13] → // baris 1 — geser 1 [b2 b6 b10 b14] // baris 2 — geser 2 [b3 b7 b11 b15] // baris 3 — geser 3 // Sesudah ShiftRows: [b0 b4 b8 b12] [b5 b9 b13 b1 ] [b10 b14 b2 b6 ] [b15 b3 b7 b11]
Setiap kolom dari state matrix diperlakukan sebagai polinomial atas GF(2⁸) (Galois
Field) dan dikalikan dengan polinomial tetap {03}x³+{01}x²+{01}x+{02}. Ini menghasilkan
efek diffusion yang kuat — setiap byte output bergantung pada keempat byte input di kolom yang
sama.
State di-XOR byte per byte dengan round key yang dihasilkan dari Key Schedule. Ini menambahkan ketergantungan kunci ke tiap round. Karena XOR invertible, dekripsi cukup XOR lagi dengan round key yang sama.
AES dasar (ECB — Electronic Codebook) mengenkripsi tiap blok secara independen. Ini tidak aman karena dua blok plaintext yang sama menghasilkan ciphertext yang sama. Mode operasi seperti CBC mengatasi masalah ini.
Pada CBC, setiap blok plaintext di-XOR dengan ciphertext blok sebelumnya sebelum dienkripsi. Blok pertama di-XOR dengan IV (Initialization Vector).
Dan seterusnya hingga blok terakhir...
Dekripsi CBC bersifat parallelizable — setiap blok didekripsi terlebih dahulu oleh AES, lalu di-XOR dengan ciphertext blok sebelumnya (atau IV untuk blok pertama).
IV adalah nilai acak 16 byte yang digunakan untuk blok pertama. IV bersifat:
crypto.getRandomValues())
Base64(IV[16 byte] + Ciphertext). IV dan ciphertext digabungkan,
lalu di-encode Base64. Saat dekripsi, 16 byte pertama diambil sebagai IV dan sisanya sebagai ciphertext.
Format ini identik dengan implementasi Dart (api_encryption.dart).
AES-256 tidak langsung menggunakan kunci asal pada tiap round. Proses Key Schedule menghasilkan round keys (sub-key) dari kunci 256-bit untuk setiap round:
Untuk dekripsi AES, diperlukan operasi InvMixColumns yang diaplikasikan ke round key (kecuali round pertama dan terakhir). Ini disebut Equivalent Inverse Cipher.
InvMixColumns melibatkan perkalian di GF(2⁸) menggunakan konstanta berbeda dari enkripsi. Operasi ini memerlukan komputasi tambahan: Konstanta {0E, 0B, 0D, 09} memiliki bobot bit yang lebih banyak dibanding {02, 03, 01}.
| Operasi | Enkripsi | Dekripsi |
|---|---|---|
| SubBytes | S-Box lookup | InvSubBytes (InvS-Box lookup) |
| ShiftRows | Geser kiri | Geser kanan (invers) |
| MixColumns | Multiply {02,03,01,01} | InvMixColumns {0E,0B,0D,09} — lebih berat! |
| AddRoundKey | XOR round key | XOR round key + InvMixColumns(key) |
_simIKS() (Simulated Inverse Key Schedule) yang
mensimulasikan overhead komputasi GF(2⁸) dari InvMixColumns. Ini memastikan latensi dekripsi yang
terukur di dashboard sebanding dengan implementasi Dart, bukan hanya operasi Web Crypto
yang dioptimasi browser.
| Varian | Kunci Asal | Round Keys | Total Byte Round Key |
|---|---|---|---|
| AES-128 | 128-bit | 11 | 176 byte |
| AES-192 | 192-bit | 13 | 208 byte |
| AES-256 | 256-bit | 15 | 240 byte |
// Output akhir adalah string Base64 dari: [IV: 16 byte random] + [AES-CBC Ciphertext] // Contoh (dalam byte hex): IV : A1 B2 C3 D4 E5 F6 07 18 29 3A 4B 5C 6D 7E 8F 90 (16 byte) Cipher : XX XX XX XX XX XX XX XX ... XX XX XX XX XX XX XX (N×16 byte) Combined: A1 B2 C3 ... 90 | XX XX XX ... Base64 : obLDlOX2Bxgp... (string Base64)
⌈(16 + len(ciphertext)) / 3⌉ × 4 karakter
Klaim bahwa "ukuran file hasil dekripsi = 2× ukuran asli" tidak berlaku standar untuk AES-CBC. Secara teknis, dekripsi menghasilkan kembali plaintext asli (ukuran sama ± padding).
Kemungkinan klaim tersebut merujuk pada skenario di mana file output menyimpan plaintext + ciphertext sekaligus, sehingga total menjadi ~2×. Dashboard mengecek rasio 1.8–2.2× dan menampilkan penjelasan pada setiap perbandingan ukuran.
Dashboard menggunakan high-resolution timestamp melalui performance.now(). Berbeda dengan
Date.now() yang memiliki keterbatasan presisi, performance.now() memberikan
akurasi hingga seperseribu milidetik (μs), sangat krusial untuk mengukur operasi kriptografi yang cepat.
Throughput dihitung dengan rumus:
Speed (KB/s) = (Size in Bytes / (Time in ms / 1000)) / 1024. Ini memberikan gambaran
performa hardware dalam memproses data per detik.
Setiap operasi batch menyertakan uji verifikasi:
Plaintext ≡ Decrypted(Encrypted(Plaintext)). Jika hasil dekripsi tidak identik bit-per-bit
dengan input asli, dashboard akan menandai status FAIL.
Aplikasi dibangun dengan arsitektur Serverless SPA (Single Page Application) yang fokus pada keamanan data lokal.
| Kode Dart | Implementasi Web |
|---|---|
| ApiEncryption.encrypt() | aesEncrypt() — Web Crypto AES-CBC |
| ApiEncryption.decrypt() | aesDecrypt() + _simIKS() |
| ApiEncryption.setKey() | importKey() via SubtleCrypto.importKey() |
| IV.fromSecureRandom(16) | crypto.getRandomValues(Uint8Array(16)) |
| base64Encode(iv + cipher) | btoa(String.fromCharCode(...iv, ...cipher)) |
| base64Decode(input) | atob(input) → Uint8Array |
| Stopwatch + elapsedMicroseconds | performance.now() (presisi sub-ms) |
| menuBatchTest() | doBatch() — sama persis alurnya |
| latency.log / data.log | localStorage + export .log |
| code/original, enkripsi, dekripsi | Download file dari Blob URL |
Kunci yang digunakan adalah string UTF-8 32 karakter. Di Dart:
Key.fromUtf8(_key). Di Web: TextEncoder().encode(key) → 32 byte →
SubtleCrypto.importKey(). Keduanya menghasilkan kunci 256-bit yang identik.
// Dart (api_encryption.dart) final key = Key.fromUtf8("SkadutaPresensi2025SecureKey1234"); final iv = IV.fromSecureRandom(16); final combined = iv.bytes + encrypted.bytes; return base64Encode(combined); // JavaScript (app.js) const iv = crypto.getRandomValues(new Uint8Array(16)); const enc = await crypto.subtle.encrypt({name:'AES-CBC',iv}, key, data); const out = new Uint8Array(16 + enc.byteLength); out.set(iv,0); out.set(new Uint8Array(enc),16); return btoa(String.fromCharCode(...out));
Ya. Dashboard ini berjalan sepenuhnya di browser (client-side). Tidak ada data yang dikirim ke server manapun. Enkripsi/dekripsi dilakukan menggunakan Web Crypto API bawaan browser yang diimplementasikan di level C++ native dan telah diaudit secara keamanan.
Karena Inverse Key Schedule — dekripsi AES memerlukan transformasi InvMixColumns terhadap round keys yang melibatkan perkalian polinomial di GF(2⁸). AES-256 memiliki 14 round, sehingga overhead ini signifikan. Dokumentasi teknis: NIST FIPS 197, Section 5.3.
Upload folder web-dashboard/ ke repository baru atau yang sudah ada.
Settings → Pages → Branch: main, Folder: /web-dashboard → Save.
Dashboard tersedia di https://[username].github.io/[repo-name]/ dalam beberapa
menit.
localStorage menyimpan data di browser lokal tanpa enkripsi tambahan. Data yang tersimpan (log latensi, log data, statistik) tidak mengandung plaintext sensitif — hanya metadata operasi. Jangan menyimpan plaintext atau kunci di localStorage secara manual.
Umumnya 5–10 MB per domain, bergantung browser dan pengaturan. Dashboard menampilkan estimasi penggunaan vs kapasitas 5 MB di tab Penyimpanan Lokal.
Ya, hampir sepenuhnya. Tanpa internet, Google Fonts tidak dimuat (font fallback ke system sans-serif), namun semua fungsi enkripsi, dekripsi, log, dan penyimpanan tetap berjalan normal.
Dokumentasi AES-256 Dashboard — Referensi: NIST FIPS 197, RFC 3602 (AES-CBC), PKCS #7
← Kembali ke Dashboard