Загрузить файл
  1. base64hub
  2. Таблица алфавита Base64

Таблица алфавита Base64

Base64 сопоставляет каждому 6-битному значению от 0 до 63 один печатный символ. Ниже полная таблица, её URL-safe версия и закономерности расположения символов.

64 символа

Base64 читает входные данные по 3 байта (24 бита) и делит их на четыре 6-битных числа. Каждое число от 0 до 63 – это индекс в таблице ниже. Порядок закреплён в RFC 4648: заглавные буквы для 0–25, строчные для 26–51, цифры для 52–61, затем + и /. В последнем столбце указан ASCII-код символа: именно он в итоге хранится или передаётся.

Индекс6 битBase64Base64URLКод ASCII
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

Два диапазона стоит запомнить. Все символы от A до P (0–15) начинаются с битов 00, а все символы от w до / (48–63) – с 11. Этого хватает, чтобы разобрать символ в уме, когда проверяете префикс вручную. Подробный пример разбиения на биты есть в статье как работает Base64.

Порядок алфавита не совпадает с порядком ASCII. В ASCII сначала идут + и /, потом цифры, потом заглавные и строчные буквы. Поэтому сортировка строк Base64 не сортирует исходные байты: +A== (байт F8) окажется раньше AA== (байт 00). Если нужны закодированные значения, которые сортируются так же, как сырые байты, берите base32hex из RFC 4648 или обычный hex.

URL-safe алфавит

У + и / в URL особый смысл. В строке запроса и данных формы + декодируется в пробел, а / разделяет сегменты пути. Base64URL, описанный в разделе 5 RFC 4648, оставляет индексы 0–61 как есть и меняет два последних:

ИндексBase64Base64URL
62+-
63/_

Всё остальное, включая раскладку битов, совпадает, поэтому перевод из одного варианта в другой – это замена символов плюс добавление или удаление дополнения. Base64URL, обычно без =, используют JWT, многие API-токены и идентификаторы, которые должны годиться для имён файлов. Кодировщик Base64URL выдаёт его сразу. Полное сравнение приведено в статье Base64 и Base64URL.

Символ дополнения

= (ASCII 0x3D) не входит в алфавит из 64 символов и никогда не кодирует данные. Он только заполняет последнюю группу из 4 символов, когда длина входных данных не кратна 3:

  • остался 1 байт: 2 символа данных плюс ==;
  • осталось 2 байта: 3 символа данных плюс =;
  • лишних байтов нет: дополнения нет.

Поэтому длина строки с дополнением всегда кратна 4, а === не бывает. Без дополнения остаток от деления длины на 4 равен 0, 2 или 3, но никогда 1. Когда = можно опустить и как его восстановить, рассказано в статье про дополнение.

Какие символы где встречаются

Несколько закономерностей напрямую следуют из раскладки битов. Мы проверили их полным перебором всех нужных значений байтов.

Перед == бывают только A, Q, g или w. Когда остаётся один байт, второй символ несёт 2 бита данных и 4 нулевых бита, так что его индекс равен 0, 16, 32 или 48. Перед одиночным = у третьего символа в конце 2 нулевых бита, поэтому это один из 16 символов: A E I M Q U Y c g k o s w 0 4 8. Любой другой символ на этом месте означает неканоническую кодировку, и строгие декодеры такую строку отвергают.

Случайные байты используют все 64 символа поровну. Каждая 6-битная группа случайных данных распределена равномерно, поэтому у зашифрованных данных, ключей и сжатых файлов распределение символов плоское. Перекос в распределении подсказывает, что внутри текст или данные со структурой.

В ASCII-тексте первым символом группы не бывает строчных от g до z, цифр, + и /. Первый символ каждой 4-символьной группы содержит старшие 6 бит байта. У 7-битного ASCII старший бит равен 0, так что этот символ всегда лежит между A и f (индексы 0–31). В SGVsbG8gd29ybGQh (Hello world!) группы начинаются с S, b, d и b.

В Base64 от ASCII-текста + и / редки. Для байтов меньше 0x80 символ + может появиться только четвёртым в группе, когда третий байт – > или ~. / может стоять там же, только если этот байт – ? или управляющий символ DEL. Вот почему Hi?> кодируется в SGk/Pg==, а <b> – в PGI+.

Цепочки A – это нулевые байты, цепочки / – байты 0xFF. AAAA – три байта 00, //// – три байта FF. Длинные отрезки из A типичны для разреженных двоичных форматов, текста в UTF-16 (Hello – это SABlAGwAbABvAA==) и полей длины в начале SSH-ключей. Другие узнаваемые шаблоны собраны в статье частые префиксы Base64.

Другие алфавиты Base64

Некоторые системы сохранили идею 64 символов на 6 бит, но выбрали другие символы:

ВариантАлфавит в порядке индексовГде встречается
СтандартныйA-Z a-z 0-9 + /RFC 4648, MIME, PEM, большинство API
URL-safeA-Z a-z 0-9 - _RFC 4648, раздел 5, JWT
Имена почтовых ящиков IMAPA-Z a-z 0-9 + ,модифицированный UTF-7 из RFC 3501
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) использует ./0-9A-Za-z, то есть порядок ASCII. К тому же он упаковывает биты начиная с младших, так что даже с перекодированным алфавитом стандартный декодер не восстановит байты хеша.
  • uuencode и xxencode старше MIME. Инструменты uuencode и xxencode умеют и кодировать, и декодировать.

Про кодировки с алфавитами другого размера, такие как Base32, Base58 и Base85, читайте в статье Base64, hex, Base32, Base58 и Base85. Определения терминов с этой страницы – в глоссарии.

Вопросы и ответы

Сколько символов в алфавите Base64?

64 символа для данных: 26 заглавных латинских букв, 26 строчных, 10 цифр, + и /. Знак дополнения = – 65-й символ, который никогда не несёт данных.

Какое значение в Base64 у буквы A?

A – это индекс 0, в двоичном виде 000000. B – 1, Z – 25, a – 26, z – 51, 0 – 52, 9 – 61, + – 62, / – 63.

Какие символы меняет Base64URL?

Только два: + (индекс 62) превращается в -, а / (индекс 63) – в _. Дополнение обычно тоже отбрасывают. Перевести строку можно инструментом Base64 в Base64URL.