Base32エンコーダー&デコーダー
テキストを、認証アプリの秘密鍵で使われるA〜Zと2〜7のRFC 4648のBase32に変換します。HelloはJBSWY3DPになります。復号では小文字や改行も受け付け、余計な記号は受け付けません。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- テキスト
- Hello
- 計算モード
- Encode
- 結果
- JBSWY3DP
- 長さ
- 8
- 入力バイト数
- 5
- アルファベット
- RFC4648
Base32は、任意のUTF-8テキストをA〜Zの英字と2〜7の数字だけで構成されるコンパクトな文字列へ変換し、必要に応じて等号でパディングして各ブロックを8文字単位に揃えます。Base64とは異なり、このアルファベットにはプラスやスラッシュなど、URL、シェル引数、大文字小文字を区別しないファイルシステムで問題を起こす記号が含まれないため、シークレットシード、TOTPキー、多くのプロトコルトークンは今でもBase32で配布されています。この機能はRFC 4648第6節のアルファベットを完全に実装しています。エンコードモードでは入力文字列をUTF-8バイト列として読み取り、パディング付きのBase32文字列を出力します。デコードモードでは大文字小文字混在のBase32を受け付け、空白を除去し、すべての文字を検証して、元のUTF-8テキストを返します。
RFC 4648 Base32がビットをA–Zと2–7に詰め込む仕組み
RFC 4648第6節では、26個の大文字ラテン文字に続けて2〜7の6個の数字を並べた、32記号のアルファベットが定義されています。エンコードは生のバイト列から始まります。テキストの場合、この機能はまず文字列をUTF-8へ変換し、マルチバイト文字が言語やプラットフォームをまたいで移植可能になるようにします。
そのバイト列は連続したビットストリームとして読み取られ、5ビットごとにアルファベットのインデックスを1つ選んでBase32文字を1つ生成します。入力の5バイトは40ビットを供給し、8文字のBase32へきれいに分割されます。端数が短い場合は最後の5ビット組の右側をゼロで埋め、等号パディングで仕上げて、全体の長さが常に8の倍数になるようにします。
デコードはこの対応を逆にたどります。パディング以外の各文字は5ビットを供給し、8ビットたまるたびにバイトが出力され、末尾のパディングは正しい位置にあるか検査されます。メールから貼り付けた複数行のトークンでも動くよう、空白は無視されます。
小文字は検索前に大文字へ変換されます。黙って置き換えれば、認証アプリのシークレットやワイヤーフォーマットの転記ミスが見えなくなってしまうからです。
実務でBase32エンコーディングが使われる場面
RFC 6238の時間ベースワンタイムパスワードや認証アプリのシークレットは、ほとんどの場合Base32で受け渡されます。Base64よりも、ゼロとO、1とIを読み間違えるリスクを抑えてユーザーが手入力できるからです。
DNSや一部のネットワーク設定システムでは、大文字小文字の折り畳みを生き残らなければならない不透明なラベルに、Base32系のアルファベットが好まれます。モバイルのディープリンクや短いオフライントークンでも、正規化後に大文字小文字を区別せず、URLの予約文字を避けられるためBase32がよく選ばれます。
サポートデスクはチケットから複数行のシークレットを貼り付けるため、誤ったキーを生むゴミ文字は拒否しつつ空白への許容が必要です。エンコーディング方式を教える教材の著者は、Base32専用のページを求めています。検索意図もアルファベットの規則も異なるため、汎用のBase64ページの下に埋もれさせたくないからです。
URLセーフなアルファベットのBase64、URLのパーセントエンコーディング、多基数の整数変換が必要な場合は、それらは別の検索意図・別のランディングとして扱い、このBase32エンコーダーページに詰め込まないでください。
活用例
TOTPと認証アプリのシークレット交換
新規に生成した共有シークレットをRFC 4648 Base32でエンコードして認証アプリへ渡したり、アカウント復旧やインポート時に貼り付けられたBase32シードをデコードしたりできます。
設定やリンク向けの大文字小文字に安全なトークン
大文字小文字の折り畳みに耐え、+や/などの記号を避けたBase32ラベルを生成し、DNS的な名前やディープリンクへ不透明な識別子を埋め込めます。
よくある質問
このツールはどのBase32アルファベットを使いますか?
RFC 4648第6節です。大文字のA〜Zと数字の2〜7を使い、「=」パディングで8文字の倍数に揃えます。Base32hexでもCrockford Base32でもありません。
エンコードとデコードの両方はできますか?
はい。 modeにencode(デフォルト)を指定すればUTF-8テキストをBase32へ変換し、decodeを指定すればBase32文字列からテキストを復元できます。
デコード時に小文字のBase32は受け付けますか?
はい。 文字はアルファベット検索の前に大文字へ変換されます。空白も除去されるため、複数行の貼り付けもそのまま動作します。
料金はいくらですか?
ブラウザツールは無料でローカルに実行されます。無効な入力には課金されません。
Base32の結果の末尾に等号が付くのはなぜですか?
長さを常に8の倍数にするためのパディングです。5バイトはちょうど8文字になり、HelloはJBSWY3DPですが、1文字のfはMYのあとに等号が6つ続きます。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/enc/base32 \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello"}'const res = await fetch("https://api.kit.forhosting.com/enc/base32", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/base32",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/base32", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/base32", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "Hello"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.base32",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
デコード中に不正な文字が見つかると即座にinvalid_inputエラーで失敗するため、誤った貼り付けが黙ってデータを壊すことはありません。
RFC 4648 Base32がビットをA–Zと2–7に詰め込む仕組み
A〜Z、2〜7、およびパディング用の等号以外の文字が現れると、位置と問題の文字を特定したinvalid_inputエラーが発生します。この厳格な拒否は意図的なものです。処理全体は浮動小数点を使わない決定的な整数演算で、ネットワーク、乱数シード、時計への依存がないため、同じ入力からは常に同じJSONが得られます。このページが実装しているのは古典的なRFC 4648 Base32アルファベットであり、Base32hexでもCrockford Base32でもありません。それらは記号表が異なり、TOTPや多くのレガシーAPIとの相互運用を壊します。
送信するものと返ってくるもの
encodeモードではtextを通常のUTF-8コンテンツとして扱い、パディング付きのRFC 4648アルファベットの文字列をresultで返します。decodeモードではtextをBase32として扱い、大文字小文字と空白を正規化し、アルファベットを検証して、復元したUTF-8文字列をresultで返します。検証失敗はプリペイド残高を消費しません。代表的な確認として、HelloをJBSWY3DPへエンコードすること、1文字のfを6つの等号パディング付きのMYへエンコードすること、既知のパディング付きブロックをfoobarへデコードすることが挙げられます。必須の文字列フィールドtextと、encodeまたはdecodeを指定する任意のmodeフィールドを送信します。modeを省略した場合はencodeがデフォルトになるため、最小限のペイロードでも意味のある処理が行われます。どちらの方向でも、mode、元のtext、result、主たる出力文字列のlengthフィールド、alphabetとcharsetのラベル、paddingフラグ、そしてどのプロファイルに一致したかをクライアントが確認できる短いstandard参照文字列を返します。encodeではinput_bytesも、decodeではoutput_bytesも報告されます。textの欠落、文字列でないオブジェクト、未対応のmode値、文書化された最大長を超える文字列、不正なBase32文字、非パディング文字の後のパディング、多すぎるパディング記号、8の倍数でない長さは、すべてinvalid_inputと分かりやすい英語メッセージで失敗します。成功したAPI呼び出しの料金は、公開されている1件あたり$0.002の基本価格です。
実務でBase32エンコーディングが使われる場面
したがって、プロビジョニング用QRペイロードやバックアップコードには、キー生成時の信頼できるエンコード経路と、インポート時の厳格なデコード経路が必要です。この機能は純粋なparseエンジンであるため、API料金は成功1件あたり公開基本価格の$0.002で、検証失敗は残高を消費しません。
連携の活用例
言語横断のgoldenテストベクトル
Python、Go、OpenSSLのBase32と一致するエンコード・デコード用フィクスチャを生成し、多言語CIで単一の正解を共有できます。
技術的な質問
Base32文字列に無効な文字があるとどうなりますか?
デコードはinvalid_inputで失敗し、位置と不正な文字を特定します。検証失敗に対する課金は一切ありません。