Эксперт «Лаборатории Касперского» подобрал ключ от биткоин-кошелька

Антивирусный эксперт Алексей Маланов рассказывает, как ему удалось досрочно завершить конкурс от blockchain.ru и забрать свой приз в 0,05 BTC.

Шестого февраля портал blockchain.ru объявил конкурс со следующими условиями:

  • Биткоины лежат на бумажном кошельке с адресом 17ipJUbstTuK747BFWzNPAijmgFUetHX1v
    Можете проверить баланс прямо здесь.
  • В течение месяца (с 6 февраля по 6 марта) в материалах на сайте blockchain.ru будут последовательно публиковаться части (по 4 символа) закрытого ключа от кошелька. Ваша задача: внимательно читать тексты и искать эти 52 знака. Как только соберёте приватный ключ – сможете вывести биткоины с кошелька!
  • Учитывайте, что одновременно с вами получить пароль могут ещё несколько участников. Поэтому на финальном этапе всё будет решать скорость. Кто первый импортирует бумажный кошелёк и переведёт с него биткоины на другой адрес – заберёт приз. Не умеете пользоваться бумажными кошельками – ничего страшного, у вас есть целый месяц, чтобы разобраться. Начать можете здесь.
  •  Победителя заранее просим связаться с нами через почту info@blockchain.ru (в теме письма напишите «Конкурс telegram»), вам будет предложено участие в спецпроекте.

Приз – 0.05 биткоина (~600$). Деньги неплохие, но, что важнее, – по сути за просто так.

По фразам «на финальном этапе будет решать скорость» и «вам будет предложено участие в спецпроекте» мне показалось, что авторам просто хочется найти программиста для решения какой-то своей практической задачи, связанной с ключами, а конкурс – всего лишь способ отобрать подходящего. Если была цель поощрить внимательных читателей, вполне сгодилась бы сумма и в 0.001 биткоина (~6-12$).

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

Алексей Маланов

Суть задачи

Биткоин построен на криптографии с открытым ключом. Есть секретный ключ, который знает только владелец кошелька. По нему можно вычислить публичный ключ, который в свою очередь можно свернуть в адрес кошелька.

Послать деньги на адрес может любой желающий, а вот чтобы потратить деньги, надо при помощи секретного ключа подписать транзакцию: «Передаю деньги со своего адреса на адрес Васи».

Секретный ключ выглядит так 5KDD4329bJzRNjJneUdC4Dpdw2U6RNsPuhoxA2saHX3gnf4Dg1H, это 51 символ. Авторы пообещали публиковать его в статьях на blockchain.ru по 4 символа в течение месяца.

Что надо делать? Конечно же поначалу можно ничего не делать и никуда не торопиться, а вот под конец надо написать программу и подобрать ключ. Пытаться собрать ключ вручную и ждать последние три символа – дело бесперспективное.

Техническая сторона вопроса

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

Описание формата представления секретного ключа для доступа к кошельку

Ключ, который мы должны отгадать (5KDD4329bJzRNjJneUdC4Dpdw2U6RNsPuhoxA2saHX3gnf4Dg1H), это закодированный в виде текста секрет длиной 32 байта. Но что особенно важно, последние 5 символов (4Dg1H) вообще не нужны при угадывании. Они используются для контроля остальной информации, чтобы человек случайно не ошибся при вводе адреса.

Забавно, что в криптовалюте Ethereum, которая появилась в 2015 году, спустя более 6 лет после создания биткоина, такого контроля адресов предусмотрено не было. Как результат, легко послать деньги на неправильный адрес.

Например, на такой адрес 0x0000000000000000000000000000000000000000 случайно напосылали более 7000 эфира и еще на полмиллиарда долларов всяких разных токенов.

В общем, команда Сатоши была внимательна к мелочам, грамотные парни.

