К основному содержимому

Что такое BIP39?

Обновлено сегодня

Спецификация BIP-39 в основном описывает алгоритм и процесс генерации детерминированных кошельков на основе мнемонических фраз (набора легко запоминающихся слов).

Спецификация состоит из двух основных частей:

  1. Как сгенерировать мнемоническую фразу.

  2. Как преобразовать сгенерированную мнемоническую фразу в бинарный сид.

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

Генерация мнемонической фразы

Алгоритмический процесс генерации мнемонической фразы выглядит следующим образом:

Процесс выглядит следующим образом:

  1. Создайте случайную последовательность (энтропию) длиной от 128 до 256 бит (с шагом 32 бита).

  2. Выполните SHA256 над случайной последовательностью, сгенерированной на предыдущем шаге, чтобы получить хэш-значение, и возьмите первые N бит хэш-значения (длина энтропии / 32, например, 128 бит, тогда N = 4) в качестве контрольной суммы случайной последовательности.

  3. Добавьте контрольную сумму в конец случайной последовательности, сгенерированной на первом шаге, так что для примера на изображении случайная последовательность с контрольной суммой будет иметь длину 128 + 4 = 132 бита.

  4. Разделите случайную последовательность из предыдущего шага на сегменты по 11 бит (разделение), так что для последовательности с длиной энтропии 128 бит будет сгенерировано 12 сегментов (132 / 11 = 12).

  5. На данном этапе сопоставьте каждое значение, содержащее 11-битный сегмент, с предопределенным словарем из 2048 слов.

  6. Итоговая группа слов, сгенерированная в порядке разделения, является мнемонической фразой.

Генерация сида из мнемонической фразы

После генерации мнемонической фразы мы можем сгенерировать сид, используя функцию генерации ключа на основе алгоритма PBKDF2.

PBKDF2 требует два параметра: мнемоническую фразу и соль (salt). Цель соли — усложнить взлом, а в BIP-39 мы можем использовать парольную фразу в качестве дополнительного фактора безопасности для защиты сидов.

«PBKDF2 является частью набора стандартов криптографии с открытым ключом (PKCS) от RSA Laboratories,
в частности, PKCS #5 v2.0, также опубликованного как RFC 2898 от Internet Engineering Task Force».

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

  • Первым параметром PBKDF2 является мнемоническая фраза, сгенерированная выше.

  • Вторым параметром PBKDF2 является соль (salt), которая обычно состоит из строки и необязательного объединения предоставленных пользователем строк шифра.

  • PBKDF2 использует алгоритм HMAC-SHA512, который выполняет 2048 хеширований для получения 512-битного значения в качестве сида.

Генерация HD-кошелька из сида

Сгенерированный выше сид будет использован в качестве корневого сида HD-кошелька, и корневой сид любого HD-кошелька может воссоздать весь HD-кошелек.

generate-hd-master-key.jpeg

Ввод корневого сида в алгоритм HMAC-SHA512 дает 512-битный хэш, левые 256 бит которого используются как основной приватный ключ, а правые 256 бит — как основной код цепочки (Master Chain Code). После этого основной публичный ключ (264 бита) может быть сгенерирован из основного приватного ключа m.

Как видно из приведенной выше диаграммы, HD-ключ генерируется со следующими параметрами.

  • Родительский приватный ключ или родительский публичный ключ; (оба являются ECDSA-ключами длиной 256 бит в несжатом виде).

  • Родительский код цепочки (Parent Chain Code) длиной 256 бит.

  • Целочисленный индексный номер длиной 32 бита.

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

Вводя (родительский публичный ключ, родительский код цепочки, индексный номер) в алгоритм HMAC-SHA512, мы можем сгенерировать его подключи, и мы можем настроить индексный номер для генерации нескольких подключей на одном уровне.

О расширенном ключе

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

Комбинация ключа и кода цепочки называется расширенным ключом (extended key), и расширенный ключ может использоваться для генерации всех ветвей оттуда.

Ключ, предоставляемый в расширенном ключе, может быть либо приватным ключом, либо публичным ключом; в сочетании с кодом цепочки он называется расширенным приватным ключом и расширенным публичным ключом соответственно, и обозначается как (k, c) и (K, c) соответственно, где публичный ключ K = point(k).

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

Нашли ответ на свой вопрос?