Kesimpulan Anda bahwa padding tidak perlu adalah benar. Itu selalu memungkinkan untuk menentukan panjang input dengan jelas dari panjang urutan yang dikodekan.
Namun, padding berguna dalam situasi di mana string yang dikodekan base64 digabungkan sedemikian rupa sehingga panjang urutan individu hilang, seperti yang mungkin terjadi, misalnya, dalam protokol jaringan yang sangat sederhana.
Jika belum diisi string yang tidak digabungkan, data asli tidak dapat dipulihkan karena informasi tentang jumlah byte ganjil di akhir setiap urutan individu hilang. Namun, jika urutan berlapis digunakan, tidak ada ambiguitas, dan urutan secara keseluruhan dapat diterjemahkan dengan benar.
Edit: Ilustrasi
Misalkan kita memiliki program yang menyandikan kata-kata dengan base64, menggabungkannya dan mengirimkannya melalui jaringan. Ini mengkodekan "I", "AM" dan "TJM", menyatukan hasil tanpa padding dan mengirimkannya.
I
dikodekan ke SQ
( SQ==
dengan padding)
AM
dikodekan ke QU0
( QU0=
dengan padding)
TJM
dikodekan ke VEpN
( VEpN
dengan padding)
Jadi data yang dikirimkan adalah SQQU0VEpN
. Penerima base64-menerjemahkan ini sebagai I\x04\x14\xd1Q)
bukan yang dimaksudkan IAMTJM
. Hasilnya tidak masuk akal karena pengirim telah menghancurkan informasi tentang di mana setiap kata berakhir dalam urutan yang dikodekan. Jika pengirim mengirim SQ==QU0=VEpN
sebagai gantinya, penerima bisa saja mendekodekan ini sebagai tiga urutan base64 terpisah yang akan digabungkan untuk diberikan IAMTJM
.
Mengapa Repot dengan Padding?
Mengapa tidak merancang protokol untuk mengawali setiap kata dengan panjang bilangan bulat? Kemudian penerima dapat mendekode aliran dengan benar dan tidak perlu ada padding.
Itu ide yang bagus, selama kita tahu panjang data yang kita enkode sebelum kita mulai mengkodekannya. Tetapi bagaimana jika, alih-alih kata-kata, kami menyandikan potongan video dari kamera langsung? Kita mungkin tidak mengetahui panjang setiap potongan sebelumnya.
Jika protokol menggunakan bantalan, tidak perlu mengirimkan panjang sama sekali. Data dapat dikodekan saat masuk dari kamera, setiap bagian diakhiri dengan bantalan, dan penerima akan dapat memecahkan kode aliran dengan benar.
Jelas itu adalah contoh yang dibuat-buat, tapi mungkin ini menggambarkan mengapa padding mungkin bisa membantu dalam beberapa situasi.
Pada catatan terkait, berikut adalah konverter dasar untuk konversi dasar sewenang-wenang yang saya buat untuk Anda. Nikmati! https://convert.zamicol.com/
Apa itu Karakter Padding?
Karakter padding membantu memenuhi persyaratan panjang dan tidak memiliki arti.
Contoh Pengisi Desimal: Mengingat persyaratan arbitrer, semua string memiliki panjang 8 karakter, angka 640 dapat memenuhi persyaratan ini menggunakan 0 sebelumnya sebagai karakter pengisi karena tidak memiliki arti, "00000640".
Pengkodean Biner
Paradigma Byte: Byte adalah unit pengukuran standar de facto dan skema encoding apa pun harus berhubungan kembali dengan byte.
Base256 sangat cocok dengan paradigma ini. Satu byte sama dengan satu karakter di base256.
Base16 , heksadesimal atau heksadesimal, menggunakan 4 bit untuk setiap karakter. Satu byte dapat mewakili dua karakter base16.
Base64 tidak cocok secara merata ke dalam paradigma byte (begitu pula base32), tidak seperti base256 dan base16. Semua karakter base64 dapat direpresentasikan dalam 6 bit, 2 bit pendek dari byte penuh.
Kita dapat merepresentasikan pengkodean base64 versus paradigma byte sebagai pecahan: 6 bit per karakter lebih dari 8 bit per byte . Pengurangan fraksi ini adalah 3 byte lebih dari 4 karakter.
Rasio ini, 3 byte untuk setiap 4 karakter base64, adalah aturan yang ingin kami ikuti saat mengenkode base64. Pengkodean Base64 hanya dapat menjanjikan pengukuran dengan bundel 3 byte, tidak seperti base16 dan base256 di mana setiap byte dapat berdiri sendiri.
Begitu mengapa padding didorong meskipun pengkodean dapat berfungsi dengan baik tanpa karakter padding?
Jika panjang aliran tidak diketahui atau jika mungkin berguna untuk mengetahui secara pasti kapan aliran data berakhir, gunakan padding. Karakter padding mengkomunikasikan secara eksplisit bahwa titik ekstra tersebut harus kosong dan mengesampingkan ambiguitas. Bahkan jika panjangnya tidak diketahui dengan padding, Anda akan tahu di mana aliran data Anda berakhir.
Sebagai contoh tandingan, beberapa standar seperti JOSE tidak mengizinkan karakter pengisi. Dalam kasus ini, jika ada sesuatu yang hilang, tanda tangan kriptografik tidak akan berfungsi atau karakter non base64 lainnya akan hilang (seperti "."). Meskipun asumsi tentang panjang tidak dibuat, padding tidak diperlukan karena jika ada sesuatu yang salah tidak akan berhasil.
Dan inilah yang dikatakan base64 RFC,
Padding memungkinkan kita untuk memecahkan kode pengkodean base64 dengan janji tidak ada bit yang hilang. Tanpa padding tidak ada lagi pengakuan eksplisit untuk pengukuran dalam bundel tiga byte. Tanpa padding, Anda mungkin tidak dapat menjamin reproduksi yang tepat dari pengkodean asli tanpa informasi tambahan biasanya dari tempat lain dalam tumpukan Anda, seperti TCP, checksum, atau metode lain.
Contoh
Berikut adalah contoh formulir RFC 4648 ( http://tools.ietf.org/html/rfc4648#section-8 )
Setiap karakter di dalam fungsi "BASE64" menggunakan satu byte (base256). Kami kemudian menerjemahkannya ke base64.
Berikut ini pembuat enkode yang dapat Anda mainkan: http://www.motobit.com/util/base64-decoder-encoder.asp
sumber
char*
, Anda memerlukan ukuran string atau terminator null. Padding berlebihan. Makanya, pertanyaan OP.Tidak banyak manfaatnya di zaman modern ini. Jadi mari kita lihat ini sebagai pertanyaan tentang apa yang asli tujuan sejarah .
Pengkodean Base64 muncul pertama kali di RFC 1421 tertanggal 1993. RFC ini sebenarnya difokuskan pada mengenkripsi email, dan base64 dijelaskan dalam satu bagian kecil 4.3.2.4 .
RFC ini tidak menjelaskan tujuan padding. Yang paling dekat kita harus menyebutkan tujuan aslinya adalah kalimat ini:
Ini tidak menyarankan penggabungan (jawaban teratas di sini), atau kemudahan implementasi sebagai tujuan eksplisit untuk padding. Namun, mengingat seluruh deskripsi, bukan tidak beralasan untuk mengasumsikan bahwa ini mungkin dimaksudkan untuk membantu decoder membaca input dalam unit 32-bit ( "quanta" ). Itu tidak menguntungkan hari ini, namun pada tahun 1993 kode C yang tidak aman kemungkinan besar akan benar-benar memanfaatkan properti ini.
sumber
b'Zm9vYmFyZm9vYg==' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy' b'Zm9vYmFyZm9vYmFyZg==' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v'
adalah sama denganb'Zm9vYmFyZm9vYg=' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy=' b'Zm9vYmFyZm9vYmFyZg=' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v='