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



