ファイルを選択
  1. base64hub
  2. Base64 アルファベット表

Base64 アルファベット表

Base64 は 0〜63 の 6 ビット値それぞれを、印字可能な 1 文字に対応させます。完全な対応表、URLセーフ版、そしてどの文字がどこに現れるかをまとめました。

64 の文字

Base64 は入力を 3 バイト(24 ビット)ずつ読み取り、4 つの 6 ビット値に分割します。0〜63 の各値が、この表のインデックスになります。順序は RFC 4648 で決まっており、0〜25 が大文字、26〜51 が小文字、52〜61 が数字、その後に + と / が続きます。最後の列はその文字の ASCII コードで、実際に保存・送信されるのはこの値です。

インデックス6 ビットBase64Base64URLASCII コード
0000000AA0x41
1000001BB0x42
2000010CC0x43
3000011DD0x44
4000100EE0x45
5000101FF0x46
6000110GG0x47
7000111HH0x48
8001000II0x49
9001001JJ0x4A
10001010KK0x4B
11001011LL0x4C
12001100MM0x4D
13001101NN0x4E
14001110OO0x4F
15001111PP0x50
16010000QQ0x51
17010001RR0x52
18010010SS0x53
19010011TT0x54
20010100UU0x55
21010101VV0x56
22010110WW0x57
23010111XX0x58
24011000YY0x59
25011001ZZ0x5A
26011010aa0x61
27011011bb0x62
28011100cc0x63
29011101dd0x64
30011110ee0x65
31011111ff0x66
32100000gg0x67
33100001hh0x68
34100010ii0x69
35100011jj0x6A
36100100kk0x6B
37100101ll0x6C
38100110mm0x6D
39100111nn0x6E
40101000oo0x6F
41101001pp0x70
42101010qq0x71
43101011rr0x72
44101100ss0x73
45101101tt0x74
46101110uu0x75
47101111vv0x76
48110000ww0x77
49110001xx0x78
50110010yy0x79
51110011zz0x7A
52110100000x30
53110101110x31
54110110220x32
55110111330x33
56111000440x34
57111001550x35
58111010660x36
59111011770x37
60111100880x38
61111101990x39
62111110+-0x2B
63111111/_0x2F
パディング–=通常は省略0x3D

覚えておくと便利な範囲が 2 つあります。A〜P(0〜15)の文字はすべてビット 00 で始まり、w〜/(48〜63)の文字はすべて 11 で始まります。手作業で接頭辞を確認するときは、これだけ知っていれば頭の中で 1 文字をデコードできます。ビット分割の具体例は Base64 の仕組み にあります。

アルファベットの順序は ASCII の順序とは異なります。ASCII では + と / が先頭で、次に数字、大文字、小文字の順です。そのため Base64 文字列をソートしても、元のバイト列の順にはなりません。+A==(バイト F8)は AA==(バイト 00)より前に並びます。エンコード後の値を元のバイト列と同じ順に並べたい場合は、RFC 4648 の base32hex か、普通の 16進数を使ってください。

URLセーフなアルファベット

+ と / はどちらも URL の中で特別な意味を持ちます。+ はクエリ文字列やフォームデータでスペースとしてデコードされ、/ はパスの区切りです。RFC 4648 の 5 章で定義されている Base64URL は、インデックス 0〜61 はそのままで、最後の 2 つを入れ替えます。

インデックスBase64Base64URL
62+-
63/_

ビット配置を含めてそれ以外はすべて同じなので、両者の変換は文字の置き換えと、パディングの追加・削除だけで済みます。JWT、多くの API トークン、ファイル名に使える識別子は Base64URL を使い、たいていは = を付けません。Base64URL エンコーダー なら直接生成できます。詳しい比較は Base64 と Base64URL の違い をご覧ください。

パディング文字

=(ASCII 0x3D)は 64 文字のアルファベットに含まれず、データを表すことはありません。入力の長さが 3 の倍数でないときに、最後の 4 文字のグループを埋めるためだけに使われます。

  • 1 バイト余る場合:データ文字 2 つと ==
  • 2 バイト余る場合:データ文字 3 つと =
  • 余りがない場合:パディングなし

そのため、パディング付きの文字列の長さは必ず 4 の倍数になり、=== が現れることはありません。パディングなしの場合、長さを 4 で割った余りは 0、2、3 のいずれかで、1 になることはありません。= を省略してよい場面と、元に戻す方法は パディングの解説 で説明しています。

どの文字がどこに現れるか

ビット配置から直接導かれるパターンがいくつかあります。いずれも、関係するすべてのバイト値を総当たりして確認しました。

