64 の文字
Base64 は入力を 3 バイト(24 ビット)ずつ読み取り、4 つの 6 ビット値に分割します。0〜63 の各値が、この表のインデックスになります。順序は RFC 4648 で決まっており、0〜25 が大文字、26〜51 が小文字、52〜61 が数字、その後に + と / が続きます。最後の列はその文字の ASCII コードで、実際に保存・送信されるのはこの値です。
| インデックス | 6 ビット | Base64 | Base64URL | ASCII コード |
|---|---|---|---|---|
| 0 | 000000 | A | A | 0x41 |
| 1 | 000001 | B | B | 0x42 |
| 2 | 000010 | C | C | 0x43 |
| 3 | 000011 | D | D | 0x44 |
| 4 | 000100 | E | E | 0x45 |
| 5 | 000101 | F | F | 0x46 |
| 6 | 000110 | G | G | 0x47 |
| 7 | 000111 | H | H | 0x48 |
| 8 | 001000 | I | I | 0x49 |
| 9 | 001001 | J | J | 0x4A |
| 10 | 001010 | K | K | 0x4B |
| 11 | 001011 | L | L | 0x4C |
| 12 | 001100 | M | M | 0x4D |
| 13 | 001101 | N | N | 0x4E |
| 14 | 001110 | O | O | 0x4F |
| 15 | 001111 | P | P | 0x50 |
| 16 | 010000 | Q | Q | 0x51 |
| 17 | 010001 | R | R | 0x52 |
| 18 | 010010 | S | S | 0x53 |
| 19 | 010011 | T | T | 0x54 |
| 20 | 010100 | U | U | 0x55 |
| 21 | 010101 | V | V | 0x56 |
| 22 | 010110 | W | W | 0x57 |
| 23 | 010111 | X | X | 0x58 |
| 24 | 011000 | Y | Y | 0x59 |
| 25 | 011001 | Z | Z | 0x5A |
| 26 | 011010 | a | a | 0x61 |
| 27 | 011011 | b | b | 0x62 |
| 28 | 011100 | c | c | 0x63 |
| 29 | 011101 | d | d | 0x64 |
| 30 | 011110 | e | e | 0x65 |
| 31 | 011111 | f | f | 0x66 |
| 32 | 100000 | g | g | 0x67 |
| 33 | 100001 | h | h | 0x68 |
| 34 | 100010 | i | i | 0x69 |
| 35 | 100011 | j | j | 0x6A |
| 36 | 100100 | k | k | 0x6B |
| 37 | 100101 | l | l | 0x6C |
| 38 | 100110 | m | m | 0x6D |
| 39 | 100111 | n | n | 0x6E |
| 40 | 101000 | o | o | 0x6F |
| 41 | 101001 | p | p | 0x70 |
| 42 | 101010 | q | q | 0x71 |
| 43 | 101011 | r | r | 0x72 |
| 44 | 101100 | s | s | 0x73 |
| 45 | 101101 | t | t | 0x74 |
| 46 | 101110 | u | u | 0x75 |
| 47 | 101111 | v | v | 0x76 |
| 48 | 110000 | w | w | 0x77 |
| 49 | 110001 | x | x | 0x78 |
| 50 | 110010 | y | y | 0x79 |
| 51 | 110011 | z | z | 0x7A |
| 52 | 110100 | 0 | 0 | 0x30 |
| 53 | 110101 | 1 | 1 | 0x31 |
| 54 | 110110 | 2 | 2 | 0x32 |
| 55 | 110111 | 3 | 3 | 0x33 |
| 56 | 111000 | 4 | 4 | 0x34 |
| 57 | 111001 | 5 | 5 | 0x35 |
| 58 | 111010 | 6 | 6 | 0x36 |
| 59 | 111011 | 7 | 7 | 0x37 |
| 60 | 111100 | 8 | 8 | 0x38 |
| 61 | 111101 | 9 | 9 | 0x39 |
| 62 | 111110 | + | - | 0x2B |
| 63 | 111111 | / | _ | 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 つを入れ替えます。
| インデックス | Base64 | Base64URL |
|---|---|---|
| 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-z | MD5-crypt $1$、SHA-crypt $5$ と $6$、DES crypt |
| xxencode | + - 0-9 A-Z a-z | 古い Unix のメールや Usenet |
| uuencode | ASCII 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 への変換 で変換できます。