使用方法
- 選擇「編碼」把文字或位元組轉換為 Z85,或選擇「解碼」把 Z85 還原為資料。
- 處理金鑰等二進位資料時,編碼請把輸入設為「十六進位」,解碼請把輸出設為「十六進位」。
- 輸入、貼上或開啟檔案,結果會隨輸入即時更新。
- 複製結果,或將結果下載為檔案。
什麼是 Z85?
Z85 由 ZeroMQ RFC 32 定義(這是 ZeroMQ 社群的規範,不是 IETF 的 RFC)。與其他 Base85 編碼一樣,它把每 4 個位元組轉換為 5 個字元:將每組位元組按大端序讀成一個 32 位整數,再從高位到低位寫成 5 位 85 進位數。編碼後體積增加 25%。
Z85 的特別之處在於字母表:0-9、a-z、A-Z 加上 23 個符號 .-:+=^!/*?&<>()[]{}@%$#。它沒有使用單引號、雙引號、反斜槓、反引號、逗號、分號、豎線、波浪號和下劃線,這套字母表專為在原始碼字串中安全使用而設計,因此 Z85 編碼結果可以直接放在 C、Python 或 JSON 的引號中,而不需要任何轉義。
Z85 的使用場景
ZeroMQ 用 Z85 來表示 CurveZMQ 金鑰。32 位元組的公鑰或私鑰會編碼成 40 個字元的 Z85 字串,zmq_curve_keypair() 返回的就是這種形式,CURVE 安全機制的套接字選項也接受它。libzmq 還提供 zmq_z85_encode() 和 zmq_z85_decode(),pyzmq 等語言繫結中也有相同的函式。
// C(libzmq)
char text[41]; // 32 位元組 -> 40 個字元 + NUL
zmq_z85_encode(text, key, 32);
# Python(pyzmq)
from zmq.utils import z85
z85.encode(bytes.fromhex('864fd26fb559f75b')) # b'HelloWorld'
最後一行是規範中給出的測試向量。
關於輸入長度的說明
RFC 32 要求二進位輸入的長度必須是 4 位元組的整數倍,編碼後的字串長度必須是 5 的整數倍。規範沒有定義填充,zmq_z85_encode() 等嚴格實現會拒絕其他長度。
本工具也接受其他長度,採用與 Ascii85 和 Base85 相同的規則:最後不足 4 位元組的 n 個位元組編碼為 n + 1 個字元。這是非標準的擴充套件,這樣得到的結果可能會被其他 Z85 解碼器拒絕。如果需要相容,請先把資料補齊到 4 位元組的整數倍。CurveZMQ 金鑰為 32 位元組,本身就符合要求。
編碼規格
| 字母表 | 0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$# |
|---|---|
| 輸出體積 | 每 4 位元組輸出 5 個字元(125%) |
| 填充 | 無 |
| 標準 | ZeroMQ RFC 32 |
| 區分大小寫 | 是 |
編碼範例
| 輸入 (UTF-8) | 輸出 |
|---|---|
Hello, World! | nm=QNz.92jz/PV8aP |
Base64.is | lsB}Dhz^42A@ |
你好 | <H}kFRm= |
常見問題
Z85 和 Ascii85 有什麼區別?
! 到 u 的 ASCII 字元,其中包含引號和反斜槓,並有表示零位元組的 z 縮寫;Z85 避開了在字串中需要轉義的字元,也沒有縮寫。Z85 有填充嗎?
沒有。規範只允許長度為 4 位元組整數倍的輸入。本工具對其他長度會用較短的最後一組進行編碼,這不屬於標準內容。
Z85 可以用在 JSON、XML 或 URL 中嗎?
Z85 編碼的 CurveZMQ 金鑰有多長?
CurveZMQ 金鑰為 32 位元組,編碼後正好是 40 個字元。如需檢視原始金鑰,可以在這裡解碼並選擇十六進位輸出。