Второй важный момент – ключ на самом деле длиной не 52 символа, как сказали организаторы, а 51. Дело в том, что он начинается с 5, а это однозначно говорит о том, что он в uncompressed формате. А это значит, что перебирать надо строку вида 5KDD4329bJzRNjJneUdC4Dpdw2U6RNsPuhoxA2sa111111xxxxx. Если дописать еще одну лишнюю единичку (52 символ), то все развалится, ничего не подберется.

Программа для подбора:

  • декодировать подсказку, получить часть секретного ключа
  • добавить единичку к секретному ключу
  • получить из секретного ключа адрес кошелька
  • если адрес не совпадает с искомым, перейти к шагу 2

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

Например, я выяснил, что ключ в виде 5KDD4329bJzRNjJneUdC4Dpdw2U6RNsPuhoxA2sa111111xxxxx подбирается где-то за час. А это значит, что последние символы A2sa необходимы. Ведь без них на подбор уйдет 11 миллионов (58*58*58*58) часов.

Ну, а еще – программа должна быть многопоточной. Во всех современных процессорах несколько ядер. Это значит, что программа будет работать в 4-8 раз быстрее, если вы загрузите их все.

Если бы награда была побольше, оправданно было бы даже арендовать мощности в облачном сервисе.

Нетехническая сторона вопроса

С технической стороной все понятно. Тут все зависит от тебя, да и времени вагон (очень благодарен организаторам за это). А вот в вопросе получения «подсказок» все зависит не от тебя, и я ожидал неординарных поворотов.

Например, 6 февраля, еще когда не было ни одной подсказки, внимательно читал вот эту статью, и увидел 4 латинских символа:

Это теперь смешно, но тогда я подумал, что Frok – одна из частей ключа, а ключ еще и не случайный, а придуманный авторами.

Потом выяснилось, что подсказка всегда в самом конце статьи, всегда жирным шрифтом, не больше одной в день. Но кто знает, а вдруг в конце организаторы специально по приколу проверят внимательность участников и спрячут ее в середине статьи? И все, проигрыш.

Еще оказалось, что на blockchain.ru публикуется очень много статей: десятки в день и пол тысячи в месяц. До конкурса я мониторил только телеграм-канал и не представлял, что материалов так много. Организаторы достигли цели – вовлеченность меня, как читателя, повысилась.

Что делал я, чтобы справиться с потоком статей. При помощи консольной утилиты wget я выкачивал весь сайт blockchain.ru и натравливал на файлы скрипт, который удалял все русские буквы.

Статья от 6 февраля после обработки

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

Самое сложное в конкурсе – закончить его третьего марта. Потому что четвертого я улетал и никак не мог участвовать дальше. Но по расчетам выходило замечательно: третьего получаем 40 символов, четвертого – 44, пятого – 48, шестого – последние три символа. Не получить 40 символов третьего нельзя, потому что иначе дней не хватит (конечно, при соблюдении условия «не больше одной подсказки в день»). А сорока как раз хватает для подбора. Третьего в субботу я регулярно проверял новые статьи, жадно искал ключ, но его все не было.

В итоге не обошлось без сюрпризов. В выходные на ресурсе выходит заметно меньше статей. Когда все статьи были опубликованы, а ключа не было, организаторы вставили его в пятничную вчерашнюю статью, а ее анонс опубликовали в телеграм-канале. Я мониторил субботние статьи и далеко не сразу заметил «прикол». Это могло стоить мне победы, но я вовремя заглянул в телеграм и не поленился пересмотреть статью, которую я читал накануне.

Заключение

Ну, а дальше дело техники: запускаем программу, нетерпеливо ждем, когда правильный ключ подберется (порядка часа), копируем его в кошелек Биткойна и выводим деньги. До того, как деньги доехали (это заняло два часа), я переживал – существует вероятность, что транзакция отменится или будет заменена другой, хотя и знал, что для этого нет никаких разумных оснований.

Спасибо организаторам. Требуем больше конкурсов, разных и интересных!

Автор статьи – Алексей Маланов, антивирусный эксперт Лаборатории Касперского.