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

BIP-39 — стандарт, описывающий преобразование случайной последовательности битов в набор слов и обратно; он задаёт список из 2048 слов и правило контрольной суммы, по которому проверяется корректность записи.

Откуда берётся число слов

Каждое слово кодирует одиннадцать бит, поскольку список содержит ровно 2048 вариантов, а это два в одиннадцатой степени, а двенадцать слов несут 132 бита, из которых 128 составляют саму случайность, а четыре служат контрольной суммой. Для двадцати четырёх слов исходная последовательность вдвое длиннее: 256 бит плюс восемь бит проверки.

Отсюда и разница между вариантами. Фраза из 24 слов опирается на более длинное случайное число, хотя для практических целей защиты хватает и двенадцати.

Схема из четырёх шагов: от энтропии до проверки контрольной суммы
Схема из четырёх шагов: от энтропии до проверки контрольной суммы

Как устроено преобразование

Этап Что происходит
Генерация Устройство создаёт случайную последовательность из 128 или 256 бит
Контрольная сумма От последовательности берётся хеш, первые биты добавляются в конец
Разбиение Результат делится на группы по 11 бит
Подстановка слов Каждая группа заменяется словом из списка по её номеру

Зачем нужна контрольная сумма

Она ловит ошибки при записи и вводе, при этом случайный набор слов из списка почти наверняка не пройдёт проверку, поэтому кошелёк сразу сообщит о неверной фразе вместо того, чтобы молча открыть пустой кошелёк. Это защищает от опечаток, но не от перестановки слов местами, если обе фразы случайно окажутся корректными.

Почему список именно такой

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

Списки существуют на нескольких языках. Но фразы с них не взаимозаменяемы: восстановление требует того же языка, на котором фраза была создана.

Что следует из устройства стандарта

  • Порядок слов критичен: перестановка даёт совершенно другой кошелёк
  • Фраза не привязана к производителю и работает в любом совместимом кошельке
  • Записывать нужно сами слова, а не их номера или сокращения
  • Одна ошибка в слове обычно выявляется контрольной суммой при вводе

Ко мне обращался человек, записавший фразу без нумерации строк, а потом восстанавливавший кошелёк по памяти о порядке, тогда как слова были верными, но две строки он переставил, и кошелёк открылся пустым. Контрольная сумма при этом совпала случайно, и никакого предупреждения он не получил.

От фразы к ключам

Слова преобразуются в длинное число — семя, из которого по правилам родственного стандарта выводятся все приватные ключи и адреса кошелька, и процесс детерминированный: одна и та же фраза всегда даёт один и тот же набор адресов, и именно поэтому восстановление работает в кошельке любого производителя.

Масштаб защиты в цифрах

Фраза из двенадцати слов соответствует 128 битам случайности — это число с тридцатью девятью нулями вариантов. Перебор такого пространства недостижим для любых существующих и обозримых вычислительных мощностей, и подбор фразы не входит в число реальных угроз.

Опасность приходит с другой стороны. Фотография записи в телефоне, фраза в облачной заметке или ввод на фишинговом сайте обесценивают всю эту математику мгновенно, и именно так происходит подавляющее большинство потерь.

Роль дополнительной парольной фразы

Стандарт допускает добавление произвольной строки, которая участвует в вычислении семени наравне со словами, а любая такая строка даёт корректный кошелёк, то есть неверно введённая фраза не вызовет ошибки — вы увидите пустой баланс. Это свойство делает её мощным инструментом защиты и одновременно частой причиной потери доступа.

Запись и проверка фразы

Нумеруйте строки при записи — это единственная защита от перестановки, которую контрольная сумма не ловит, и пишите слова полностью, без сокращений: четырёх букв достаточно для определения слова по списку, но восстанавливать запись по обрывкам через годы неудобно и чревато ошибкой.

Чего стандарт не обещает

Он описывает кодирование и проверку, но не защищает фразу от компрометации, при этом любой, кто увидит слова, получит полный доступ к средствам независимо от производителя устройства и его защитных механизмов. Вся безопасность сводится к тому, насколько надёжно вы храните эту запись.

Смежные темы разобраны у нас. Вот основные. Общий раздел — кошельки и хранение. Шире — статьи про криптокошельки. Проверку копии разбирает материал как проверить резервную копию кошелька, а долгосрочное хранение — статья как организовать хранение криптовалюты.

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

Что надёжнее: 12 слов или 24?

Обе длины дают защиту, недостижимую для перебора при нынешних вычислительных возможностях, причём разница между 128 и 256 битами случайности имеет теоретическое значение, но практически выбор определяется удобством записи и требованиями конкретного устройства.

Можно ли придумать слова самому?

Технически фраза пройдёт проверку, если угадать контрольную сумму, но делать так нельзя категорически. Человек выбирает слова предсказуемо, и такая фраза подбирается несопоставимо быстрее случайной. Генерацию всегда оставляют устройству.

Работает ли фраза от одного кошелька в другом?

Да, если оба поддерживают стандарт и используют совпадающие правила вывода адресов, и иногда адреса отображаются не сразу из-за разных путей деривации по умолчанию, и тогда нужный тип выбирается в настройках вручную.

Вердикт

Фраза — это запись случайного числа, а не набор символов от производителя: она работает в любом совместимом кошельке, а порядок слов критичен, и перестановка даёт другой кошелёк без всякого предупреждения. Контрольная сумма ловит опечатку, но не перестановку. И помните, что стандарт описывает кодирование, а не защиту: безопасность целиком зависит от того, как вы храните запись.

Стандарт проверяйте по первоисточнику. Официальное описание стандарта BIP-39 и справка Ledger по восстановлению кошелька содержат полный список слов и порядок процедур.

Иван Григорьев, автор Cryptium. Практикующий разбор кошельков и самостоятельного хранения. Больше материалов — в Telegram-канале t.me/cryptiumru.