== の直前には A、Q、g、w しか現れません。 1 バイト余る場合、2 文字目はデータ 2 ビットの後に 0 が 4 ビット続くので、インデックスは 0、16、32、48 のいずれかになります。= が 1 つの場合、3 文字目は末尾の 2 ビットが 0 なので、A E I M Q U Y c g k o s w 0 4 8 の 16 文字のどれかです。この位置にそれ以外の文字があれば正規形でないエンコードであり、厳格なデコーダーはエラーにします。

ランダムなバイト列では 64 文字すべてが均等に使われます。 ランダムなデータの 6 ビットグループは一様に分布するため、暗号化されたデータ、鍵、圧縮ファイルでは文字の分布が平坦になります。分布に偏りがあれば、テキストか何らかの構造を持つデータである手がかりです。

ASCII テキストでは、小文字の g〜z、数字、+、/ が先頭に来ることはありません。 4 文字グループの 1 文字目は、バイトの上位 6 ビットを表します。7 ビット ASCII では最上位ビットが 0 なので、この文字は必ず A〜f(インデックス 0〜31)の範囲に収まります。SGVsbG8gd29ybGQh(Hello world!)では、各グループの先頭は S、b、d、b です。

ASCII テキストの Base64 では、+ と / はまれです。 0x80 未満のバイトでは、+ が現れるのはグループの 4 文字目で、3 バイト目が > か ~ の場合に限られます。/ がその位置に現れるのは、そのバイトが ? か DEL 制御文字の場合だけです。Hi?> が SGk/Pg== に、<b> が PGI+ にエンコードされるのはこのためです。

A の連続はゼロバイト、/ の連続は 0xFF です。 AAAA は 00 バイト 3 つ、//// は FF バイト 3 つです。A が長く続くのは、疎なバイナリ形式、UTF-16 テキスト(Hello は SABlAGwAbABvAA==)、SSH 鍵の先頭にある長さフィールドによく見られます。見分けやすいパターンは よくある Base64 の接頭辞 にもまとめています。

その他の Base64 アルファベット

6 ビットあたり 64 文字という考え方はそのままに、異なる文字を選んだシステムもいくつかあります。

バリアントインデックス順のアルファベット使われる場所
標準A-Z a-z 0-9 + /RFC 4648、MIME、PEM、ほとんどの API
URLセーフA-Z a-z 0-9 - _RFC 4648 5 章、JWT
IMAP メールボックス名A-Z a-z 0-9 + ,RFC 3501 の修正 UTF-7
bcrypt. / A-Z a-z 0-9$2a$、$2b$、$2y$ のパスワードハッシュ
crypt(3). / 0-9 A-Z a-zMD5-crypt $1$、SHA-crypt $5$ と $6$、DES crypt
xxencode+ - 0-9 A-Z a-z古い Unix のメールや Usenet
uuencodeASCII 32〜95(スペース〜_)、0 には ` を使うことが多い古い Unix のメールや Usenet
  • IMAP は、/ がメールボックス名の階層区切りとしてよく使われるため、/ を , に置き換えます。Entwürfe というフォルダは Entw&APw-rfe として保存されます。
  • bcrypt は . と / を先頭に移し、文字を数字より前に置きます。ソルトとハッシュはこのアルファベットによるパディングなしの Base64 なので、標準のデコーダーでは正しいバイト列が得られません。
  • crypt(3) は ASCII 順の ./0-9A-Za-z を使います。さらに最下位ビット側からビットを詰めるため、アルファベットを置き換えても、標準のデコーダーではハッシュのバイト列を再現できません。
  • uuencode と xxencode は MIME 以前の方式です。uuencode と xxencode のツールで、どちらも読み書きできます。

Base32、Base58、Base85 のようにアルファベットの文字数が異なるエンコード方式については、Base64 と 16進数・Base32・Base58・Base85 の比較 をご覧ください。ここで使った用語の定義は 用語集 にあります。

よくある質問

Base64 のアルファベットは何文字ですか?

データ用は 64 文字で、大文字 26、小文字 26、数字 10、+ と / です。パディング記号の = は 65 番目の記号で、データを表すことはありません。

A の Base64 での値はいくつですか?

A はインデックス 0、2 進数で 000000 です。B は 1、Z は 25、a は 26、z は 51、0 は 52、9 は 61、+ は 62、/ は 63 です。

Base64URL ではどの文字が変わりますか?

変わるのは 2 文字だけで、+(インデックス 62)が - に、/(インデックス 63)が _ になります。通常はパディングも省略されます。Base64 から Base64URL への変換 で変換できます。