olNGIb4NkK5r2x7x4oG3GpEzizVpnY6KNCck9cym

在編碼方式如 Base64、Base32 中,所謂的填充(padding)是什麼意思?

在 Base64 等編碼方式中,所謂的填充(Padding)指的是為了讓輸入符合特定長度要求,在編碼後面補上額外的字符,以 Base64 來說會使用 "=" 字元作為填充字元,以確保編碼後的字串長度為 4 的倍數長度。

眾所周知:Base64 是一種編碼方式,而不是加密演算法;所謂的 編碼(Encoding) 是一種 將原始數據轉換為特定格式的過程,使其可以安全地傳輸、存儲或處理,通常用於提高可讀性、壓縮數據或確保資料能被正確傳輸。

而在替資料選擇適合的編碼方式時,通常需要根據其用途,考慮不同編碼方式所使用的 字元集是否存在混淆字元(如 0、O、I、l 等),以及是否存在填充(padding)字元,那麼究竟 在編碼方式如 Base64、Base32 中,所謂的填充(padding)是什麼意思?

何謂填充(Padding)?

簡單來說,在 Base64 等編碼方式中,所謂的 填充(Padding)指的是為了讓輸入符合特定長度要求,在編碼後面補上額外的字符,以 Base64 來說會使用 = 字元作為填充字元,以確保編碼後的字串長度為 \( 4 \) 的倍數長度。

這也是為什麼許多人在看到一個字串時,可以很快地猜測字串是使用 Base32、Base64 進行編碼的。這兩種編碼方式都使用 = 作為填充字元,主要差異在於 Base64 比起 Base32 來說還可以使用 +/01 等字元,而 Base32 僅能使用 A-Z2-7

那麼為什麼在編碼時需要進行填充(Padding)或者存在填充字元呢?這是因為編碼通常會把二進制數據轉換成可讀的格式,並且這些演算法通常 要求輸入長度是固定的倍數(例如 3 個字元一組或 4 個字元一組),如果原始數據的長度不是這個倍數,則需要填充來讓它符合規則

舉例:使用 Base64 對 Hsins 字串進行編碼

在 Base64 編碼的核心邏輯中,是將 二進制資料轉換為可讀的字元,其規則是:

  1. 將每 3 個位元組(bytes)即 \(24 \, \text{bit} \) 拆解成 4 個 \(6 \, \text{bit} \) 的區塊。
  2. 再將每個區塊,對應到 Base64 的字元表。
Base64 Table from RFC 4648
Base64 Table from RFC 4648

舉例來說,當要使用 Base64 對 Hsins 進行編碼時,先將字元對應到其 ASCII Code 並轉換成二進制表示:

      CHAR         H        s        i        n        s
ASCII Code        72      115      105      110      115
            01001000 01110011 01101001 01101110 01110011

將二進制表示的結果,以每 \(6 \, \text{bit} \) 為一組,對應到 Base64 字元表:

010010 | 000111 | 001101 | 101001 | 011011 | 100111 | 0011
     S        H        N        p        b        n

因為最後一組不足 \(6 \, \text{bit} \),因此填充 = 來補足,以確保字串長度符合 4 的倍數,編碼後得到 SHNpbnM=

換句話說,對於 Base64 編碼而言,由於 = 僅作為填充字元以確保字串長度滿足 4 的倍數,因此如果將 SHNpbnMSHNpbnM= 抑或是 SHNpbnM== 解碼得到的結果都會是 Hsins

張貼留言