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

Что такое BIP39?

Обновлено более 2 нед. назад

Спецификация 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 требует два параметра: мнемонику и соль. Цель соли — затруднить взлом, и в BIP-39 мы можем использовать парольную фразу в качестве дополнительного фактора безопасности для защиты сидов.

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

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

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

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

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

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

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

generate-hd-master-key.jpeg

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

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

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

  • Родительский код цепочки длиной 256 бит.

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

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

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

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

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

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

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

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

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