Base58 是一種二進位轉文字的編碼方式,使用從 Bitcoin 字母表中取出的 58 個字元,並省略視覺上容易混淆的數字 0、O、I 和 l。Base58 轉換器將輸入視為一個大端序的 base-256 數字,反覆除以 58,並將每個餘數對應寫成一個字母符號,同時保留每個前導零位元組作為前導的「1」符號。解碼則執行相反的過程:每個前導「1」會變成一個零位元組,其餘的數字則從 base 58 轉回 base 256。這個轉換是本地且可逆的,所以只要擁有字母表,任何人都能還原出完全相同的位元組 — Base58 是二進位資料的精簡表示法,並非加密,因此它不提供機密性、完整性檢查或簽章。當你想將可列印的 UTF-8 文字轉換成 Bitcoin 風格的英數字串,或當你手上有一個原始的 Base58 值並需要查看其底下的確切十六進位位元組(包括一般整數轉換會悄悄捨去的任何前導零)時,請使用 Base58 編碼 / 解碼工具。

base58 converter
base58 converter

Bitcoin Base58 字母表及其內容

Bitcoin 的 Base58 字母表正好有 58 個符號,每個符號對應一個從 0 到 57 的數字值。順序是固定的,所有合規的實作都必須對此達成共識:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

有四個字元被刻意省略。數字零 (0)、大寫字母 I、大寫字母 O,以及小寫字母 l 在視覺上與字母表中現有的符號過於相似,因此被排除,以減少複製貼上和人工謄打時的錯誤。一個 Base58 轉換器如果遇到這四個字元中的任何一個,以及空白字元或標點符號,必須拒絕該輸入,而不是猜測使用者的原意。

剩下的字母表包含數字 1 到 9(請注意 0 不存在,而 1 存在)、A 到 Z 的大寫字母(已移除 I 和 O),以及 a 到 z 的小寫字母(已移除 l)。字母大小寫是有意義的,所以在輸出中「Ab」和「aB」代表不同的數值。這種大小寫敏感性也是為什麼 Base58 每個符號大約帶有 5.86 位元的資訊量:log2(58) ≈ 5.86,這代表對於相同的承載內容,Base58 字串會比 Base64 略長一些,但仍可安全地用手輸入。

如何將 UTF-8 文字編碼為 Base58

  1. 在瀏覽器中開啟 Base58 編碼 / 解碼工具。由於轉換是在本地執行,所以操作過程中不會有任何資料離開你的裝置。
  2. 確認模式設定為「UTF-8 文字轉 Base58」。如果你看到編碼與解碼之間的切換開關,請選擇編碼。
  3. 在輸入欄位中輸入或貼上你想編碼的文字。該工具會將文字視為 UTF-8 位元組序列,所以只要最終的位元組數量未超過大小限制,重音符號、表情符號和非拉丁文字都能接受。
  4. 觸發轉換。網頁通常會在你輸入時即時更新,同時顯示 Base58 結果和以小寫十六進位表示的原始位元組。
  5. 先閱讀十六進位欄位,確認位元組序列符合你的預期 — 例如已知的首碼或任何必須在來回轉換中保留下來的前導零位元組。
  6. 逐字元地完全複製 Base58 字串。不要加入空格、換行、引號或尾端換行,也不要去除前導或尾端的「1」符號,因為每個「1」都代表一個真實的零位元組。
  7. 將結果視為大小寫敏感:以產生時完全相同的方式將其貼回任何檢查工具中,並且絕對不要將它通過小寫化或去除空格的函式。

若想更仔細地了解 base-256 到 base-58 轉換迴圈的結構,包括 Java 和 JavaScript 的等價實作,請參閱 Base58 解碼:Java 程式碼與瀏覽器替代方案的逐步說明。

如何將原始 Base58 字串解碼回位元組

  1. 將 Base58 編碼 / 解碼工具切換到「Base58 轉位元組與文字」模式。
  2. 將完整、精確、大小寫敏感的 Base58 值貼到輸入欄位中。如果你的複製內容含有任何被排除的字元(0、O、I、l)、空格、標點符號或 Unicode 符號,該工具會拒絕該輸入,而不是默默幫你清理。
  3. 執行解碼器。該工具一律將還原的位元組以小寫十六進位顯示 — 這是無損的表示方式,也是唯一具權威性的結果。
  4. 檢查十六進位下方是否印有 UTF-8 文字詮釋。只有當位元組恰好構成有效的 UTF-8 時才會顯示;否則網頁會保留十六進位結果並標示無法提供文字詮釋。
  5. 檢查原始字串中前導的「1」符號。每個「1」都對應還原後十六進位中的一個前導零位元組,所以一個以兩個「1」字元開頭的字串應該產生以 00 00 開頭的十六進位結果。
  6. 如果來源將該值稱為「Base58Check」,請記住此工具僅驗證原始位元組的轉換,並不會在這裡驗證版本位元組和雙重 SHA-256 檢查碼。

若要獲得解碼方面的專門逐步說明,包括當來源是 Bitcoin 地址或序號時該如何解讀十六進位輸出,請參閱一鍵將 Base58 字串解碼回可讀資料的指南。

原始 Base58 與 Base58Check 及 Base64 的比較

這三種編碼乍看之下相似,但行為差異極大。下表強調了影響各自解析方式,以及應用程式在解析後可依賴哪些特性的屬性。

屬性原始 Base58Base58CheckBase64
字母表大小58 個符號58 個符號64 個符號
允許的字元1-9、A-Z(不含 I、O)、a-z(不含 l)1-9、A-Z(不含 I、O)、a-z(不含 l)A-Z、a-z、0-9、+、/
填補字元= 於末尾
內嵌版本位元組是(1 個前導位元組)
包含檢查碼是(4 位元組雙重 SHA-256)
偵錯能力是,透過檢查碼
大小寫敏感
典型用途精簡識別碼、原始位元組傳輸Bitcoin 地址、WIF 金鑰通用的二進位轉文字

Base58Check 值是一個原始 Base58 字串,在編碼前附加了一個前導版本位元組和一個四位元組檢查碼,所以其可見形式大約比等效的原始字串長五個字元。Base64 字串通常約為原始位元組大小的 4/3,並使用 +、/ 以及 = 填補;它們比 Base58 來得長,但能無歧義地編碼任何位元組序列。知道手上實際持有的是哪一種,是選擇正確解碼器的第一步:只有 Base58Check 能告訴你某個字串是否本來就是設計為 Bitcoin 地址,或僅僅是一段任意的位元組承載內容。

Base58 轉換常見的錯誤之處

最常見的錯誤是把 Base58 字母表當作 Base64 來處理。人們貼上含有 +、/、= 或被省略的 0、O、I、l 的值,然後納悶為什麼解碼器會拒絕。第二個錯誤是把 Base58 字串當作文字進行預先處理:去除空白、將字母轉為小寫、正規化標點,或套用 URL 解碼,這些都會改變數值並破壞來回轉換。一個乾淨的原始值是無法再進一步清理的。

第三個錯誤是把 Base58 字串中的前導「1」字元視為裝飾性的填補。每個前導「1」代表一個原始的零位元組,捨棄它們會在還原時讓那些位元組消失。第四個錯誤是把成功的原始解碼當作 Bitcoin 地址或私密金鑰有效的證明。原始解碼只能證明位元組格式正確且可還原;它不會檢查版本位元組、所屬網路或檢查碼,因此無法確認該值是否真的屬於你。

第五個錯誤是把活的秘密資訊貼到線上轉換器,即使是會在本地處理的工具也不行。Base58 對任何擁有字母表的人來說都是可逆的,而網址列、日誌記錄、螢幕截圖或瀏覽器擴充功能都可能洩漏輸入。當必須除錯一個敏感值時,請優先使用離線工具或經過審查的函式庫,並假設在你按下 Enter 的那一刻,輸入內容就已經外洩了。

限制、效能與隱私

此實作將解碼輸入上限設定為 4,096 位元組,因為任意進位轉換的運算量隨輸入長度以二次方成長,否則可能會凍結瀏覽器分頁。對於可列印的文字、識別碼、雜湊摘要和短小的二進位區塊來說,這個上限已經相當充裕,但無法處理大型檔案;當承載內容較大時,請改用為檔案設計的串流格式,例如 Base64 搭配相應的工具。

空白的程式化向量仍然有定義,所以空字串會解碼為零位元組而不會拋出例外,即使使用者介面要求輸入不可為空。輸出絕不會被悄悄截斷:當結果符合限制時,你會得到完整的字串;當結果超出限制時,你會得到清楚的拒絕訊息,而不是一個損壞的不完整答案。

所有轉換都在瀏覽器本地執行,所以此工具不會上傳你的輸入、輸出或任何中間狀態。正是這項特性讓它用於文字值時是安全的,但它並不會讓產生的 Base58 字串變得可以放心分享 — 該字串仍然是相同位元組的更精簡形式,任何看到輸出的系統都能精確地讀回原始資料。與正典字母表及前導零規則的相容性,是依據官方的 Bitcoin Core base58_encode_decode 測試向量所錨定,因此經過良好審查的 Bitcoin 實作所產生的值應該都能透過本工具乾淨地完成來回轉換。