Как декодировать Base32
- Вставьте строку в поле Ввод · Base32 (RFC 4648). Верхний и нижний регистр, пробелы между группами и переносы строк допускаются, дополнение
=необязательно. - Прочитайте декодированный текст в поле Результат · Текст. По умолчанию байты читаются как UTF-8; если текст пришёл из другой системы, поменяйте Кодировка под результатом.
- Если в результате мешанина символов, данные двоичные. Выберите в меню В вариант Hex или Base64, чтобы увидеть байты, или нажмите Сохранить байты, чтобы скачать их файлом.
- Если ввод в другом алфавите, переключите Из на Base32hex, Crockford Base32 или z-base-32.
- Чтобы кодировать, нажмите Текст → Base32 (RFC 4648) в переключателе направления или откройте кодировщик Base32.
Что декодер принимает и что отвергает
Оформление декодер прощает, а содержимое проверяет строго:
| Ввод | Результат |
|---|---|
JBSWY3DP | Hello |
jbswy3dp | Hello; регистр не важен |
JBSW Y3DP EHPK 3PXP | 10 байт, в hex 48656c6c6f21deadbeef |
MZXW6YQ | foob; отсутствие дополнения не мешает |
JBSWY3D0 | Ошибка: неожиданный символ "0" в позиции 8 |
Ошибка указывает на первый символ, которого нет в алфавите. 0, 1, 8 или 9 почти всегда означают, что у строки другой алфавит Base32, а + или / выдают Base64; для него есть декодер Base64.
Декодирование секрета 2FA или TOTP
Ключ, который приложение-аутентификатор показывает при настройке (часто группами, как jbsw y3dp ehpk 3pxp), записан в Base32 по RFC 4648. После декодирования получается «сырой» ключ HMAC, то есть случайные байты, поэтому смотрите на него как на Hex, а не Текст. По длине можно понять размер ключа: 16 символов – это 10 байт, 32 символа – 20 байт (160 бит, размер, рекомендованный RFC 4226), 52 символа – 32 байта.
Чтобы убедиться, что секрет правильный, сгенерируйте по нему код. Эта функция на Python декодирует секрет так же терпимо, а дальше следует RFC 6238:
import base64, hashlib, hmac, struct
def totp(secret, t, digits=6, step=30):
s = secret.replace(" ", "").upper()
key = base64.b32decode(s + "=" * (-len(s) % 8))
mac = hmac.new(key, struct.pack(">Q", t // step), hashlib.sha1).digest()
off = mac[-1] & 0x0F
code = struct.unpack(">I", mac[off:off + 4])[0] & 0x7FFFFFFF
return str(code % 10**digits).zfill(digits)
totp("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", 59, 8) # '94287082'
Секрет и ожидаемое 94287082 взяты из тестового вектора SHA-1 в RFC 6238. Для текущего кода передайте int(time.time()) в качестве t. Другие приёмы декодирования описаны на странице про Python.
IPFS CIDv1 и другой Base32 с префиксом
Некоторые форматы ставят перед Base32 метку. Строки IPFS CIDv1 начинаются с b: так multibase обозначает Base32 по RFC 4648 в нижнем регистре без дополнения. В bafybei… буква b служит префиксом, а afybei… содержит данные. Уберите b, декодируйте и выберите в меню В вариант Hex. Первые байты содержат версию CID (01), тип содержимого (70 для dag-pb) и заголовок multihash (1220 для 32-байтного SHA-256).
Onion-адреса Tor v3 устроены так же, только без префикса: 56 символов перед .onion кодируют в Base32 35 байт: 32-байтный открытый ключ, 2-байтную контрольную сумму и байт версии (03).
Типичные проблемы
- Python выбрасывает
binascii.Error: Non-base32 digit found. Ввод в нижнем регистре. Передайтеcasefold=Trueвb32decodeили сначала вызовите.upper(). - Python выбрасывает
binascii.Error: Incorrect padding. Знаки=были удалены. Дополните длину до кратной 8, как в функции выше. base32 -dпишетinvalid input. GNU coreutils не принимает ни нижний регистр, ни пробелы. Сначала очистите строку или декодируйте её здесь.- Текст декодируется, но получается не то. Строку base32hex или Crockford можно без ошибки декодировать чужим алфавитом. Если источник говорит «Base32», а в строке нет
0,1,8или9, скорее всего, это всё-таки RFC 4648; иначе попробуйте два других алфавита.
Вопросы и ответы
Как декодировать секрет TOTP?
Вставьте секрет (значение secret= из ссылки otpauth:// или текстовый ключ, который приложение показывает вместо QR-кода) и выберите в меню В вариант Hex. Получится «сырой» ключ HMAC. Это случайные байты, поэтому вывод Текст будет выглядеть как мусор, и это нормально.
Почему Python пишет Incorrect padding при декодировании Base32?
base64.b32decode требует, чтобы длина была кратна 8. Сначала допишите недостающие =: s + "=" * (-len(s) % 8). Этому декодеру дополнение не нужно.
Можно ли здесь декодировать ULID?
Напрямую нет. ULID использует алфавит Crockford, но кодирует одно 128-битное число в 26 символов, начиная с 2 запасных бит. Опция Crockford здесь упаковывает байты с первого символа, поэтому для ULID вернёт сдвинутые байты.
Какие символы недопустимы в Base32?
В Base32 по RFC 4648 недопустимо всё, кроме A–Z, 2–7 и завершающих =. Цифры 0, 1, 8 и 9 обычно выдают base32hex или Crockford; переключите меню Из на один из них.