Base64 vs Base58 vs Base32

更新日:

Base64 はバイナリをテキスト化する普遍的なエンコーディングですが、Base64 が無視している問題を解く代替案があります。Base58(Bitcoin で使用)は紛らわしい文字を除外し、Base32(TOTP シークレットや DNS で使用)は大文字小文字を区別せず手入力に強いです。用途を取り違えると、バイト数を無駄にしたり微妙なバグの原因になります。本ガイドでは、アルファベット設計・サイズオーバーヘッド・各方式が活きる場面を比較します。

Base64 — 普遍的なデフォルト

Base64 はアルファベット 64 文字(A〜Z、a〜z、0〜9、+、/)にパディング用「=」を加えます。入力 1 バイトが約 4/3 文字に膨らみ、約 33% のオーバーヘッドです。データ URL、JWT、メール添付、PEM 形式の鍵など、バイナリをテキスト化するほとんどの用途で標準です。URL セーフ版(RFC 4648)は「+」「/」を「-」「_」に置き換え、URL 内で安全に使えます。

Base58 — Bitcoin の選択

Base58 はアルファベット 58 文字(英数字から見間違いやすい 0、O、I、l を除外)を使います。出力は Base64 より少し長く(オーバーヘッド約 37%)なりますが、紛らわしい文字や特殊記号が一切含まれません。人間が目視や口頭で扱う鍵・アドレスに最適です。Bitcoin、IPFS、多くの暗号通貨システムが Base58 を採用しています。

Base32 — 大文字小文字を区別せず手入力可能

Base32 はアルファベット 32 文字(RFC 4648: A〜Z、2〜7)を使います。Base64 よりも密度が低く(オーバーヘッド約 60%)出力は長くなりますが、大文字小文字を区別せず、特殊記号がなく、手入力や口頭での伝達が容易です。TOTP シークレット、DNS レコード(大文字小文字を区別できない TXT)、Tor の Onion アドレスなどに使われています。Crockford 版(ULID で使用)は I/L/O/U を除外して視認性をさらに高めています。

サイズオーバーヘッドの比較

  • Base64: 約 33% のオーバーヘッド(3 バイト → 4 文字)。
  • Base58: 約 37% のオーバーヘッド、58 が 2 のべき乗でないため可変。
  • Base32: 約 60% のオーバーヘッド(5 バイト → 8 文字)。
  • 入力 32 バイトの場合: Base64 約 44 文字、Base58 約 44 文字、Base32 約 56 文字。

用途マトリクス

  • JSON・HTTP ヘッダ・メールへのインライン埋め込み: Base64。
  • URL パラメータ: Base64 URL セーフ(または Base58)。
  • 人間が扱う識別子(Bitcoin ウォレット、公開鍵): Base58。
  • 口頭・手入力で伝えるコード: Base32 Crockford。
  • TOTP / MFA の共有シークレット: Base32(RFC 4648)。
  • DNS TXT レコードに格納するバイナリ: Base32。

エンコード速度とライブラリ対応

Base64 は全標準ライブラリに組み込まれており、SIMD で最適化されているため一桁速いです。Base32 もほとんどの言語で標準対応。Base58 は標準ライブラリにあることは稀で、サードパーティパッケージに頼るのが普通です。任意精度算術が必要なため Base58 は最も遅くなります。

パディング

Base64 は 4 の倍数に「=」でパディングします。Base32 は 8 の倍数に「=」でパディングします。Base58 は出力長が可変のためパディング自体ありません。URL セーフ Base64 や近年のフォーマットではパディング省略が一般化しています。デコーダ側で両形式を受け入れられるか確認してください。

よくある質問

Base58 で任意のバイナリをエンコードできますか?
可能ですが、バイト指向で Base64 より遅いです。Base58 は「紛らわしい文字を排除する」こと自体に意味がある場面(暗号アドレス、短い共有コード)に限定するのが良いです。
TOTP が Base64 ではなく Base32 を使う理由は?
ユーザーが TOTP シークレットを手入力したりスキャンしたりすることがあるためです。Base32 は大文字小文字無区別で、A〜Z+2〜7 のみと入力ミスが起きにくいです。一度きりのシークレット設定では密度より入力しやすさが優先されます。
Base58Check と Base58 の違いは?
Base58Check は SHA-256 の先頭 4 バイトをチェックサムとして付加してからエンコードします。Bitcoin アドレスで 1 文字でも誤ると検知できます。素の Base58 にはチェックサムがありません。

まとめ

デフォルトは Base64。人間が目視・手書きで扱う識別子は Base58。大文字小文字を区別せず手入力させたい場合は Base32。本サイトの Base64 エンコーダー / デコーダーはブラウザ内で Base64 を処理します。Base58 / Base32 は各言語のライブラリで、必要なバリアントに対応しているものを選んでください。

関連ツール