テキストを Base32 にエンコードする方法
- 入力 · テキストにテキストを入力するか貼り付けます。リアルタイムにチェックが入っていれば、キーを押すたびに出力が更新されます。
- 結果を出力 · Base32(RFC 4648)で確認します。末尾の
=を取り除くには、出力の下のパディング(=)のチェックを外します。 - 別のバリアントにするには、変換先を開いて Base32hex、Crockford Base32、z-base-32 のいずれかを選びます。
- 逆にデコードするには、方向の切り替えで Base32(RFC 4648)→ テキストをクリックします。専用の Base32 デコーダーは最初からその方向で開きます。
- 出力をコピーかダウンロードで結果を持ち出せます。
テキストはデフォルトで UTF-8 としてバイト列に変換されます。同じテキストを Windows-1252 や UTF-16LE など別のエンコーディングにした Base32 が必要な場合は、入力の下の文字コードを変更してください。
Base32 の仕組み
Base32 は入力を 5 ビットずつ読み、5 ビットごとに 1 文字を書きます。5 バイト(40 ビット)がちょうど 8 文字になるので、出力は入力より 60% 大きくなります。同じデータの Base64 文字列なら 33% 増なので、これが大文字と 6 つの数字だけを使うことの代償です。
入力の長さが 5 バイトの倍数でない場合、最後のグループは = で 8 文字まで埋められます。以下は RFC 4648 のテストベクターを、このツールで生成したものです。
| 入力 | Base32 | パディングなし |
|---|---|---|
f | MY====== | MY |
fo | MZXQ==== | MZXQ |
foo | MZXW6=== | MZXW6 |
foob | MZXW6YQ= | MZXW6YQ |
fooba | MZXW6YTB | MZXW6YTB |
foobar | MZXW6YTBOI====== | MZXW6YTBOI |
パディングはデータを持ちません。デコーダーは実際の文字数からバイト数を割り出せるので、多くの形式がパディングを省略します。
Base32 のバリアント:RFC 4648、base32hex、Crockford、z-base-32
「Base32」は一つのファミリーの名前です。4 つのメンバーはどれも 1 文字に 5 ビットを詰めますが、アルファベットとパディングの有無が異なります。同じ 5 バイトの Hello をそれぞれで表すと次のようになります。
| バリアント | アルファベット | Hello | パディング | 見かける場所 |
|---|---|---|---|---|
| RFC 4648 Base32 | A–Z、2–7 | JBSWY3DP | = | TOTP/2 段階認証のシークレット、Tor v3 の onion アドレス、IPFS CIDv1(b…、小文字) |
| Base32hex | 0–9、A–V | 91IMOR3F | = | DNSSEC の NSEC3 レコード。エンコード後の文字列がバイト列と同じ順に並ぶ |
| Crockford Base32 | 0–9、I L O U を除く A–Z | 91JPRV3F | なし | 人が読み上げたり入力したりする ID |
| z-base-32 | ybndrfg8ejkmcpqxot1uwisza345h769 | jb1sa5dx | なし | 人間向けの鍵や識別子 |
Base32hex と Crockford は似ていますが、別のアルファベットです。H の後からずれていくので、91IMOR3F と 91JPRV3F は同じバイト列です。間違ったほうを選んでもエラーなしにデコードされ、黙って別のバイト列が返ってきます。
ここの Crockford デコーダーは、Crockford が意図したとおりに寛容です。I と L を 1、O を 0 として読み、ハイフンを読み飛ばすので、91JP-RV3F でも Hello になります。Crockford の任意のチェックシンボルは付けも検査もしません。
TOTP と 2 段階認証のシークレットとしての Base32
認証アプリは、通常 QR コードとして表示される otpauth:// リンクからシークレットを受け取ります。
otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example
secret パラメーターは、パディングなしの RFC 4648 Base32 です。JBSWY3DPEHPK3PXP は 16 文字なので、10 バイトを持っています。RFC 4226 は 160 ビット(20 バイト)のシークレットを推奨しており、これは Base32 で 32 文字になります。シークレットが Base64 や 16進数で保存されている場合は、Base64 を Base32 にで変換してください。Base64 のテキストをこのページに入力すると、その文字自体がエンコードされ、有効ではあるものの別のバイト列を表す Base32 になります。そこから生成したコードはすべて拒否されます。
TOTP のシークレットは鍵です。持っている人なら誰でもあなたのコードを生成できます。このページはブラウザのタブの中でシークレットを処理し、Content Security Policy によって、ページからのネットワーク通信を Cloudflare のページビュー計測以外すべてブロックしています。
コマンドラインと Python での Base32
GNU coreutils には、base64 と同じように使える base32 コマンドがあります。
printf 'Hello' | base32
printf 'JBSWY3DP' | base32 -d
1 行目は JBSWY3DP を、2 行目は Hello を出力します。Python の標準ライブラリには RFC 4648 の 3 つの形式がすべてあります。
import base64
base64.b32encode(b"Hello") # b'JBSWY3DP'
base64.b32hexencode(b"Hello") # b'91IMOR3F'
base64.b32encode(b"Hi").decode().rstrip("=") # 'JBUQ'
その他のエンコードのレシピは Python のページにあります。Python が出すパディングや小文字のエラーを含め、デコードについては Base32 デコーダーをご覧ください。
よくある質問
Base32 の出力が ====== で終わるのはなぜですか?
Base32 は 5 バイトのブロックを 8 文字に変換します。最後のブロックが短いと、RFC 4648 は 8 文字の残りを = で埋めるので、Hi は JBUQ==== になります。受け手が素の JBUQ を求める場合は、パディング(=)のチェックを外してください。
Base32 は大文字と小文字を区別しますか?
RFC 4648 のアルファベットは大文字ですが、ほとんどのデコーダーは小文字も受け付け、このデコーダーも同様です。例外は Python で、base64.b32decode は casefold=True を渡さない限り小文字を拒否します。
Base32 と Base64 のどちらを使うべきですか?
データを読むのがプログラムだけなら Base64 です。短いからです(増加率 33% に対して 60%)。人が値を読んだり、入力したり、口頭で伝えたりする場合や、DNS 名や一部のファイルシステムのように大文字小文字を区別しないシステムを通す必要がある場合は Base32 を使ってください。
Base32 ではどの文字が使われますか?
RFC 4648 の Base32 は A–Z と 2–7、それにパディング用の = を使います。数字の 0、1、8、9 は含まれないので、これらを含む文字列は base32hex か Crockford、あるいはそもそも Base32 ではありません。