Jump to content

Утилита восстановления повреждённых ключей формата WIF


Lenchik

Recommended Posts

Написал утилитку для восстановления приватных ключей формата WIF. Ключ этого формата имеет длина 51 символ. Состоит из символов алфавита base58 - 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz (Обратите внимание что отсутствуют некоторые буквы и цифра 0).

Ключ формата WIF начинается на 5 для BTC или на 6 для LTC.

Ключ может быть искажён при переписывании вручную. Может пострадать бумажка с записью ключа и ещё много разных ситуаций.

Методом перебора утилита добивается того что бы ключ подходил под хэш, или хэш под ключ.

Результат работы утилиты не гарантирует что это будет именно тот самый ключ, поэтому она не останавливает перебор найдя ключ.

То есть теоретически возможно нахождение нескольких ключей.

Недоверчивые могут запускать утилиту на компьютере изолированном от интернета. Утилита не примеряет ключ к блокчейну, она только добивается что бы ключ соответствовал хэш. 

PriKeyWIF.thumb.jpg.4475b882cc958471c43ac77dee8c5235.jpg

 

 

PriKeyWIF.zip

 

Адрес для помощи проекту.

BTC 3GmNvNHWnmGdcm26AaVVyENqM2K9YXm9MV

 

 

Edited by Lenchik
Link to comment
Share on other sites

1 час назад, NapsterNapster сказал:

было бы не плохо заглянуть исходник

Там нет ничего интересного. Хэш считают библиотеки MIT. Перебор вариантов только оригинальный. 

Здесь не выложить, объём большой за счёт библиотек от MIT.

Написал за несколько дней. Была просьба от одного участника этого форума восстановить приватный ключ зашифрованный вручную. Из исходных данных была только бумажка с ключом и фраза "каждый третий на три порядка вверх". Никакие перестановки и замены не приводили к результату.

Решили что в ключе есть ошибка, тем более один символ был "О", а такого символа в base58 нет. Написал утилиту для исправления ошибок. При двух исправленных символах она нашла один валидный ключ, при трёх, чуть больше десятка. Все адреса оказались пустыми, а договаривались на 10% от содержимого. 10% от ноля, это ноль, всё честно.

Код написан в индусском стиле  Индусский код — Lurkmore , такое даже стыдно выкладывать. 

 

@NapsterNapster проверить её очень просто. Онлайн генерируете ключ WIF. Меняете два символа в ключе на любые из алфавита base58. Скармливаете утилите и на выходе получаете снова оригинальный ключ. Можно и три символа, но будет долго, пару часов на среднем компьютере. Для проверки утилиты хватит и двух символов.

Скорость сильно не оптимизировал. Утилита работает в один поток. Не стал с мультипоточностью заморачиваться. Можно несколько экземпляров BAT запустить одновременно что бы загрузить многоядерный процессор. CUDA могу написать, а под OpenCL никогда не писал. Да и смысла большого нет её разгонять. Если сделать подбор четырёх символов, то она сотни валидных ключей подберёт. Причина в том что хэш в ключе не полный, первые четыре байта от двойного sha256, а под такое много чего можно подобрать. 

 

 

Link to comment
Share on other sites

@NapsterNapster Здесь ограничение в 9 мегабайт на прикреплённые файлы.

И зачем вам оно? В лучшем случае приделать сбоку бантик и выложить под своим именем, в худшем, приделать трояна и то же выложить. 

 

Link to comment
Share on other sites

  • 2 months later...

Добрый день! А вам не сложно будет переделать ее под адрес WIF начинающийся на  'L' и 'K'?

Link to comment
Share on other sites

3 минуты назад, ldb68 сказал:

А вам не сложно будет переделать ее под адрес WIF начинающийся на  'L' и 'K'?

https://github.com/Coding-Enthusiast/FinderOuter

Link to comment
Share on other sites

17 минут назад, ldb68 сказал:

Добрый день! А вам не сложно будет переделать ее под адрес WIF начинающийся на  'L' и 'K'?

Не сложно. Когда я писал, то не знал что такие ключи бывают. Можно вообще отключить эту проверку.

Первый символ ни на что не влияет и не участвует в вычислении контрольной суммы. То есть вы можете заменить свои L или K скажем на 5, найти ошибку в ключе, а потом заменить обратно на L или K.

Link to comment
Share on other sites

1 минуту назад, Lenchik сказал:

Не сложно. Когда я писал, то не знал что такие ключи бывают. Можно вообще отключить эту проверку.

Первый символ ни на что не влияет и не участвует в вычислении контрольной суммы. То есть вы можете заменить свои L или K скажем на 5, найти ошибку в ключе, а потом заменить обратно на L или K.

