BIP-39: как генерируется мнемоническая фраза, откуда берутся слова и что проверяет контрольная сумма

Что решает BIP-39​


Приватный ключ кошелька — это 256 бит случайных данных. Запомнить или записать такую последовательность вручную без ошибок практически невозможно. BIP-39 предлагает компромисс: представить энтропию в виде последовательности слов из фиксированного словаря, которую человек способен переписать на бумагу и при необходимости ввести обратно.

Стандарт определяет три этапа:

  1. Генерация криптографически стойкой энтропии.
  2. Вычисление и добавление контрольной суммы.
  3. Маппинг битовой последовательности на слова из словаря.

Результат — мнемоническая фраза из 12, 15, 18, 21 или 24 слов. Из неё затем детерминированно выводится бинарный seed, который служит корнем для всех ключей кошелька.

Генерация энтропии​


Первый и критически важный шаг — получение случайных данных. BIP-39 допускает пять размеров энтропии:

Энтропия (бит)Контрольная сумма (бит)Всего битСлов в фразе
128413212
160516515
192619818
224723121
256826424

На практике подавляющее большинство кошельков используют 128 или 256 бит. 128 бит дают 2¹²⁸ возможных комбинаций — этого достаточно для безопасности на обозримую перспективу. 256 бит выбирают для дополнительного запаса.

Энтропия должна поступать из криптографически стойкого генератора случайных чисел (CSPRNG). В операционных системах это /dev/urandom (Linux), BCryptGenRandom (Windows), SecRandomCopyBytes (macOS/iOS). Использование rand(), Math.random() или любых предсказуемых источников делает фразу тривиально подбираемой.

Контрольная сумма: зачем она и как считается​


К энтропии добавляется контрольная сумма, чтобы при ручном вводе или переписывании можно было обнаружить ошибку. Вычисляется она так:

  1. Берётся SHA-256 хеш от исходной энтропии.
  2. Из полученного 256-битного хеша берутся первые ENT / 32 бит, где ENT — размер энтропии в битах.

Для 128-битной энтропии контрольная сумма составляет 4 бита, для 256-битной — 8 бит. Эти биты дописываются в конец энтропии.

Контрольная сумма не является механизмом защиты от подбора — она лишь позволяет кошельку сказать «фраза введена с ошибкой» до того, как пользователь попытается восстановить средства. Вероятность того, что случайно набранная неверная фраза пройдёт проверку, равна 1/2^(CS), где CS — длина контрольной суммы в битах. Для 12 слов это 1/16, для 24 слов — 1/256.

Разбиение на 11-битные группы и маппинг на слова​


Полученная последовательность (энтропия + контрольная сумма) разбивается на группы по 11 бит. Каждая группа представляет число от 0 до 2047 — индекс в словаре.

Почему именно 11 бит и 2048 слов? Это минимальная степень двойки, при которой одно слово кодирует достаточно информации, оставаясь при этом коротким и различимым на слух. Словарь подобран так, что любые два слова отличаются минимум первыми четырьмя символами — это позволяет однозначно идентифицировать слово по префиксу и упрощает ввод.

Словарь для английского языка зафиксирован в спецификации BIP-39 и содержит ровно 2048 слов. Существуют словари для других языков (японский, китайский, испанский, французский и др.), но они не взаимозаменяемы: фраза, сгенерированная с английским словарём, не может быть восстановлена по японскому.

Пример маппинга для 12-словной фразы:

Код:
Энтропия (128 бит):  00000000 00000000 ... 00000000
SHA-256 хеш:         374708ff776d9694b5a4a8b4c4e4a1f8...
Контрольная сумма:   0011 (первые 4 бита хеша)
Всего:               132 бита = 12 групп по 11 бит
Группа 0:            00000000000 → индекс 0 → "abandon"
Группа 1:            00000000000 → индекс 0 → "abandon"
...
Группа 11:           00000000011 → индекс 3 → "about"

Это тестовый вектор из спецификации: фраза из двенадцати «abandon» и завершающего «about» соответствует нулевой энтропии.

Преобразование мнемоники в бинарный seed​


Сама мнемоническая фраза не является seed. Чтобы получить 512-битный бинарный seed, из которого выводятся все ключи, применяется функция PBKDF2:

  • Алгоритм: PBKDF2-HMAC-SHA512
  • Пароль (password): мнемоническая фраза в кодировке UTF-8, слова разделены пробелами (для японского — идеографический пробел U+3000)
  • Соль (salt): строка "mnemonic" + опциональная passphrase
  • Итерации: 2048
  • Выход: 512 бит (64 байта)

Эти 512 бит и есть тот seed, который передаётся в BIP-32 для построения дерева ключей. Мнемоника — лишь человекочитаемая оболочка над энтропией; настоящую криптографическую работу делает PBKDF2.

Passphrase: необязательный 25-й фактор​


BIP-39 поддерживает дополнительный пароль (passphrase), который добавляется к соли PBKDF2. Если passphrase задан, та же мнемоника даёт совершенно другой seed и, соответственно, другой набор адресов.

Это создаёт механизм plausible deniability: можно хранить одну мнемонику и несколько passphrase, каждый из которых открывает отдельный кошелёк. Однако passphrase не заменяет шифрование и не защищает от компрометации самой мнемоники — он лишь умножает пространство поиска.

Важно: если passphrase утерян, восстановить соответствующий кошелёк невозможно. Никакой контрольной суммы для passphrase не существует.

Что проверяет кошелёк при восстановлении​


Когда пользователь вводит фразу для восстановления, кошелёк выполняет проверку:

  1. Каждое слово должно присутствовать в словаре.
  2. Количество слов должно соответствовать допустимому размеру (12, 15, 18, 21 или 24).
  3. Битовая последовательность, полученная обратным маппингом, должна содержать корректную контрольную сумму.

Если хотя бы одно слово заменено на другое из словаря, контрольная сумма с вероятностью 15/16 (для 12 слов) не сойдётся, и кошелёк выдаст ошибку. Но если пользователь перепутал два слова местами или пропустил слово, результат может быть непредсказуемым: либо ошибка контрольной суммы, либо восстановление совершенно другого кошелька с нулевым балансом.

Типичные ошибки при работе с мнемоникой​


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

Использование не-CSPRNG источника. Некоторые «генераторы мнемоник» в браузере или самописные скрипты используют Math.random() или аналог. Результат выглядит как нормальная фраза, но энтропия предсказуема.

Подмена словаря. Если кошелёк использует нестандартный или модифицированный словарь, фраза не будет восстановлена в другом кошельке. Всегда следует использовать стандартный словарь BIP-39 для выбранного языка.

Путаница между мнемоникой и seed. Мнемоника — вход для PBKDF2. Сам seed (512 бит) никогда не показывается пользователю и не предназначен для ручной записи.

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

Безопасность: что нужно помнить​


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

Практические правила:


Проверка корректности без восстановления кошелька​


Если нужно убедиться, что записанная фраза валидна, не восстанавливая кошелёк, можно воспользоваться офлайн-инструментом, который:

  1. Преобразует слова обратно в битовую последовательность.
  2. Отделяет контрольную сумму.
  3. Пересчитывает SHA-256 от энтропии и сравнивает.

Такая проверка подтверждает только синтаксическую корректность (все слова из словаря, контрольная сумма сходится). Она не говорит о том, что фраза была сгенерирована именно вашим кошельком или что на соответствующих адресах есть средства.

Источники​


 
Назад
Верх Низ