Base32 編碼解碼

將文字、十六進位位元組或檔案轉換為 Base32,也可以反向解碼。支援 RFC 4648 標準字母表、Base32hex、Crockford 和 z-base-32,並可控制填充和大小寫。

完全在瀏覽器中執行,不會上傳任何資料。

使用方法

  1. 選擇「編碼」把文字轉換為 Base32,或選擇「解碼」把 Base32 還原為文字。
  2. 選擇變體。預設的 RFC 4648 是 TOTP 金鑰和大多數程式庫使用的標準。
  3. 輸入或貼上內容,也可以開啟檔案,結果會隨輸入即時更新。
  4. 複製結果,或將結果下載為檔案。

什麼是 Base32?

Base32 使用 32 個可列印字元來表示二進位資料。每個字元承載 5 位,因此每 5 個位元組會變成 8 個字元。編碼後體積約增加 60%,比 Base64 更大,但字母表只有一種大小寫,並且去掉了容易混淆的字元。

RFC 4648 定義的標準字母表由 A-Z 和數字 2-7 組成,沒有使用 0、1、8、9,以免與字母 O、I、B 混淆。當輸入長度不是 5 位元組的整數倍時,輸出會用 = 填充到 8 個字元的整數倍。

Base32 的常見用途

  • 兩步驗證。身份驗證器應用中的 TOTP、HOTP 金鑰(otpauth:// 連結裡的 secret= 參數)就是 Base32 字串。
  • 不區分大小寫的系統。由於只有一種大小寫,Base32 可以安全地用於忽略大小寫的檔案系統、DNS 標籤和郵箱地址。
  • 需要人工輸入的編碼。許可證金鑰、洋蔥地址和短識別符號常用 Base32,便於朗讀和手動輸入。

如果更在意體積,Base64 更緊湊;如果需要不易混淆的短 ID,可以比較 Crockford Base32 和 Base58。

Base32 的幾種變體

變體字母表典型用途
RFC 4648A-Z 2-7TOTP 金鑰、通用場景
Base32hex0-9 A-V排序與原始位元組一致,DNSSEC NSEC3
Crockford0-9 A-Z,去掉 I、L、O、U易讀 ID、ULID
z-base-32小寫、重新排列面向人工閱讀的金鑰、OpenPGP WKD、ZRTP

在程式碼中使用 Base32

# Python
import base64
base64.b32encode(b'hello')        # 編碼
base64.b32decode('NBSWY3DP')      # 解碼

// Node.js 沒有內建 Base32,可使用 "hi-base32" 等第三方包
// Go (import "encoding/base32")
base32.StdEncoding.EncodeToString(data)

編碼規格

字母表A-Z 2-7
輸出體積每 5 位元組輸出 8 個字元(160%)
填充用 = 補足到 8 的倍數
標準RFC 4648 第 6 節
區分大小寫否

編碼範例

輸入 (UTF-8)輸出
Hello, World!JBSWY3DPFQQFO33SNRSCC===
Base64.isIJQXGZJWGQXGS4Y=
你好4S62BZNFXU======

常見問題

Base32 區分大小寫嗎?

RFC 4648 字母表以大寫定義,但本工具解碼時同樣接受小寫輸入。如果需要小寫輸出,可以勾選「小寫」選項。

為什麼 Base32 結果末尾有等號?

等號是填充字元,用於把最後一組補足 8 個字元。包括大多數 TOTP 應用在內的很多系統都接受不帶填充的 Base32,關閉「填充」即可去掉等號。

Base32 編碼後體積會增加多少?

每 5 個位元組變成 8 個字元,因此 Base32 輸出約為原資料的 1.6 倍,而 Base64 約為 1.33 倍。

可以用這個工具解碼 TOTP 金鑰嗎?

可以。把金鑰貼上到「解碼」中,並將輸出設為「十六進位」,即可看到原始金鑰位元組。金鑰中的空格會被自動忽略。