Понял, спасибо. Буду пробовать!

Link to comment
Share on other sites

2 часа назад, Lenchik сказал:

Когда я писал, то не знал что такие ключи бывают.

А когда писал?  В этом году?

2 часа назад, Lenchik сказал:

То есть вы можете заменить свои L или K скажем на 5, найти ошибку в ключе, а потом заменить обратно на L или K.

А ничо, что длина ключей разная? там 51 и 52 символа.

Link to comment
Share on other sites

@rammendo В этом году, после январских праздников. Писал чисто под одну задачу, ключ Litecoin исправить. Дня за три написал и несколько дней делал ввод, вывод и описание.

Я же написал что это для ключей формата WIF. Универсальную смысла нет писать. Под друге представление ключа проще отдельную утилиту написать.

Таким способом можно исправлять только ключи имеющие контрольную сумму (хэш). Если в ключе нет контрольной суммы, то и способ нужно другой, например примерять ключи к полной ноде.

Link to comment
Share on other sites

52 минуты назад, Lenchik сказал:

В этом году, после январских праздников.

 

4 часа назад, Lenchik сказал:

Когда я писал, то не знал что такие ключи бывают.

Такие ключи (5...) не используются с 2014 года. 

Link to comment
Share on other sites

5 часов назад, Lenchik сказал:

То есть вы можете заменить свои L или K скажем на 5, найти ошибку в ключе, а потом заменить обратно на L или K.

Было бы всё так просто, то ничего бы этого не было. Или было бы, но в первоначальном виде - в виде курсовой работы студента профильного техникума

Link to comment
Share on other sites

@romariogland L и К "сжатые" ключи. Вы хотя бы напишите зачем вам это?

Я писал утилиту конкретно для исправления ключа начинающегося на 6. Человек один попросил. Ошибку в ключе исправили.

Можно и для сжатых написать. Теоретически скорость подбора должна быть даже выше, так как один байт в сжатом ключе константа. 

Link to comment
Share on other sites

6 часов назад, Lenchik сказал:

Вы хотя бы напишите зачем вам это?

Мне это не нужно, я ничего не просил, я и сам в состоянии это сделать, только на py/php/c

Link to comment
Share on other sites

@romariogland На скриптовых языках не получится. Скорость будет очень маленькой. На С я пробовал. Невозможно из base58 в HEX ключ сконвертировать. Там надо весь ключ представить как одно целое число, а в С таких переменных нет. 

Link to comment
Share on other sites

6 часов назад, Lenchik сказал:

L и К "сжатые" ключи.

А что это значит? Не нашел в Гугле "сжатых" ключей Биткоин?

Link to comment
Share on other sites

16 минут назад, Lenchik сказал:

На скриптовых языках не получится

Всё ясно, ладно

16 минут назад, Lenchik сказал:

Невозможно из base58 в HEX ключ сконвертировать

Имел в виду плюсы - это раз, а во-вторых путь решения задачи явно не один

Edited by romariogland
Link to comment
Share on other sites

11 минут назад, rammendo сказал:

А что это значит? Не нашел в Гугле "сжатых" ключей Биткоин?

Я то откуда знаю. Один байт HEX - 01 добавили между ключом и хэшем и он у них почему стал сжатый. Я бы его так не назвал.

WIFC.thumb.jpg.1fb78b14944c89aa9f955177d212fda9.jpg

 

Но это даёт дополнительную возможность по валидации ключа. При переводе из base58 в hex меняются все байты и если после конвертации нет на своём месте этих 01, то можно хэш уже не проверять, что приведёт к существенному ускорению процесса. 

Link to comment
Share on other sites

2 минуты назад, Lenchik сказал:

Я то откуда знаю. Один байт HEX - 01 добавили между ключом и хэшем и он у них почему стал сжатый. Я бы его так не назвал.

Так это не ключ "сжатый", а адрес, он стал 148 байт, вместо 180 байт. Одну координату убрали. Нафиг она, если задана кривая эллипсов и есть одна координата.

Link to comment
Share on other sites

5 минут назад, Lenchik сказал:

и он у них почему стал сжатый. Я бы его так не назвал.

public key (uncompressed) = 04b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a87378ec38ff91d43e8c2092ebda601780485263da089465619e0358a5c1be7ac91f4
public key (compressed)   = 02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737

Что не так? По-моему, всё логично

Link to comment
Share on other sites

2 минуты назад, rammendo сказал:

Нафиг она, если задана кривая эллипсов и есть одна координата.

Только хотел написать об этом

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...