Спецификация 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 Internet Engineering Task Force».
После приведенной выше мнемоники на следующей диаграмме показан алгоритм генерации начального числа.
Первый параметр 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 = точка(k).
Мы можем получить расширенный открытый ключ из расширенного закрытого ключа, а не наоборот, поэтому для некоторых сценариев транзакций (например, электронной коммерции) для каждой транзакции для получения платежа можно генерировать новый открытый ключ и адрес, а расширенный закрытый ключ можно хранить в бумажном или аппаратном кошельке для безопасного подписания транзакций в автономном режиме. Как мы видим, безопасность расширенного открытого ключа относительно высока, и на следующей диаграмме показан механизм передачи расширенного родительского открытого ключа для получения дочернего закрытого ключа и генерации дочернего открытого ключа:




