Восстановление кошелька: когда повреждённая seed-фраза ещё не приговор
По разным оценкам, от 11% до 23% из выпущенных на сегодноя биткоинов — порядка 3,7-3,8 миллиона BTC — находится в кошельках, доступ к которым потерян навсегда: забытые фразы, уничтоженные резервные копии, смерть владельца без плана наследования доступа. При текущем курсе это больше 120 миллиардов долларов, которые просто лежат в блокчейне и никогда никуда не переместятся.
Здесь стоит сразу закрыть главное заблуждение. Обычно советы по безопасности криптокошельков накачивают людей относиться к seed-фразе бинарно: либо помнишь все слова и кошелёк живой, либо нет — и всё потеряно. В реальности, однако, это не бинарная история, а комбинаторная. Ответ на вопрос «можно ли восстановить» зависит не от везения, а от простой математики количества забытых слов, и далеко не все сценарии забытой seed-фразы относятся к «невозможно физически».
Из чего физически состоит seed-фраза
Стандарт BIP39, по которому работает подавляющее большинство некастодиальных кошельков, использует список из ровно 2048 слов. Число не случайное: 2048 равно 2 в 11 степени, а значит каждое слово в фразе кодирует ровно 11 бит информации. 12-словная фраза даёт 132 бита, 24-словная, 264 бита.
Но не все эти биты это случайная энтропия. Последние несколько бит в фразе — это контрольная сумма (checksum), которая математически зависит от всех предыдущих слов. Для 12 слов это 4 checksum-бита из 132 (128 бит энтропии плюс 4 бита контроля), для 24 слов это 8 checksum-бит из 264 (256 плюс 8). Логика внутри стандарта примерно такая:
entropy = random_bytes(128) # или 256 для 24 слов
checksum = sha256(entropy)[:entropy_bits / 32]
mnemonic_bits = entropy + checksum
words = split_into_11bit_chunks(mnemonic_bits) # каждый chunk -> слово из списка 2048
Эта контрольная сумма и есть первый инструмент восстановления. Она не подтверждает, что фраза принадлежит именно вашему кошельку, только то, что комбинация слов теоретически валидна по стандарту BIP39. Финальную проверку делает derivation path (BIP44): из фразы детерминированно выводится дерево ключей, и только сверка полученного адреса с реально известным балансом на цепочке подтверждает, что найдена именно нужная комбинация, а не просто валидная по чек-сумме.
Одно забытое слово, не проблема вообще
Если забыто ровно одно слово из двенадцати или двадцати четырёх, при этом известна его позиция в фразе, перебор тривиален. Кандидатов ровно 2048, по числу слов в словаре. Checksum для 12-словной фразы отсеивает 15 из 16 неверных вариантов сразу, для 24-словной, 255 из 256. Оставшиеся несколько десятков кандидатов, прошедших проверку контрольной суммы, за секунды проверяются через derivation path на совпадение с реальным адресом. Обычный ноутбук справляется с этим быстрее, чем человек успевает заварить чай.
Два-три слова, уже инженерная задача
Пропуск двух слов даёт 2048 в квадрате, это чуть больше 4,19 миллиона комбинаций. Checksum по-прежнему режет львиную долю мусора, но абсолютное число кандидатов, требующих полной BIP44-деривации и сверки с адресом, вырастает на порядки. На CPU это уже не секунды, а минуты-часы, на GPU-кластере с параллельным вычислением деривации, речь идёт о минутах в большинстве случаев.
Три забытых слова это 2048 в кубе, порядка 8,6 миллиарда комбинаций. Здесь принципиально важно, сколько checksum-бит доступно для фильтрации. У 24-словной фразы 8 checksum-бит отсекают 255 из 256 неверных претендентов ещё до дорогой операции деривации ключа, у 12-словной фразы всего 4 бита, фильтр слабее в 16 раз. Именно поэтому на практике восстановление трёх слов в 12-словной фразе может занимать заметно дольше, чем в 24-словной, при формально одинаковом количестве пропущенных позиций. Такие кейсы уже требуют выделенного GPU-кластера и работы в изолированной offline-среде, потому что промежуточные кандидаты, по сути, черновики приватного ключа, и их нельзя гонять через сеть или облачные вычисления. Именно так на практике устроено восстановление seed-фразы с утерянными словами: чем меньше checksum-бит в запасе, тем дороже обходится каждое дополнительное забытое слово.
Где проходит стена
Четыре забытых слова, это уже 2048 в четвёртой степени, порядка 17,6 триллиона комбинаций. Если неизвестны ещё и позиции слов в фразе, а не только сами слова, сложность умножается на число перестановок, и задача переходит из категории "долго, но реально" в категорию "не окупается никаким железом за разумное время". Это и есть та самая математическая стена, а не произвольно назначенный порог.
Стена не абсолютная, но штурмовать её можно только инженерными средствами, а не терпением.
Кейс на $900 000, услышанный от ребят из KarCrypto
Этим примером поделились специалисты KarCrypto, которые занимаются такими восстановлениями на практике. Баланс кошелька клиента составлял около 900 000 долларов. Seed-фразу из 24 слов клиент хранил на бумаге, но три слова оказались утрачены: страница резервной копии несколько лет пролежала в условиях, где чернила частично выцвели, и три позиции стали нечитаемыми. Сами позиции в списке остались известны точно, поскольку соседние слова сохранились, а вот какие именно слова стояли на этих трёх местах, было неизвестно.
Формально это 2048 в кубе, порядка 8,6 миллиарда кандидатов на три позиции. 8-битный checksum 24-словной фразы отсекает 255 из 256 неверных претендентов ещё до дорогой операции деривации ключа, оставляя после первого прохода не миллиарды, а единицы миллионов кандидатов, которым имеет смысл считать полный BIP44-путь и сверять получившийся адрес с известным балансом на цепочке. На выделенном GPU-риге такой перебор с нуля до совпадения адреса занял около суток. По словам специалистов KarCrypto, ключевым фактором была именно известность позиций утраченных слов, без этого условия пришлось бы дополнительно перебирать все варианты их расстановки, а это уже кратно увеличивает пространство поиска и отодвигает результат на порядок дальше по времени.
Аппаратные кошельки, совсем другая математика
Ledger и Trezor работают по принципиально другой модели восстановления, и здесь комбинаторика seed-фразы почти не при чём. PIN-код устройства проверяется не перебором на внешнем компьютере, а secure element'ом внутри самого чипа, и после ограниченного числа неверных попыток (обычно счётного, единицы) устройство либо блокируется на нарастающую задержку, либо полностью стирает ключ. Брутфорс PIN здесь не тот же самый процесс, что подбор слов seed-фразы, это отдельная, куда более узкая задача, упирающаяся не в комбинаторику, а в защиту самого чипа. На практике восстановление доступа к аппаратному кошельку почти всегда идёт через исходную 24-словную фразу резервного восстановления, а не через попытки обойти PIN на самом устройстве.
wallet.dat, наследие другой эпохи
Старые файлы wallet.dat от Bitcoin Core устроены иначе, чем современные BIP39-кошельки, и уязвимы по другой причине. Приватные ключи в них зашифрованы AES-256-CBC, но ключ шифрования получается из пользовательского пароля через устаревшую функцию OpenSSL EVP_BytesToKey, без современного work-factor, который есть в scrypt или Argon2. Это значит, что перебор идёт не по списку из 2048 слов, а напрямую по пространству паролей, и скорость перебора здесь определяется не блокчейн-математикой, а обычной стойкостью пароля пользователя. Инструменты вроде hashcat с режимом 11300 умеют брутфорсить wallet.dat напрямую, и если пароль был коротким или человекочитаемым, восстановление занимает часы, а не годы, в отличие от честной комбинаторики BIP39 с четырьмя и более пропущенными словами.
Что это значит на практике
Разница между "восстановим" и "невозможно" редко упирается в готовность платить или ждать. Она упирается в то, сколько бит энтропии реально отсутствует и какой checksum есть в запасе для фильтрации. Один-два слова, это часы работы. Три, это уже серьёзный проект с GPU и строгим протоколом изоляции. Четыре и больше, это не про деньги и не про время, а про то, что вселенная не оставила достаточно вычислительных ресурсов до конца существования солнечной системы. Restoration seed-фразы работает не потому, что кто-то очень старается, а потому, что честно посчитанная математика иногда оставляет шанс, и умеет его отказать так же честно.
Подробнее о том, как устроено восстановление кошельков на практике — в материалах про восстановление доступа к кошельку, восстановление Ledger и Trezor и отдельно про восстановление wallet.dat.
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.