How does Base64 work

  sonic0002        2016-03-09 23:47:40       32,804        2          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

Base64 是一種資料編碼方案,用於安全資料傳輸,例如 HTTP 及其擴展。Base64 編碼可以將任意位元組群組轉換為可讀的 ASCII 字元序列。這些轉換後的字元可以安全地放入 HTTP 標頭中,而不會在同級處理 HTTP 標頭時造成任何問題。

Base64 編碼是作為 MIME 內容傳輸編碼的一部分而發明的。它類似於其他編碼方案,例如 UuencodeBinHex,但效率更高。

8 位元到 6 位元

Base64 會將位元組分成 6 位元的群組。每 6 位元將對應一個字元。此字元將是 Base64 字元表中的 64 個字元之一。這 64 個字元是通用的,可以安全地放入 HTTP 標頭中。這些字元包括 a-z、A-Z、0-9、+、/ 和一個特殊用途字元 =(第 65 個字元)

由於 Base64 將使用一個字元來表示 6 位元的資料,因此 Base64 編碼資料的大小將比原始資料大 33%。

以下是一個 Base64 如何運作的簡單範例。假設有三個字元「Ow!」要進行 Base64 編碼。

  1. 字元「Ow!」將轉換為三個 8 位元組 (0x4F、0x77、0x21)
  2. 這 3 個位元組將轉換為 24 位元 (01001111 01110111 00100001)
  3. 這 24 位元將分成 6 位元的群組 (010011、110111、011100、1000001)。
  4. 每個 6 位元將是一個介於 0 和 63 之間的值,它將對應到上述 64 個字元之一。編碼後的最終結果是「T3ch」。

Base64 填充

Base64 將採用位元組序列並將其分成 6 位元的群組。有時不可能將序列分成精確的 6 位元群組數。在這種情況下,將在序列中填充 0,使其成為精確的 24 位元群組數 (6 和 8 的最小公倍數)。此過程稱為填充。

在編碼填充資料時,如果存在完全填充的 6 位元群組 (群組中的每個位元都經過填充,而不包含來自原始資料的任何位元),則會將其對應到「=」。

以下是一些填充如何運作的範例:

  • a:a -- 011000 010011 101001 100001 -- YTph

  • a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==

  • a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=

  • a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh

需要填充到 24 位元而不是 6 位元的原因是,它確保如果將兩個 Based64 編碼的序列串聯然後解碼,則解碼後的資料與原始資料相同。

例如,如果我們編碼兩個字串「a.aa」和「a.aa」,如果我們只填充到 6 位元,則「a.aa」的編碼字串將為 011000 010011 101001 100001 011000 010000。現在,如果將這兩個編碼字串串聯,它將變成 010011 101001 100001 011000 010000 010011 101001 100001 011000 010000。如果解碼此字串,結果將為「01001110 10011000 01011000 01000001 00111010 01100001 01100001 0000」,並且無法正確解碼。

參考資料:https://segmentfault.com/a/1190000004533485?_ea=647157

ALGORITHM  BASE64 

       

  RELATED


  2 COMMENTS


Jo [Reply]@ 2017-11-02 16:32:07

Simple and neat! thanks

Anonymous [Reply]@ 2018-01-11 18:37:59
901234-123457


  RANDOM FUN

Daily life of developer