Base58 エンコーダー・デコーダー

テキスト、16進数のバイト列、小さなファイルを Base58 に変換し、元に戻します。Bitcoin、Flickr、Ripple のアルファベットから選べ、必要に応じて Base58Check チェックサムの付加や検証も行えます。

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

使い方

  1. テキストやバイト列を Base58 に変換するには「エンコード」を、Base58 文字列をデータに戻すには「デコード」を選択します。
  2. 「アルファベット」を選択します。デフォルトは Bitcoin で、IPFS や Solana でも同じものが使われています。
  3. データを入力または貼り付けます。ハッシュ値や公開鍵などの生のバイト列を扱う場合は、「入力形式」を「16進数」に切り替えます。
  4. 文字列に 4 バイトのチェックサムが含まれる場合にのみ「Base58Check チェックサム」をオンにし、結果をコピーまたはダウンロードします。

Base58 とは

Base58 は、Bitcoin のために考案されたバイナリ・テキスト変換方式です。アルファベットは、数字とラテン文字の 62 文字から、見間違えやすい 4 文字、0(ゼロ)、O(大文字のオー)、I(大文字のアイ)、l(小文字のエル)を除いたものです。+、/、= も含まないため、Base58 文字列はダブルクリックで全体を選択でき、エスケープせずに URL に入れられます。

Base64 とは異なり、Base58 は入力をビット単位のグループに区切りません。入力全体を 1 つの大きな数として扱い、58 進数で表記します。そのためパディングはなく、1 バイト変わるだけで出力の多くの文字が変わることがあります。先頭のゼロバイトは数値としては意味を持たないため、それを保持するために、1 バイトにつきアルファベットの最初の文字(Bitcoin アルファベットでは 1)で表します。出力サイズは入力の約 1.37 倍になります。

Base58 の用途

  • Bitcoin。レガシーアドレスと WIF 形式の秘密鍵は Base58Check、つまりバージョンバイトとチェックサムを加えた Base58 です。
  • IPFS。バージョン 0 のコンテンツ識別子(CIDv0)は、SHA-256 マルチハッシュを Base58 で表したものです。そのため、これらの CID は 46 文字で、Qm で始まります。
  • Solana。公開鍵、アカウントアドレス、トランザクション署名は、チェックサムのない通常の Base58 で表記されます。32 バイトの鍵は、通常 43 文字または 44 文字になります。
  • Flickr と XRP Ledger。Flickr の短縮リンクは Flickr アルファベットを、XRP のアドレスは Ripple アルファベットを使います。XRP のアドレスが r で始まるのはこのためです。

Base58 と生のバイト列を相互に変換するには、Base58 → 16進数と16進数 → Base58 を使います。英数字だけで構成される ID が必要な場合は、Base62 と比べてみてください。

Base58 のアルファベット

アルファベット文字(順番どおり)
Bitcoin123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Flickr123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
Ripplerpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

3 つとも同じ 58 文字を異なる順序で並べたものです。そのため、あるアルファベットでエンコードした文字列を別のアルファベットでデコードすると、異なるバイト列になるか、エラーになります。

コードで Base58 を扱う

# Python(pip install base58)
import base58
base58.b58encode(b'hello')      # b'Cn8eVZg'
base58.b58decode('Cn8eVZg')     # b'hello'

// JavaScript(npm install bs58)
import bs58 from 'bs58';
bs58.encode(new TextEncoder().encode('hello'));

仕様

使用文字1-9 A-Z a-z(0 O I l を除く)
出力サイズ約 137%(多倍長整数による変換)
パディングなし(先頭のゼロバイトは「1」になる)
規格Bitcoin Base58
大文字と小文字の区別あり

エンコード例

入力 (UTF-8)出力
Hello, World!72k1xXWG59fYdzSNoA
Base64.isr1Nm3AS7ZcnN
你好2xuZUfBKa

よくある質問

先頭のゼロバイトが 1 になるのはなぜですか?
Base58 は入力を 1 つの数値に変換しますが、先頭のゼロバイトはその値を変えません。そこで、先頭のゼロバイトを保持するために、1 バイトにつきアルファベットの最初の文字(Bitcoin アルファベットでは 1)を書き出します。32 個のゼロバイトをエンコードすると 1 が 32 個並ぶのはこのためです。
Base58 は大文字と小文字を区別しますか?

はい。大文字と小文字は別の数字として扱われるため、1 文字でも大文字と小文字を変えると、デコード結果のバイト列が変わるか、文字列が無効になります。

Base58 と Base58Check の違いは何ですか?
Base58Check は、エンコードの前に 4 バイトのチェックサム(SHA-256 を 2 回適用したハッシュの先頭部分)を付加するため、入力ミスを検出できます。このページで「Base58Check チェックサム」をオンにするか、詳しくは Base58Check のページをご覧ください。
入力が約 20 KB に制限されているのはなぜですか?
入力全体が 1 つの大きな数になるため、処理量は長さの 2 乗に比例して増えます。Base58 は鍵、ハッシュ値、アドレス向けの形式で、ファイル向けではありません。大きなデータには Base64 または Base85 を使ってください。