Спецификация BIP-39 в основном описывает алгоритм и процесс генерации детерминированных кошельков на основе мнемоники (набора легко запоминающихся слов).
Спецификация состоит из двух основных частей:
Как сгенерировать мнемонику.
Как преобразовать сгенерированную мнемонику в бинарный сид.
Далее мы рассмотрим, как генерировать детерминированные кошельки, сначала описав каждую из этих двух частей.
Генерация мнемоники
Алгоритмический процесс генерации мнемоники следующий:
Процесс следующий:
Создание случайной последовательности (энтропии) длиной от 128 до 256 бит (шаг 32 бита)
Выполнение SHA256 над случайной последовательностью, сгенерированной на предыдущем шаге, для получения хэш-значения, и взятие первых N бит хэш-значения (длина энтропии / 32, например, 128 бит, тогда N = 4) в качестве контрольной суммы случайной последовательности.
Добавление контрольной суммы в конец случайной последовательности, сгенерированной на первом шаге, так что для примера на рисунке случайная последовательность с контрольной суммой составляет 128 + 4 = 132 бита.
Разделение случайной последовательности из предыдущего шага на сегменты по 11 бит (разделение), так что для последовательности с длиной энтропии 128 бит генерируется 12 сегментов (132 / 11 = 12).
На этом этапе сопоставление каждого значения, содержащего 11-битный сегмент, с предопределенным словарем из 2048 слов.
Окончательная группа слов, сгенерированных в порядке разделения, является мнемоникой.
Генерация сида из мнемоники
После генерации мнемоники мы можем сгенерировать сид, используя функцию генерации ключей алгоритма 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-кошелька.
Ввод корневого сида в алгоритм HMAC-SHA512 дает 512-битное хэш-значение, левые 256 бит которого используются в качестве мастер-ключа приватного ключа, а правые 256 бит — в качестве мастер-кода цепочки. После этого мастер-ключ (264 бита) может быть сгенерирован из мастер-ключа приватного ключа m.
Как видно из приведенной выше диаграммы, HD-ключ генерируется со следующими параметрами.
Родительский приватный ключ или родительский публичный ключ; (оба являются не сжатыми 256-битными ключами ECDSA).
Родительский код цепочки длиной 256 бит.
Целочисленный индексный номер длиной 32 бита.
Кроме того, вышеуказанный процесс является рекурсивным, а дочерний приватный ключ на диаграмме может использоваться в качестве родительского приватного ключа на следующем уровне.
Вводя (родительский публичный ключ, родительский код цепочки, индексный номер) в алгоритм HMAC-SHA512, мы можем сгенерировать его дочерние ключи, и мы можем корректировать индексный номер для генерации нескольких дочерних ключей на одном уровне.
О расширенном ключе
Поскольку эта функция вывода ключей односторонняя, все дочерние ключи не могут быть использованы для вывода их родительских ключей или ключей-братьев на том же уровне, только родительский ключ и родительский код цепочки (которые генерируются из ключа и кода цепочки родителя) могут быть использованы для вывода всех дочерних ключей и дочерних кодов цепочки, и впоследствии генерации соответствующих дочерних публичных ключей и адресов для подписания транзакций.
Комбинация ключа и кода цепочки называется расширенным ключом, и расширенный ключ может использоваться для генерации всех ветвей оттуда.
Ключ, предоставляемый в расширенном ключе, может быть либо приватным ключом, либо публичным ключом, в сочетании с кодом цепочки, называемым расширенным приватным ключом и расширенным публичным ключом соответственно, и обозначаемым как (k, c) и (K, c) соответственно, где публичный ключ K = point(k).
Мы можем выводить расширенный публичный ключ из расширенного приватного ключа, но не наоборот, поэтому для некоторых сценариев транзакций (например, электронной коммерции) новый публичный ключ и адрес могут быть сгенерированы для каждой транзакции для получения платежа, в то время как расширенный приватный ключ может храниться в бумажном кошельке или аппаратном кошельке для безопасного офлайн-подписания транзакций. Как мы видим, безопасность расширенного публичного ключа относительно высока, и следующая диаграмма показывает механизм передачи расширенного родительского публичного ключа для вывода дочернего приватного ключа и генерации дочернего публичного ключа:



