Base45 エンコーダー・デコーダー

テキスト、16進数のバイト列、ファイルを Base45 に変換し、元に戻します。Base45 は QR コードの英数字モードで使える 45 文字を使うため、バイナリデータを少ないオーバーヘッドで QR コードに収められます。

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

使い方

  1. テキストを Base45 にするには「エンコード」を、Base45 をテキストやバイト列に戻すには「デコード」を選択します。
  2. テキストを入力または貼り付けるか、ファイルを開きます。スペースはアルファベットの一部なので、削除しないでください。
  3. 証明書のペイロードのようなバイナリデータをデコードする場合は、「出力形式」を「16進数」に切り替えます。
  4. 結果をコピーするか、ファイルとしてダウンロードします。

Base45 とは

Base45 は RFC 9285 で定義されています。アルファベットは、数字 0-9、大文字 A-Z、そしてスペースと $ % * + - . / : の 9 つの記号です。これは、QR コードがコンパクトな英数字モードで格納できる 45 文字とまったく同じです。スペースは区切り文字ではなく、アルファベットの正式な 1 文字である点に注意してください。

エンコーダーは入力を 2 バイトずつ読み取り、0~65535 の数値として扱い、その数値を下位の桁から順に 3 桁の Base45 で書き出します。最後に 1 バイトだけ残った場合は 2 文字になります。テキストとしては、結果は入力の 1.5 倍のサイズになり、Base64 より大きくなります。

Base45 が QR コードに適している理由

英数字モードの QR コードは、2 文字を 11 ビットに詰め込みます。Base64 は小文字を必要とするためこのモードを使えず、1 文字 8 ビットのバイトモードになり、データ 1 バイトあたり約 10.7 ビットを使います。Base45 なら英数字モードで 1 バイトあたり 8.25 ビットで済むため、同じデータをより小さく読み取りやすい QR コードに収められます。

デコード時は、スペースをそのまま残してください。無視されるのは改行だけです。小文字はアルファベットに含まれないため、無効な文字として表示されます。

EU デジタル COVID 証明書のデコード

EU デジタル COVID 証明書の QR コードには、HC1: で始まるテキストが含まれています。残りの部分は Base45 で、証明書のデータは CBOR でエンコードされ、COSE で署名され、zlib で圧縮されたうえで Base45 でエンコードされています。中身を確認するには、次の手順に従います。

  1. HC1: のプレフィックスを取り除きます。この 4 文字は有効な Base45 の文字なので、残したままだと誤ったバイト列になります。
  2. 残りの部分を、出力を16進数にしてここでデコードします。zlib のデータは通常、バイト 78 で始まります。
  3. 別のツールで、バイト列を zlib で展開し、CBOR を解析します。

このツールが扱うのは Base45 の手順だけです。データの展開、解析、署名の検証は行いません。

コードで Base45 を扱う

# Python (pip install base45)
import base45
base45.b45encode(b'AB')     # RFC 9285 の例:BB8
base45.b45decode('BB8')     # b'AB'

仕様

使用文字0-9 A-Z スペース $ % * + - . / :
出力サイズ2 バイトごとに 3 文字(150%)
パディングなし
規格RFC 9285
大文字と小文字の区別あり

エンコード例

入力 (UTF-8)出力
Hello, World!%69 VDK2E:3404ESVDX0
Base64.isSH8LQEG%61*5P2
你好C-SEFK*.K

よくある質問

Base45 の出力にスペースが含まれるのはなぜですか?

スペースはアルファベットの 45 文字の 1 つで、データを表しています。Base45 のテキストのスペースを削除したりまとめたりしないでください。デコードに失敗するか、誤ったバイト列になります。

HC1: で始まる文字列をデコードするにはどうすればよいですか?

HC1: のプレフィックスを取り除き、残りを出力を16進数にしてデコードします。次に、その結果を zlib で展開し、別のツールで CBOR データを読み取ります。このツールが行うのは Base45 の手順だけです。

Base45 は大文字と小文字を区別しますか?

はい。QR コードの英数字モードには小文字がないため、アルファベットに含まれるのは大文字だけです。小文字を入力すると、その位置とともに無効な文字として表示されます。

Base45 は Base64 よりコンパクトですか?

プレーンテキストとしては違います。Base45 は入力の 1.5 倍、Base64 は約 1.33 倍のサイズです。QR コードの中では、Base45 のほうがコンパクトです。より高密度な英数字モードを使えるためです。