Z85 エンコーダー・デコーダー

テキスト、16進数のバイト列、ファイルを Z85 に変換し、元に戻します。Z85 は ZeroMQ が定義した Base85 の一種で、そのアルファベットはソースコードの文字列リテラルにエスケープなしで収まります。

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. テキストやバイト列を Z85 に変換するには「エンコード」を、Z85 をデータに戻すには「デコード」を選択します。
  2. 鍵などのバイナリ値を扱う場合は、エンコード時は「入力形式」を、デコード時は「出力形式」を「16進数」にします。
  3. データを入力または貼り付けるか、ファイルを開きます。結果は入力に合わせてリアルタイムに更新されます。
  4. 結果をコピーするか、ファイルとしてダウンロードします。

Z85 とは

Z85 は ZeroMQ RFC 32(IETF の RFC ではなく、ZeroMQ コミュニティの仕様)で規定されています。他の Base85 エンコードと同様に 4 バイトごとに 5 文字に変換し、各グループをビッグエンディアンの 32 ビット数として読み取って、最上位の桁から順に 85 進数の 5 桁で書き出します。出力は入力より 25% 大きくなります。

Z85 の特徴はアルファベットにあります。0-9、a-z、A-Z と 23 個の記号 .-:+=^!/*?&<>()[]{}@%$# を使い、2 種類の引用符、バックスラッシュ、バッククォート、カンマ、セミコロン、縦棒、チルダ、アンダースコアは含みません。ソースコードの文字列で安全に使えるよう設計されているため、Z85 の値は C、Python、JSON の引用符の間にエスケープなしで貼り付けられます。

Z85 の用途

ZeroMQ は、CurveZMQ の鍵を表示するのに Z85 を使います。32 バイトの公開鍵または秘密鍵は 40 文字の Z85 文字列になります。これは zmq_curve_keypair() が返す形式であり、CURVE セキュリティのソケットオプションが受け付ける形式でもあります。ライブラリは 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 と同じ規則を使います。つまり、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.islsB}Dhz^42A@
你好<H}kFRm=

よくある質問

Z85 と Ascii85 の違いは何ですか?
計算方法は同じですが、アルファベットが異なります。Ascii85 は ! から u までの ASCII の範囲を使うため引用符やバックスラッシュを含み、ゼロバイトを表す z の省略表記があります。Z85 は文字列内でエスケープが必要な文字を避けており、省略表記はありません。
Z85 にパディングはありますか?

いいえ。仕様では、入力の長さは 4 バイトの倍数しか認められていません。このツールはそれ以外の長さも最後のグループを短くしてエンコードしますが、これは規格には含まれません。

Z85 を JSON、XML、URL で使えますか?
JSON の文字列ならエスケープなしで使えます。XML や HTML では <、>、& をエスケープする必要があります。URL では ?、&、/、# が特別な意味を持つため、Z85 は適していません。代わりに Base64URL または Base58 を使ってください。
Z85 でエンコードした CurveZMQ の鍵は何文字ですか?

CurveZMQ の鍵は 32 バイトなので、ちょうど 40 文字になります。元の鍵を確認するには、「出力形式」を「16進数」にしてここでデコードしてください。