SLIP-39 — стандарт резервного копирования кошелька с помощью нескольких списков слов, называемых долями для восстановления. Заранее выбирают, сколько разных долей потребуется. Например, в схеме две из трёх можно потерять одну и всё равно восстановить кошелёк. Одной доли недостаточно. Стандарт SatoshiLabs использует Shamir’s Secret Sharing, математический метод разделения секрета. Его доли не получаются простым переписыванием обычной Seed Phrase по BIP 39.
Анна выбирает копию две из трёх. Кошелёк — приложение или устройство для получения и отправки биткоинов. Кошелёк создаёт три разные доли, а любые две позволяют восстановление; этот минимум называют порогом. Две фотографии одной доли по-прежнему считаются одной долей. Простая схема использует одну группу. SLIP-39 поддерживает и более сложные правила: например, 2 из 3 групп, в каждой нужны 2 из 3 долей. Двух долей из группы A и двух из B достаточно. Трёх из A и одной из B — нет, поскольку полной является лишь группа A. Важна раскладка, а не только количество листов. [1] [6]
Каждый список содержит другие данные и сведения для их правильного объединения. SLIP-39 использует постоянный словарь из 1024 английских слов. Слова копии не переводят, даже если интерфейс кошелька русский. Секрет длиной 128 бит даёт доли по 20 слов, а 256 бит — по 33. Бит — базовая единица данных, а не ещё одно слово для записи. Доля также содержит обозначение набора, группы и своей позиции, нужные пороги и настройки шифрования. Восстановление проверяет согласованность этих сведений и различие долей. Произвольные списки одинаковой длины нельзя просто смешать. [1]
Анна может использовать passphrase — дополнительный пароль собственного выбора. Достаточное число долей его не заменит, а правильный набор сам не распознает опечатку: другая passphrase даст другой главный секрет, то есть другой кошелёк. Поэтому результат сравнивают с известными адресами, не ограничиваясь сообщением о корректной копии. Без passphrase вход пустой. SLIP-39 допускает печатные символы ASCII 32–126: базовые латинские символы без диакритики, включая пробел. Это правило данного стандарта, а не всех кошельков. Passphrase — не PIN для разблокировки устройства. [1]
Seed Phrase по BIP 39 создаётся иначе и использует другой словарь. Распределение её слов между листами не превращает их в доли SLIP-39. Чтобы сохранить тот же кошелёк, преобразование должно сохранить seed, секретные входные данные дерева ключей BIP 32, и правильную Derivation Path — путь к используемым ключам. Недостаточно перекодировать исходную энтропию, случайные данные до создания слов. BIP 39 получает из слов и passphrase seed длиной 512 бит; его прямая копия по SLIP-39 даёт доли по 59 слов. Преобразование одного кошелька также не переносит автоматически другие кошельки, открываемые иными passphrase. Конкретную поддерживаемую процедуру нужно проверить заранее. [1] [3] [2]
Совместимая копия с признаком extendable позволяет изменить разделение, сохранив те же кошельки. Trezor описывает таким образом переход от одной доли к нескольким. Но замена листов не изменила секрет Анны: достаточная старая комбинация работает и дальше. Старые и новые доли не смешивают. Технически значение признака 1 исключает идентификатор набора из вспомогательных входных данных шифрования, называемых salt. Тот же encrypted master secret (EMS), зашифрованный главный секрет, тогда можно заново разделить с новым идентификатором, не зная passphrase. Это не исправляет последствия утечки старой пригодной копии. [1] [4]
Приватный ключ — секретное числовое значение, с помощью которого кошелёк создаёт цифровую подпись, разрешающую потратить средства. После восстановления кошелёк Анны может подписывать обычным образом. Владельцы долей не обязаны одобрять каждую оплату: SLIP-39 восстанавливает один секрет, тогда как Multisig требует нескольких подписей согласно условиям расходования. Один пожар может уничтожить три доли в одной квартире. Размещение должно затруднять и общую потерю, и сбор нужной комбинации злоумышленником; более сложная схема одновременно усложняет восстановление. Проверку проводят поддерживаемым способом на доверенном устройстве. Эталонная библиотека python-shamir-mnemonic нужна разработчикам для проверки совместимости на публичных тестовых примерах, а не для обработки вашей настоящей копии. Она прямо предупреждает, что недостаточно защищает секреты. [1] [4] [5] [6]
Для кошелька BIP 32 главный секрет — входной seed, а не уже вычисленный расширенный приватный корень дерева ключей. Сначала seed шифруют и лишь затем разделяют полученный EMS. Шифрование использует четыре раунда конструкции Feistel; каждый содержит PBKDF2-HMAC-SHA256 с 2500×2^e повторениями, где сохранённый показатель e задаёт вычислительную сложность. Это точно определённая обработка пароля, а не добавление случайных слов. Разделение выполняется побайтово в GF(256), математической структуре с 256 значениями. Полином хранит секрет в f(255); при пороге не ниже 2 в f(254) находится проверочное значение — digest. [1] [2]
Последние три слова доли образуют контрольную сумму RS1024. Она гарантированно обнаруживает ошибку, затрагивающую не более трёх слов, но не является подписью создателя копии или доказательством собственности. Стандарт не рекомендует автоматическое исправление: программа может получить корректные, но другие слова. При объединении дополнительный 32-битовый digest помогает выявить неправильный набор. У него есть и теоретическое следствие: тот, кому не хватает одной доли до порога, может полным перебором исключить некоторые возможные секреты. Поэтому математическое утверждение, что ниже порога не раскрывается никакой информации, требует оговорки. Это не означает лёгкого взлома; это объясняет требование достаточно сильного исходного секрета. [1]
Для полной картины прочитайте эту статью вместе с Shamir Secret Sharing, BIP 39, Trezor, Multisig, HD Wallet, Seed Phrase. На эту статью также ссылаются BIP 39, Trezor, Павол «Stick» Руснак, Shamir Secret Sharing.