Выберите «Кодировать» или «Декодировать», выберите схему и нажмите кнопку действия. Вся обработка остаётся в вашем браузере.
Что такое Base32 и Base58?
Это два ответа на один вопрос: канал, который переносит текст, просят переносить байты. Base32 и Base58 — не шифрование и не хеширование — они ничего не скрывают и ничего не сокращают. Они переписывают строку байтов, используя фиксированный набор читаемых символов, и любой, кто знает, какой набор использован, может сразу превратить её обратно. Единственная причина предпочесть один из них другому — то, что принимающая сторона делает с символами.
Два семейства переписывают данные совершенно по-разному, и разница объясняет почти каждый сюрприз на этой странице:
- Упаковка битов — Base32, Base32 Hex, Crockford Base32, z-base-32. Байты режутся на фиксированные группы, и каждые пять бит становятся одним символом. Длина результата предсказуема по длине входа, а последняя, частично заполненная группа либо помечается символами заполнения, либо остаётся короткой.
- Преобразование в большое число — все таблицы Base58. Вся строка байтов читается как одно огромное число в основании 256 и записывается заново в основании 58. Здесь нет групп и заполнения; длина ни на что не делится, а каждый ведущий нулевой байт превращается в один ведущий нулевой символ.
Куда уходят шесть информационных бит: Base32 тратит пять бит на символ, поэтому нужно восемь символов на каждые пять входных байт — примерно на 60% больше. Base58 тратит около 5,86 бита на символ, поэтому результат примерно на 37% больше. Base64 кладёт шесть бит в символ и даёт 33%. Большие алфавиты короче, но их труднее читать вслух, и именно этот компромисс выбирает каждый из них.
Семь алфавитов этой страницы
Каждый алфавит приведён полностью, а не описан, потому что два инструмента, которые выводят разные символы под одним названием, не совпадут друг с другом, как бы ни называлась метка. Строки RFC 4648 нормативны; строки Crockford и z-base-32 следуют тому, что опубликовал автор формата; три строки Base58 — широко распространённые соглашения, а не стандарты, поэтому они перечислены отдельно.
Crockford Base32 и контрольный символ по модулю 37
Алфавит исключает I, L, O и U, чтобы ни один символ нельзя было прочитать как другой. Остальное нечувствительно к регистру на входе: i и l читаются как цифра 1, o читается как цифра 0, а дефисы существуют только для удобства чтения длинной строки. Кроме того, формат определяет необязательный контрольный символ: это значение строки символов, прочитанное как число в основании 32, взятое по модулю 37 и записанное с помощью пяти дополнительных символов для значений от 32 до 36.
Контрольный символ вычисляется по строке символов, а не по байтам: поскольку кодировщик дополняет последнюю группу нулями, декодирование тех же символов всегда возвращает к тому же значению. Поэтому контрольное значение из таблицы можно воспроизвести вручную только по закодированному столбцу. Пять дополнительных символов — *, ~, $, = и U для значений 32, 33, 34, 35 и 36, поэтому контрольный символ не всегда цифра или буква.
z-base-32
z-base-32 сохраняет пятибитную упаковку RFC 4648 Base32 и меняет лишь порядок тридцати двух символов. Порядок выбран так, чтобы символы, которые человеку чаще всего придётся записывать, были самыми лёгкими для написания и наименее похожими друг на друга. Заполнения нет, поэтому читающий должен знать, сколько символов ожидается в значении; это цена формата, который создан прежде всего для чтения вручную.
Base58Check: один байт версии, полезная нагрузка, четыре байта контрольной суммы
Base58 сам по себе не может отличить строку с опечаткой от правильной, потому что почти любая комбинация его пятидесяти восьми символов является допустимым числом. Base58Check исправляет это, помещая данные в обёртку: один байт версии, затем полезная нагрузка, затем первые четыре байта SHA-256, применённого к первым двум частям дважды подряд. Принимающая программа пересчитывает эти четыре байта и отвергает строку, если они не совпадают. Байт версии сообщает кошельку, с чем он имеет дело: с адресом платежа, адресом скрипта или закрытым ключом.
Генератор под конвертером принимает байт версии и полезную нагрузку в шестнадцатеричном виде и записывает строку Base58Check; проверка читает её обратно, отделяет четыре байта контрольной суммы, пересчитывает их и сообщает как найденное, так и ожидаемое значение. Неверная контрольная сумма здесь означает, что строка набрана с ошибкой или изменена — она никогда не означает, что сама полезная нагрузка неверна, поскольку полезная нагрузка никогда не интерпретируется.
Распространённые недоразумения
- "Base64 — это шифрование." Нет. Нет ни ключа, ни секрета; результат обратим для любого. Base32 и Base58 в том же положении, и протаскивание значения через все три не добавляет защиты.
- "Строка Base58 — это адрес Bitcoin." Только если она также проходит проверку контрольной суммы Base58Check и содержит байт версии, который распознаёт принимающее ПО. Строки Base58 встречаются во многих других местах, включая простые идентификаторы без контрольной суммы вообще.
- "Три алфавита Base58 взаимозаменяемы." Они используют одни и те же пятьдесят восемь символов в трёх разных порядках, поэтому одни и те же байты дают три разные строки. Инструменту нужно сообщить, какой использовать, и эта страница всегда говорит, какой использовала.
- "Заполнение — часть значения." Символы
= лишь отмечают последнюю группу. Две строки Base32, которые отличаются только заполнением, описывают одни и те же байты, поэтому декодер принимает строку с отрезанным заполнением. - "Работают любые символы." Каждый алфавит — фиксированный набор. Символ извне него не имеет значения, поэтому декодер останавливается и называет символ и его позицию, а не угадывает.
Частые вопросы
Почему Base32 использует 2-7, а не 0-9? Потому что RFC 4648 выбрал алфавит так, чтобы он оставался в пределах символов, допустимых в доменном имени, и чтобы его было легко читать вслух. Base32 Hex использует 0-9 A-V, когда важнее естественная сортировка.
Почему строка Base58 так часто начинается с 1? Каждый ведущий нулевой байт входа становится одной ведущей 1 (первым символом алфавитов Bitcoin и Flickr). Байт версии 0x00 — это один нулевой байт, поэтому большинство адресов Bitcoin в основной сети начинаются ровно с одной 1.
Что загружает кнопка «Пример»? Пример, относящийся к схеме и направлению, которые сейчас на экране, никогда не фиксированный текст. Кодировщику передаётся текст примера схемы — векторы RFC 4648 раздел 10 для Base32 и Base32 Hex, 12345 из Crockford, строки z-base-32, приведённые выше — а декодеру передаётся закодированная строка для выбранного алфавита, что делает пример пригодным в обоих направлениях. Три строки Base58 намеренно содержат один и тот же текст, поэтому переключение схемы и повторное нажатие «Пример» показывают три порядка одних и тех же пятидесяти восьми символов рядом. Если отмечен контрольный символ Crockford, декодеру передаётся значение с символом на конце, — это единственный способ увидеть, как проверка его принимает.
Отправляет ли эта страница мои данные куда-либо? Нет. Каждое преобразование выполняется в этой вкладке браузера, а страница не содержит никаких сетевых запросов. Поэтому она работает и с файлом, открытым прямо с диска.
Какой использовать для секрета? Секреты приложений-аутентификаторов TOTP и HOTP обычно записаны в Base32 по алфавиту RFC 4648, потому что секрет нужно вводить вручную. Используйте тот вариант, который запрашивает ваше принимающее ПО, и никогда не полагайтесь на само кодирование для секретности.