Как закодировать текст в Base32
- Введите или вставьте текст в поле Ввод · Текст. Если отмечено На лету, результат обновляется при каждом нажатии клавиши.
- Результат появляется в поле Результат · Base32 (RFC 4648). Снимите флажок Дополнение (=) под результатом, чтобы убрать завершающие знаки
=. - Для другого варианта откройте меню В и выберите Base32hex, Crockford Base32 или z-base-32.
- Чтобы декодировать, нажмите Base32 (RFC 4648) → Текст в переключателе направления. Отдельный декодер Base32 сразу открывается в этом направлении.
- Заберите результат кнопками Скопировать результат или Скачать.
По умолчанию текст превращается в байты в UTF-8. Если нужен Base32 того же текста в другой кодировке, например Windows-1252 или UTF-16LE, поменяйте Кодировка под полем ввода.
Как работает Base32
Base32 читает ввод по 5 бит и записывает по одному символу на каждые 5 бит. Пять байт (40 бит) превращаются ровно в восемь символов, так что результат на 60% больше ввода. У Base64 для тех же данных рост был бы 33%. Base32 платит размером за то, что обходится заглавными буквами и шестью цифрами.
Если длина ввода не кратна 5 байтам, последняя группа дополняется знаками = до 8 символов. Вот тестовые векторы из RFC 4648, полученные этим инструментом:
| Ввод | Base32 | Без дополнения |
|---|---|---|
f | MY====== | MY |
fo | MZXQ==== | MZXQ |
foo | MZXW6=== | MZXW6 |
foob | MZXW6YQ= | MZXW6YQ |
fooba | MZXW6YTB | MZXW6YTB |
foobar | MZXW6YTBOI====== | MZXW6YTBOI |
Дополнение не несёт данных. Декодер может вычислить число байтов по количеству настоящих символов, поэтому многие форматы его отбрасывают.
Варианты Base32: RFC 4648, base32hex, Crockford, z-base-32
Название «Base32» носит целое семейство кодировок. Все четыре варианта упаковывают 5 бит в символ и различаются алфавитом и наличием дополнения. Одни и те же пять байт, Hello, в каждом из них:
| Вариант | Алфавит | Hello | Дополнение | Где встречается |
|---|---|---|---|---|
| Base32 по RFC 4648 | A–Z, 2–7 | JBSWY3DP | = | Секреты TOTP/2FA, onion-адреса Tor v3, IPFS CIDv1 (b…, нижний регистр) |
| Base32hex | 0–9, A–V | 91IMOR3F | = | Записи NSEC3 в DNSSEC; закодированные строки сортируются в том же порядке, что и байты |
| Crockford Base32 | 0–9, A–Z без I L O U | 91JPRV3F | нет | Идентификаторы, которые люди читают вслух и набирают |
| z-base-32 | ybndrfg8ejkmcpqxot1uwisza345h769 | jb1sa5dx | нет | Ключи и идентификаторы, рассчитанные на людей |
Base32hex и Crockford похожи, но это разные алфавиты: после H они расходятся, так что 91IMOR3F и 91JPRV3F кодируют одни и те же байты. Если выбрать не тот, декодирование пройдёт без ошибки и молча даст другие байты.
Декодер Crockford прощает неточности так, как задумал Крокфорд: читает I и L как 1, O как 0 и пропускает дефисы, так что 91JP-RV3F всё равно даёт Hello. Необязательный контрольный символ Crockford он не добавляет и не проверяет.
Base32 для секретов TOTP и 2FA
Приложения-аутентификаторы получают секрет из ссылки otpauth://, которую обычно показывают в виде QR-кода:
otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example
Параметр secret записан в Base32 по RFC 4648 без дополнения. В JBSWY3DPEHPK3PXP 16 символов, то есть 10 байт. RFC 4226 рекомендует 160-битный (20-байтный) секрет, а это 32 символа Base32. Если ваш секрет хранится в Base64 или hex, конвертируйте его через Base64 в Base32, а не вводите текст Base64 на этой странице. Если закодировать символы Base64 как текст, получится корректная строка Base32 от совсем других байтов, и каждый сгенерированный по ней код будет отвергнут.
Секрет TOTP и есть ключ: любой, у кого он есть, может генерировать ваши коды. Эта страница работает с секретом внутри вкладки браузера, а её Content Security Policy запрещает странице делать сетевые запросы, кроме счётчика просмотров Cloudflare.
Base32 в командной строке и в Python
В GNU coreutils есть команда base32, которая работает как base64:
printf 'Hello' | base32
printf 'JBSWY3DP' | base32 -d
Первая строка выводит JBSWY3DP, вторая – Hello. В стандартной библиотеке Python есть все три формы из RFC 4648:
import base64
base64.b32encode(b"Hello") # b'JBSWY3DP'
base64.b32hexencode(b"Hello") # b'91IMOR3F'
base64.b32encode(b"Hi").decode().rstrip("=") # 'JBUQ'
Другие рецепты кодирования собраны на странице про Python. Декодирование, включая ошибки дополнения и регистра, которые выбрасывает Python, разобрано на странице декодера Base32.
Вопросы и ответы
Почему результат Base32 заканчивается на ======?
Base32 работает блоками по 5 байт, которые превращаются в 8 символов. Если последний блок короче, RFC 4648 заполняет оставшиеся символы знаками =, поэтому Hi превращается в JBUQ====. Снимите флажок Дополнение (=), если принимающей стороне нужен голый JBUQ.
Важен ли регистр в Base32?
Буквы в алфавите RFC 4648 только заглавные, но большинство декодеров, включая этот, принимают и строчные. Python строже: base64.b32decode отвергает строчные, если не передать casefold=True.
Что выбрать: Base32 или Base64?
Base64 подходит, когда данные читают только программы: он короче (рост на 33% против 60%). Base32 выбирают, когда значение читают, набирают или диктуют люди или когда оно должно пройти через системы без учёта регистра, например доменные имена или некоторые файловые системы.
Какие символы использует Base32?
Base32 по RFC 4648 использует A–Z и 2–7, плюс = для дополнения. Цифр 0, 1, 8 и 9 в нём нет, так что строка с ними записана в base32hex, в Crockford или вообще не в Base32.