Більшість власників Ledger Nano в якийсь момент починають замислюватися, чи є можливість налаштувати їх вихідний код. Деякі можуть піти ще далі та спробувати використати випадково вибрані слова під час процесу відновлення. У таких випадках після підтвердження останнього слова вони майже напевно побачать повідомлення:
"Recovery phrase is invalid, retry"
Чи означає це, що створити новий гаманець із власним набором слів неможливо?
Ось приємний сюрприз: це можливо, хоча з певним обмеженням. Але почнемо з початку.
Першим обмеженням є вимога щодо того, що всі слова мають бути в стандартному списку BIP39
(Пропозиція щодо вдосконалення біткойна - номер 39). Докладніше про пропозиції щодо вдосконалення Bitcoin ви можете дізнатися з цієї статті Вікіпедії.
BIP39 – це не що інше, як просто набір із 2048 слів, вибраних таким чином, що перші 4 літери кожного слова є унікальними. Це правило стосується навіть слів із 3 букв.
Ця властивість полегшує їх запам’ятовування під час створення послідовності з кількох слів, яка є саме тим, чим є ваша фраза відновлення.
Друге обмеження – це вимога до останнього слова вашої послідовності. Це визначена конкретна контрольна сума усіма іншими елементами послідовності, і ви не можете вибрати це самостійно. Це саме причина, чому ми бачимо повідомлення про помилку, щоразу, коли ми намагаємося ввести випадково вибрані слова як фраза відновлення до нашого Ledger Nano. Зазвичай умова контрольної суми відповідає більше ніж одному слову; однак шанс знайти дійсний, просто вгадавши неймовірно малий. Кількість слів, які задовольняють умову контрольної суми, строго пов’язана із загальною кількістю вихідних слів. У випадку вихідного коду з 24 слів (найбезпечніший варіант) завжди є рівно 8 можливих слів, які можуть служити контрольною сумою. Таким чином, шанс випадково витягти дійсне з набору BIP39 із 2048 слів дорівнює рівно 8 у 2048 році, або лише 0,39%. Не дивно, що ви побачили повідомлення про помилку.
Тоді як ми можемо знайти належну контрольну суму для послідовності за власним вибором? Для прикладу візьмемо випадковий набір із 23 слів, які відповідають стандарту BIP39:
Кожне слово має індекс, який є числом в його алфавітному порядку. Важливо починати нумерацію з 0. Тоді кожен індекс має бути виражений у двійковому значенні. Оскільки список BIP39 містить 2048 елементів, індекс кожного слова має складатися з 11 біт. Таким чином ми знаходимо:
На наступному кроці ми об’єднуємо всі індекси, зберігаючи їх порядок вигляду. Це дає нам 253-бітну двійкову послідовність:
Отриманий результат ми доповнюємо додатковими 3 бітами на власний вибір.
Ви пам’ятаєте, як ми вже говорили, що 24 слівний код має рівно 8 можливих результатів контрольної суми?
Число 8 — це лише простий наслідок ціх 3 біт.
Усі 8 результатів, які ми отримаємо, просто вказавши тут 000, 001, 010, 011, 100, 101, 110 і 111.
Для цього прикладу ми вибираємо: 000.
Ми з’єднуємо його в кінці, що призводить до 256-бітного двійкового слова:
Наступним кроком є обчислення хешу SHA256 таких підготовлених двійкових даних.
Алгоритм SHA256 (алгоритм безпечного хешування, 256-бітний вихід) є невід’ємною частиною технології блокчейн.
Докладніше про SHA256 ви можете дізнатися зі статті Вікіпедії про алгоритм SHA-256.
У результаті цього обчислення ми отримуємо наступне шістнадцяткове слово:
Наступним кроком буде виділення перших 8 біт із результату вище. Таким чином ми беремо перші 2 шістнадцяткові символи - 27.
Вони відповідають:
Знову ми використовуємо ті ж 3 біти, які ми вибрали раніше. Цього разу ми приєднуємо їх до передньої частини вилученого двійкового рядка. Отже, отримуємо:
це двійкове значення 39. Це індекс BIP39 слова контрольної суми, яке ми намагаємося знайти. Не забувайте, що нумерація індексу починається з «0». Тож якщо ви використовуєте список слів BIP39 зі стандартною нумерацією, починаючи з «1», тоді фактичний індекс буде 40. Ми знаходимо відповідний індекс на Список BIP39 і ми отримуємо слово: agent І, нарешті, фраза відновлення з 24 слів, що містить 23 слова на власний вибір це:
Для решти 3-бітових комбінацій останнє слово контрольної суми:


