自定義字母表編碼解碼

輸入你自己的字母表,或從預設開始修改,然後用它來編碼或解碼。「大數轉換」方式適用於任意長度的字母表,「位分組」方式輸出 RFC 4648 風格的結果。

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

使用方法

  1. 輸入字母表,或選擇一個預設後再修改。每個字元只能出現一次。
  2. 選擇方式:「大數轉換」適用於任意長度的字母表,「位分組」適用於 2、4、8、16、32 或 64 個字元的字母表。
  3. 使用按位分組時,可以另外指定一個不在字母表中的填充字元。
  4. 輸入文字進行編碼,或貼上用該字母表寫成的字串進行解碼。

把位元組對映為字元的兩種方式

大數方式與 Base58 相同:把整個輸入看作一個大整數,反覆除以字母表長度,每次的餘數決定一個字元。只要字母表至少有 2 個字元就能使用,10、36、58、62 等任意長度都可以。開頭的零位元組會寫成字母表的第一個字元,因此往返轉換不會丟失。這種方式沒有填充;由於長資料的運算會很慢,輸入最多約 20 KB。

按位分組方式與 RFC 4648 相同:把輸入切成固定位數的小塊,2 個字元的字母表每塊 1 位,16 個字元每塊 4 位,32 個字元每塊 5 位,64 個字元每塊 6 位。每一塊的值就是字母表中的下標。十六進位、Base32 和 Base64 正是這樣工作的,輸出長度只取決於輸入長度。

為什麼兩種方式的結果不同

一種方式編碼的是資料的數值,另一種方式按位置逐段編碼資料的位元。兩者的結果通常不同,解碼時必須使用編碼時的方式。

字母表輸入按位分組大數
標準 Base64HiSGk=Ehp
RFC 4648 Base32HiJBUQ====SDJ
01A010000011000001
0123456789Hi不支援18537

使用按位分組並以 = 作為填充字元時,標準字母表得到的就是常規的 Base64 和 Base32。大數方式寫出的是數值而不是固定位數,所以 A 開頭的那個 0 位被省略了。以十個數字作為字母表時,結果就是 Hi 這兩個位元組對應的十進位數。

填充字元只對按位分組有效:64 個字元的字母表會把輸出補足到 4 的倍數,32 個和 8 個字元的字母表補足到 8 的倍數。2、4、16 個字元的字母表中,每個位元組都正好佔滿整數個字元,因此永遠不需要填充。

合法字母表的規則

  • 至少 2 個字元。
  • 不能有重複字元。解碼時每個字元必須對應唯一的值。如果 a 同時代表 0 和 10,含有它的字串就無法解碼。
  • 區分大小寫。a 和 A 是兩個不同的字元。
  • 填充字元不能出現在字母表中,否則無法與資料區分。

編碼和解碼都在瀏覽器中進行,字母表和資料都不會離開你的裝置。

自定義字母表的用途

  • 混淆 ID。用打亂順序的字母表,可以把識別符號變成看不出規律的字串。但這只是隱藏,並不安全:知道字母表的人都能解碼。
  • 專有或遺留格式。照著系統文件複製它自己的字母表,就能直接解碼其中的資料。
  • 學習原理。對比不同長度的字母表和兩種方式,直觀理解進位轉換的原理。固定字母表的編碼可以參考 Base58 和 Base62。

常見問題

「大數轉換」和「位分組」有什麼區別?

大數方式像 Base58 一樣,把整個輸入當作一個整數轉換到新進位,適用於任意長度的字母表。按位分組方式像 Base64 一樣,把輸入切成固定位數的小塊,字母表必須是 2、4、8、16、32 或 64 個字元。

為什麼我的自定義 Base64 字母表得不到標準 Base64 的結果?

標準 Base64 使用的是按位分組。選擇「位分組」並把填充字元設為 =,結果就會一致。同一個字母表用大數方式會得到完全不同的字串。

為什麼不允許重複字元?

每個字元解碼時必須對應唯一的值。重複的字元會有兩種含義,原始資料就無法可靠地還原。

大數方式可以使用填充字元嗎?

不可以。大數方式的輸出沒有固定的分組長度,也就無需填充。填充選項只對按位分組有效。

自定義字母表算是加密嗎?

不算。它仍然是一種沒有金鑰的編碼。打亂的字母表能讓資料不那麼容易被一眼認出,但絕不應該用來保護機密資訊。