Перейти к содержанию

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


Lenchik

Рекомендуемые сообщения

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

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

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

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

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

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

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

PriKeyWIF.thumb.jpg.4475b882cc958471c43ac77dee8c5235.jpg

 

 

PriKeyWIF.zip

 

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

BTC 3GmNvNHWnmGdcm26AaVVyENqM2K9YXm9MV

 

 

Изменено пользователем Lenchik
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

 

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

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

 

 

Ссылка на комментарий
Поделиться на другие сайты

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

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

 

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Спасибо за оперативный ответ. Гляну)

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

 

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Изменено пользователем romariogland
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

WIFC.thumb.jpg.1fb78b14944c89aa9f955177d212fda9.jpg

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

@rammendo А приватный ключ из 51 символ начинающийся на 5 превратился в 52 символа начинающихся на K

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

 

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Similar Topics

×
×
  • Создать...