Биткоин. Крупнейшая по капитализации криптовалюта, существующая на протяжении всей истории существования рынка цифровых активов. Не будет преувеличением сказать и то, что именно эта криптографическая денежная единица, в свое время, и стала фактором, который спровоцировал энтузиастов со всего мира к созданию сначала своих собственных цифровых монет, а затем и разнотипных финансовых продуктов, которые и стали основой для формирования совершенно нового рынка. Рынка цифровых активов.
Первая криптовалюта стоит очень дорого. На момент написания данной статьи, один BTC торгуется в районе $60 000. И нет никаких причин полагать, что в будущем, крупнейший цифровой актив не достигнет отметок в $100 000 и более. Однако, данное утверждение останется верным только в том случае, если за это время, с биткоином ничего не случится. Например, если его не взломают.
Считается, что BTC это абсолютно надежная система, которая позволяет пользователям обмениваться выраженной в числовой форме реальной ценностью, без необходимости в услугах посредников, таких как, например, банки. Но что станет с крупнейшей криптовалютой, если кто-то из энтузиастов вдруг найдет способ распоряжаться средствами с кошельков других пользователей? Это выльется в огромные потери для ходлеров BTC. И в абсолютный крах всего рынка криптоактивов, в случае, если этот самый энтузиаст, вдруг решит поделиться своими исследованиями с миром. Что маловероятно...
Возможно ли взломать биткоин?
Одним из способов получить доступ к хранящимся на чужом кошельке биткоинам, считается компрометирование приватного ключа. Ведь именно он и является единственным доказательством того, что вы - владелец ваших сбережений. Зная ваш приватный ключ, любой злоумышленник может распоряжаться хранящимися на вашем кошельке средствами так, как ему вздумается. Не понадобятся ни логин, ни пароль от самого кошелька.
Однако, приватный ключ это строка из 64 знаков, при формировании которой используются только цифры от 0 до 9 и буквы от a до f, без учета регистра (hex формат). Если злоумышленник, каким-либо образом, не украдет ваш приватный ключ, то для того, чтобы подобрать его в ручную или с помощью программ у него уйдет неимоверно огромное количество времени и ресурсов, что делает данную операцию абсолютно невыгодной в практическом и финансово ресурсном плане. Всё дело в том, что количество возможных вариантов приватного ключа это число, которому, вероятнее всего, даже нет названия. 2 в 256 степени или же 10 с 77 нулями в конце. Даже используя огромное количество серверов, на выполнения этой операции уйдут долгие десятилетия, что делает взлом биткоина невозможным. Во всяком случае сегодня, с текущим уровнем технологического развития.
Золотая лихорадка. В поисках клада
Однако миллионы людей, каждый день продолжают попытки подобрать приватный ключ, баланс кошелька от которого не будет равен нулю. И некоторым это даже удается. Правда делают они это не с целью совершить преступление, а пытаясь обнаружить, так называемый “клад”.
Дело в том, что когда биткоин появился - он ничего не стоил. Энтузиасты майнили его даже на слабых ноутбуках, просто для того, чтобы разобраться в принципах работы данной сети. Многие из них, впоследствии, потеряли доступы к своим биткоин-кошелькам, что привело к тому, что на сегодняшний день, из более чем 18 млн добытых BTC, утерянными считаются около 20%.
На скриншоте выше приведены примеры биткоин-адресов в форматах Hash160 и Base58 (самый распространенный формат), созданных в 2009 году и на которых хранятся суммы от 50 BTC. На сегодняшний день, это более чем $3 млн. И таких кошельков существуют сотни тысяч. Вы можете легко найти их, воспользовавшись блокчейн обозревателем от blockchain.com и просто вводя в поисковую строку различные числа. Сервис покажет вам информацию относящуюся к указанному вами блоку, среди которой будет и адрес на который была выполнена транзакция, в рамках которой, майнер получил награду за блок.
На примере выше показана информация по блоку # 789, в рамках которого, мы находим транзакцию об отправке 50 BTC на адрес 16c44JhQegiNQmZevfQWscS4SbT1tZ8BGd. Данный кошелек является неактивным с 2009 года, что позволяет нам сделать вывод о том, что мы имеем дело с потерянными кем-то биткоинами.
Подобных потерянных кошельков очень много. Однако, диапазон возможных приватных ключей, которыми можно их открыть - во много раз больше. Стремясь увеличить свои шансы на нахождение правильного приватного ключа, люди объединяются в команды, пулы и даже создают специализированные сервисы, в рамках которых, пользователи могут использовать мощности своих устройств для того, чтобы найти утерянные BTC.
Однако, я не могу ручаться за честность подобного рода программного обеспечения и гарантировать вам, что данные продукты не настроены так, чтобы оповещать владельцев ПО о найденных клиентами биткоинах, оставляя при этом самих искателей в неведении. Так что упоминать названия подобных сервисов я не стану. Скажу лишь то, что они предлагают пользователям использовать свой софт для того, чтобы генерировать приватные ключи, пропускать их через череду алгоритмов в конце которых получится соотносящийся с приватником биткоин-адрес и проверять его баланс посредством API таких сервисов как blockchain.com.
КПД от такого рода перебирания вариантов настолько низкий, что существует неплохая вероятность того, что если вы прямо сейчас начнете использовать подобные сервисы, то возможно, что успеха добьются лишь продолжившие ваше дело внуки или правнуки. Да и то, нет никакой гарантии того, что труды нескольких поколений вашей семьи не будут вознаграждены доступами к кошельку на котором осталась лишь пыль из сатош, эквивалентных $50 - $100.
Впрочем, низкий шанс выигрыша в подобного рода лотерее, никого не останавливает. В конечном итоге, это не стоит денег и ничто не мешает вам включить перебор приватных ключей в одной вкладке браузера, а во второй - спокойно наслаждаться тихим вечером за просмотром сериала.
На сегодняшний день, подбор приватных ключей является единственным возможным способом получения доступа к утерянным BTC. Это, в свою очередь, становится причиной зарождения на рынке цифровых активов настоящей “золотой лихорадки”, в рамках которой, “старатели” используют не кирки и лопаты, а мощности своих устройств.
Бэкдор от Сатоши Накамото
Но далеко не все готовы потратить жизнь на попытки отыскать клад, посредством перебора практически бесконечного количества приватных ключей. Существую и те, кто уверены в том, что биткоин имеет бэкдор, воспользовавшись которым, первую криптовалюту будет возможно взломать. Правда это или нет - судить сложно. Однако, если брать в расчет то, что даже алгоритмы хеширования имеют “срок годности”, выраженный во времени, по прошествию которого, появляются все более мощные устройства, способные решать ранее невыполнимые задачи - не исключено, что технологий 2008-2009 годов было недостаточно для того, чтобы навсегда обезопасить биткоин от посягательств со стороны хакеров.
Другое дело, что работа над биткоином продолжается и сейчас. Она ведется независимыми специалистами со всего мира. Разработчики пишут обновления для кода BTC, а уже решением поддерживающих работоспособность сети нод - выносится вердикт о разрешении/запрете нововведения. Таким образом, лично я считаю, что поиск бэкдора в коде самого биткоина - пустая трата времени. Но я не владею навыками программирования, так что на экспертность в данном вопросе не претендую. Можете высказать свои мысли по данному поводу в комментариях.
Впрочем, помимо копаний в коде, есть и иной способ, который может помочь в получении доступа к нужному приватному ключу. Можно сосредоточиться на самом .
Дело в том, что биткоин-адрес это то, что получается из приватного ключа после применения череды прописанных в коде старейшей криптовалюты изменений.
Для начала разберемся с терминологией. Помимо адреса и приватного ключа, существует также и публичный ключ. Он получается в результате пропуска приватника через ECDSA. Это алгоритм с открытым ключом для создания цифровой подписи, аналогичный по своему строению DSA, но определённый, в отличие от него, не над кольцом целых чисел, а в группе точек эллиптической кривой. Понимаю, что звучит это довольно сложно, так что предлагаю вам воспринимать его, как особый алгоритм кодирования информации, не забегая дальше.
Публичный ключ это строка весом в 65 байт (130 символов). По 64 символа ( из них 32 байта) приходятся на координаты X и Y на эллиптической кривой (ECDSA). И 1 байт мы добавляем в начале (0х04). Это идентификатор сети. В итоге мы получим строку, по строению похожую на это:
04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
2. В сети огромное количество сервисов предлагающих пользователям хеширование данных. Находим любой сервис на котором можно использовать алгоритм SHA-256 и пропускаем через него, упомянутое в пункте выше значение (убедитесь что вы используете конвертацию значений hex, а не обычную строку. Иначе результат будет другим). Получится это:
261c1eb21fc4708c6acbe1cfc6d4565652e9e768b620782898936b93000a6c02
3. Далее - снова на просторы всемирной паутины. Ищем сервис для хеширования по алгоритму RIPEMD-160. Берем результат из пункта 2 и пропускаем его через сервис. Результат:
62e907b15cbf27d5425399ebf6f0fb50ebb88f18
4. Перед полученным после RIPEMD-160 результатом добавляем новый байт-идентификатор. Для основной сети биткоина это 0х00. Значит перед указанной выше строкой мы добавляем “00”.
0062e907b15cbf27d5425399ebf6f0fb50ebb88f18
5. Открываем вкладку с сервисом для хеширования в SHA-256 и пропускаем через него полученный в 4 шаге результат:
9b90f16de7f0e580c07735dac15ffe23e2f8f8e103914e509aa91913ffdb9fb6
6. Берем полученный результат и хешируем его SHA-256 еще раз. Получаем:
c29b7d937e3049e279391e62fdf00c12def7444013ddf6215808d10e9f2d5996
7. Теперь нам необходимо выделить контрольную сумму. Для этого, мы берем первые 4 байта (8 символов) из полученного в 6 шаге хеша:
c29b7d93
8. Берем полученный результат из прошлого пункта и возвращаемся к результату полученному в 4 шаге. Нам необходимо вставить контрольную сумму в конец полученной в 4 пункте строки. Получится 25-байтовый двоичный биткоин-адрес:
0062e907b15cbf27d5425399ebf6f0fb50ebb88f18c29b7d93
9. Находим сервис позволяющий кодировать информацию в формате base58 и пропускаем через него результат 8 пункта. Получаем традиционный биткоин адрес:
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
Вуаля. Вы собственноручно создали биткоин-адрес и даже имеете для него приватный ключ.
Я обратил ваше внимание на процесс создания биткоин-адреса для того, чтобы вы сами поняли, что в теории, имея адрес кошелька с BTC - вы можете провести описанную выше процедуру в обратном порядке и получить содержащий миллионы долларов приватный ключ. Но только в теории…
Взламываем биткоин-кошелек
Вернемся к кошельку с 50 BTC, о котором я уже упоминал выше. Его адрес 16c44JhQegiNQmZevfQWscS4SbT1tZ8BGd. Это строка в формате base58 и для того, чтобы получить приватный ключ - нам необходимо отменить для неё все упомянутые выше преобразования. Для начала нам нужно форматировать адрес в 25-байтовый двоичный формат. Воспользуемся сервисом для декодирования base58. Только убедитесь что вы именно “декодируете” и делаете это с форматом HEX, а не с текстом.
В результате мы получаем 003d79bd4ae1f562f8d2827ee689b91252f077e3f9d77e4fea.
Далее, нам необходимо убрать последние 4 байта (8 символов) из получившегося выше выражения. Так мы избавляемся от контрольной суммы. Остается 003d79bd4ae1f562f8d2827ee689b91252f077e3f9.
Следующим шагом мы выкинем из полученного выше результата идентификатор основной сети биткоина. Это “00”.
3d79bd4ae1f562f8d2827ee689b91252f077e3f9
Теперь, если вы обратите ваше внимание на пункт 3, в той части статьи, где мы разбирали процесс создания биткоин адреса, то вы увидите, что мы с вами получили строку в формате RIPEMD-160. И до заветных биткоинов нам осталось только раскодировать её в SHA256, а затем, в полученном результате - обратить влияние сначала SHA256, а затем и ECDSA (эллиптической кривой). Так мы получим приватный ключ от кошелька с 50 BTC.
Проблема только в том, что функции хеширования RIPEMD-160 и SHA256 считаются необратимыми. И даже если вы разберетесь в том как они работают и попробуете провести все процессы в обратном порядке - вы с высокой долей вероятности допустите ошибку, так как даже в SHA256, до получения конечного результата, каждый символ преобразуется более 60 раз. И любая ошибка приведет к тому, что итоговый ответ полностью изменится, оставив вас без награды.
Таким образом, можно с уверенностью заявить, что получить приватный ключ из адреса биткоин-кошелька, теоретически возможно, но практически - невыполнимо.
Однако, даже здесь, я не до конца честен с вами. Конечно, RIPEMD-160, SHA256 и ECDSA - необратимые преобразования, однако, вариант для их подбора, все-таки существует.
Дело в том, что когда мы разбирали метод получения биткоин-адреса из приватного ключа, мы прошли все шаги этого нехитрого процесса. Существуют даже сервисы, в рамках которых, вы можете ввести рандомно придуманный приватный ключ ( при условии что он отвечает требования формата) и наблюдать всю цепочку преобразований до получения конечного результата.
Таким образом, при наличии достаточно мощного “железа” и некоторых познаний в программировании, вы можете легко написать скрипт, в рамках которого будут происходить следующие метаморфозы:
Нам нужно получить строку в SHA256, которая будет соответствовать имеющемуся у нас значению RIPEMD-160. Значит мы пишем скрипт, по условию которого, мы получаем строку длинной в 64 символа состоящую из чисел от 0 до 9 и букв от a до f. Важно описать процессы так, чтобы генерируемая у нас рандомная строка рассматривалась IDE (среда разработки) как тип hex (шестнадцатеричный формат), а не string (строка). Потому что одно и тоже значение в каждом из этих форматов, при хешировании, выдает разный результат.
2. Как только вы добились того, чтобы ваш код выдавал вам результат в нужном формате, нужно добавить следующую логику: Наш результат (строка в hex, похожая на SHA256) должен быть хеширован через RIPEMD-160. Для этого можно использовать библиотеку crypto.js (да, да. Я колдовал в Java Script. Познания у меня в нем слабые, но он кажется мне проще для понимания, на фоне альтернатив. Вероятно. потому, что когда-то я баловался написанием смарт-контрактов на Solidity).
3. Итак, мы имеем случайно генерирующуюся строку, отвечающую требования SHA256, которую мы тут же хешируем в RIPEMD-160. Далее, нам необходимо прописать сравнение, полученного нами результата с уже имеющимся у нас значением в RIPEMD-160. Возьмем 3d79bd4ae1f562f8d2827ee689b91252f077e3f9 из примера со взломом.
4. Важно прописать логику кода так, чтобы помимо значений в RIPEMD-160, IDE также сообщало нам полученное подбором значение в SHA256, чтобы мы знали с чем работать дальше. Автоматизируем код. Нам нужно, чтобы рандомная псевдо-SHA256 строка в hex генерировалась, хешировалась и сравнивалась с нужным нам значением до тех пор, пока не будет получено нужное значение.
Конечно, многие скажут, что вариантов такого подбора может быть великое множество и это ничем не проще, чем просто подбирать приватник в ручную. Но за счет того, что нам нужно выполнять не всю цепочку преобразования до биткоин адреса и отсутствия необходимости запрашивать баланс, обращаясь к blockchain.com - все процессы должны будут проходить быстрее. Более того, количество вариантов перебора можно сократить, прописав для подбора определенный диапазон. Конкретно я, в примере, специально говорю о рандомной генерации псевдо-SHA256, потому как значения типа 0000…00001 и так далее - нам не нужны. Рандомизация позволит их исключить.
Итак, идем далее.
5. Теперь, если вам повезло и вы получили подходящий к вашему RIPEMD-160 псевдоSHA-256, нам остается немного переделать описанный выше скрипт. Но теперь, нам нужно генерировать строку в hex (от 0 до 9 и от a до f) из 130 символов, которую мы сразу же будем хешировать в SHA256. Принцип такой же, что и вышеописанном скрипте. Ищем и сравниваем до тех пор, пока не получим значение равное нашему псевдо-SHA256. Результат должен начинаться с “04”, так что заранее корректируем логику кода под это требование. Получаем приватный ключ биткоин адреса, пропущенный через ECDSA. Это строка, значение которой сводится к формуле 04+х+у (04 + 64 символа соответствующие координате Х + 64 символа соответствующие координате У).
6. Читаем про то, как происходит хеширование приватного ключа через ECDSA и подстраивает под это логику нашего третьего и финального скрипта. В этот раз, мы будет рандомно генерировать приватный ключ в формате hex (64 символа) и каждый из полученных вариантов пропускать через ECDSA, пока не получим строку равную нашему псевдо- ECDSA. Если логика прописана правильно, то через такой подбор, мы получим приватный ключ, соответствующий RIPEMD-160 от кошелька рассматриваемого нами в примере взлома. На котором, точно есть 50 биткоинов (50 BTC х примерно $60 000 = около $3млн).
Конечно, логику всех этих преобразований можно упростить. Но, для понимания принципа действий, я посчитал, что лучше будет описать метод более развернуто. И разумеется, что такой подбор, также может длиться достаточно долго. Однако, как я и говорил выше - за счет уменьшения количества необходимых преобразований и отсутствия необходимости сверяться с балансами через блокчейн - количество обрабатываемых вариантов подбора в секунду будет выше, чем если вы будете просто генерировать рандомный приватник и проходить всю цепочку преобразований до биткоин адреса, чтобы проверить его баланс. Более того, имея определенные знания о “пазлах”, можно значительно сократить диапазон поиска.
Буду благодарен за примеры описанного мною выше скрипта, особенно на JS (но не обязательно). Было бы интересно взглянуть на реализацию данного решения от различных гуру программирования. Комментарии к вашим услугам.
Ну, а если код это не ваше - не опускайте руки. Подобрать приватный ключ с помощью различных сервисов или написанного кем-то программного обеспечения - все-таки возможно. И некоторые энтузиасты даже доказывают это на собственном примере. Думаю, вы как и я, неоднократно сталкивались с новостными статьями, в рамках которых рассказывают о том, как со считающихся потерянными кошельков начинают снимать BTC. Кому-то просто везет. Однако, это даже хорошо. Ведь пока вероятность нахождения остается такой мизерной как сейчас, вы с вашим ноутбуком, имеете шансы на успех, сопоставимые с шансами тех, кто бросает на данное дело мощности целых “ферм”. В конечном итоге, успеха добьется не тот, кто сможет проверить больше всех кошельков, а тот, кто сможет увеличить собственные шансы на успех, правильно подобрав диапазон поиска.
Кто ищет - тот всегда найдет.
Первая криптовалюта стоит очень дорого. На момент написания данной статьи, один BTC торгуется в районе $60 000. И нет никаких причин полагать, что в будущем, крупнейший цифровой актив не достигнет отметок в $100 000 и более. Однако, данное утверждение останется верным только в том случае, если за это время, с биткоином ничего не случится. Например, если его не взломают.
Считается, что BTC это абсолютно надежная система, которая позволяет пользователям обмениваться выраженной в числовой форме реальной ценностью, без необходимости в услугах посредников, таких как, например, банки. Но что станет с крупнейшей криптовалютой, если кто-то из энтузиастов вдруг найдет способ распоряжаться средствами с кошельков других пользователей? Это выльется в огромные потери для ходлеров BTC. И в абсолютный крах всего рынка криптоактивов, в случае, если этот самый энтузиаст, вдруг решит поделиться своими исследованиями с миром. Что маловероятно...
Возможно ли взломать биткоин?
Одним из способов получить доступ к хранящимся на чужом кошельке биткоинам, считается компрометирование приватного ключа. Ведь именно он и является единственным доказательством того, что вы - владелец ваших сбережений. Зная ваш приватный ключ, любой злоумышленник может распоряжаться хранящимися на вашем кошельке средствами так, как ему вздумается. Не понадобятся ни логин, ни пароль от самого кошелька.
Однако, приватный ключ это строка из 64 знаков, при формировании которой используются только цифры от 0 до 9 и буквы от a до f, без учета регистра (hex формат). Если злоумышленник, каким-либо образом, не украдет ваш приватный ключ, то для того, чтобы подобрать его в ручную или с помощью программ у него уйдет неимоверно огромное количество времени и ресурсов, что делает данную операцию абсолютно невыгодной в практическом и финансово ресурсном плане. Всё дело в том, что количество возможных вариантов приватного ключа это число, которому, вероятнее всего, даже нет названия. 2 в 256 степени или же 10 с 77 нулями в конце. Даже используя огромное количество серверов, на выполнения этой операции уйдут долгие десятилетия, что делает взлом биткоина невозможным. Во всяком случае сегодня, с текущим уровнем технологического развития.
Золотая лихорадка. В поисках клада
Однако миллионы людей, каждый день продолжают попытки подобрать приватный ключ, баланс кошелька от которого не будет равен нулю. И некоторым это даже удается. Правда делают они это не с целью совершить преступление, а пытаясь обнаружить, так называемый “клад”.
Дело в том, что когда биткоин появился - он ничего не стоил. Энтузиасты майнили его даже на слабых ноутбуках, просто для того, чтобы разобраться в принципах работы данной сети. Многие из них, впоследствии, потеряли доступы к своим биткоин-кошелькам, что привело к тому, что на сегодняшний день, из более чем 18 млн добытых BTC, утерянными считаются около 20%.
На скриншоте выше приведены примеры биткоин-адресов в форматах Hash160 и Base58 (самый распространенный формат), созданных в 2009 году и на которых хранятся суммы от 50 BTC. На сегодняшний день, это более чем $3 млн. И таких кошельков существуют сотни тысяч. Вы можете легко найти их, воспользовавшись блокчейн обозревателем от blockchain.com и просто вводя в поисковую строку различные числа. Сервис покажет вам информацию относящуюся к указанному вами блоку, среди которой будет и адрес на который была выполнена транзакция, в рамках которой, майнер получил награду за блок.
На примере выше показана информация по блоку # 789, в рамках которого, мы находим транзакцию об отправке 50 BTC на адрес 16c44JhQegiNQmZevfQWscS4SbT1tZ8BGd. Данный кошелек является неактивным с 2009 года, что позволяет нам сделать вывод о том, что мы имеем дело с потерянными кем-то биткоинами.
Подобных потерянных кошельков очень много. Однако, диапазон возможных приватных ключей, которыми можно их открыть - во много раз больше. Стремясь увеличить свои шансы на нахождение правильного приватного ключа, люди объединяются в команды, пулы и даже создают специализированные сервисы, в рамках которых, пользователи могут использовать мощности своих устройств для того, чтобы найти утерянные BTC.
Однако, я не могу ручаться за честность подобного рода программного обеспечения и гарантировать вам, что данные продукты не настроены так, чтобы оповещать владельцев ПО о найденных клиентами биткоинах, оставляя при этом самих искателей в неведении. Так что упоминать названия подобных сервисов я не стану. Скажу лишь то, что они предлагают пользователям использовать свой софт для того, чтобы генерировать приватные ключи, пропускать их через череду алгоритмов в конце которых получится соотносящийся с приватником биткоин-адрес и проверять его баланс посредством API таких сервисов как blockchain.com.
КПД от такого рода перебирания вариантов настолько низкий, что существует неплохая вероятность того, что если вы прямо сейчас начнете использовать подобные сервисы, то возможно, что успеха добьются лишь продолжившие ваше дело внуки или правнуки. Да и то, нет никакой гарантии того, что труды нескольких поколений вашей семьи не будут вознаграждены доступами к кошельку на котором осталась лишь пыль из сатош, эквивалентных $50 - $100.
Впрочем, низкий шанс выигрыша в подобного рода лотерее, никого не останавливает. В конечном итоге, это не стоит денег и ничто не мешает вам включить перебор приватных ключей в одной вкладке браузера, а во второй - спокойно наслаждаться тихим вечером за просмотром сериала.
На сегодняшний день, подбор приватных ключей является единственным возможным способом получения доступа к утерянным BTC. Это, в свою очередь, становится причиной зарождения на рынке цифровых активов настоящей “золотой лихорадки”, в рамках которой, “старатели” используют не кирки и лопаты, а мощности своих устройств.
Бэкдор от Сатоши Накамото
Но далеко не все готовы потратить жизнь на попытки отыскать клад, посредством перебора практически бесконечного количества приватных ключей. Существую и те, кто уверены в том, что биткоин имеет бэкдор, воспользовавшись которым, первую криптовалюту будет возможно взломать. Правда это или нет - судить сложно. Однако, если брать в расчет то, что даже алгоритмы хеширования имеют “срок годности”, выраженный во времени, по прошествию которого, появляются все более мощные устройства, способные решать ранее невыполнимые задачи - не исключено, что технологий 2008-2009 годов было недостаточно для того, чтобы навсегда обезопасить биткоин от посягательств со стороны хакеров.
Другое дело, что работа над биткоином продолжается и сейчас. Она ведется независимыми специалистами со всего мира. Разработчики пишут обновления для кода BTC, а уже решением поддерживающих работоспособность сети нод - выносится вердикт о разрешении/запрете нововведения. Таким образом, лично я считаю, что поиск бэкдора в коде самого биткоина - пустая трата времени. Но я не владею навыками программирования, так что на экспертность в данном вопросе не претендую. Можете высказать свои мысли по данному поводу в комментариях.
Впрочем, помимо копаний в коде, есть и иной способ, который может помочь в получении доступа к нужному приватному ключу. Можно сосредоточиться на самом .
Дело в том, что биткоин-адрес это то, что получается из приватного ключа после применения череды прописанных в коде старейшей криптовалюты изменений.
Для начала разберемся с терминологией. Помимо адреса и приватного ключа, существует также и публичный ключ. Он получается в результате пропуска приватника через ECDSA. Это алгоритм с открытым ключом для создания цифровой подписи, аналогичный по своему строению DSA, но определённый, в отличие от него, не над кольцом целых чисел, а в группе точек эллиптической кривой. Понимаю, что звучит это довольно сложно, так что предлагаю вам воспринимать его, как особый алгоритм кодирования информации, не забегая дальше.
Публичный ключ это строка весом в 65 байт (130 символов). По 64 символа ( из них 32 байта) приходятся на координаты X и Y на эллиптической кривой (ECDSA). И 1 байт мы добавляем в начале (0х04). Это идентификатор сети. В итоге мы получим строку, по строению похожую на это:
04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
2. В сети огромное количество сервисов предлагающих пользователям хеширование данных. Находим любой сервис на котором можно использовать алгоритм SHA-256 и пропускаем через него, упомянутое в пункте выше значение (убедитесь что вы используете конвертацию значений hex, а не обычную строку. Иначе результат будет другим). Получится это:
261c1eb21fc4708c6acbe1cfc6d4565652e9e768b620782898936b93000a6c02
3. Далее - снова на просторы всемирной паутины. Ищем сервис для хеширования по алгоритму RIPEMD-160. Берем результат из пункта 2 и пропускаем его через сервис. Результат:
62e907b15cbf27d5425399ebf6f0fb50ebb88f18
4. Перед полученным после RIPEMD-160 результатом добавляем новый байт-идентификатор. Для основной сети биткоина это 0х00. Значит перед указанной выше строкой мы добавляем “00”.
0062e907b15cbf27d5425399ebf6f0fb50ebb88f18
5. Открываем вкладку с сервисом для хеширования в SHA-256 и пропускаем через него полученный в 4 шаге результат:
9b90f16de7f0e580c07735dac15ffe23e2f8f8e103914e509aa91913ffdb9fb6
6. Берем полученный результат и хешируем его SHA-256 еще раз. Получаем:
c29b7d937e3049e279391e62fdf00c12def7444013ddf6215808d10e9f2d5996
7. Теперь нам необходимо выделить контрольную сумму. Для этого, мы берем первые 4 байта (8 символов) из полученного в 6 шаге хеша:
c29b7d93
8. Берем полученный результат из прошлого пункта и возвращаемся к результату полученному в 4 шаге. Нам необходимо вставить контрольную сумму в конец полученной в 4 пункте строки. Получится 25-байтовый двоичный биткоин-адрес:
0062e907b15cbf27d5425399ebf6f0fb50ebb88f18c29b7d93
9. Находим сервис позволяющий кодировать информацию в формате base58 и пропускаем через него результат 8 пункта. Получаем традиционный биткоин адрес:
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
Вуаля. Вы собственноручно создали биткоин-адрес и даже имеете для него приватный ключ.
Я обратил ваше внимание на процесс создания биткоин-адреса для того, чтобы вы сами поняли, что в теории, имея адрес кошелька с BTC - вы можете провести описанную выше процедуру в обратном порядке и получить содержащий миллионы долларов приватный ключ. Но только в теории…
Взламываем биткоин-кошелек
Вернемся к кошельку с 50 BTC, о котором я уже упоминал выше. Его адрес 16c44JhQegiNQmZevfQWscS4SbT1tZ8BGd. Это строка в формате base58 и для того, чтобы получить приватный ключ - нам необходимо отменить для неё все упомянутые выше преобразования. Для начала нам нужно форматировать адрес в 25-байтовый двоичный формат. Воспользуемся сервисом для декодирования base58. Только убедитесь что вы именно “декодируете” и делаете это с форматом HEX, а не с текстом.
В результате мы получаем 003d79bd4ae1f562f8d2827ee689b91252f077e3f9d77e4fea.
Далее, нам необходимо убрать последние 4 байта (8 символов) из получившегося выше выражения. Так мы избавляемся от контрольной суммы. Остается 003d79bd4ae1f562f8d2827ee689b91252f077e3f9.
Следующим шагом мы выкинем из полученного выше результата идентификатор основной сети биткоина. Это “00”.
3d79bd4ae1f562f8d2827ee689b91252f077e3f9
Теперь, если вы обратите ваше внимание на пункт 3, в той части статьи, где мы разбирали процесс создания биткоин адреса, то вы увидите, что мы с вами получили строку в формате RIPEMD-160. И до заветных биткоинов нам осталось только раскодировать её в SHA256, а затем, в полученном результате - обратить влияние сначала SHA256, а затем и ECDSA (эллиптической кривой). Так мы получим приватный ключ от кошелька с 50 BTC.
Проблема только в том, что функции хеширования RIPEMD-160 и SHA256 считаются необратимыми. И даже если вы разберетесь в том как они работают и попробуете провести все процессы в обратном порядке - вы с высокой долей вероятности допустите ошибку, так как даже в SHA256, до получения конечного результата, каждый символ преобразуется более 60 раз. И любая ошибка приведет к тому, что итоговый ответ полностью изменится, оставив вас без награды.
Таким образом, можно с уверенностью заявить, что получить приватный ключ из адреса биткоин-кошелька, теоретически возможно, но практически - невыполнимо.
Однако, даже здесь, я не до конца честен с вами. Конечно, RIPEMD-160, SHA256 и ECDSA - необратимые преобразования, однако, вариант для их подбора, все-таки существует.
Дело в том, что когда мы разбирали метод получения биткоин-адреса из приватного ключа, мы прошли все шаги этого нехитрого процесса. Существуют даже сервисы, в рамках которых, вы можете ввести рандомно придуманный приватный ключ ( при условии что он отвечает требования формата) и наблюдать всю цепочку преобразований до получения конечного результата.
Таким образом, при наличии достаточно мощного “железа” и некоторых познаний в программировании, вы можете легко написать скрипт, в рамках которого будут происходить следующие метаморфозы:
Нам нужно получить строку в SHA256, которая будет соответствовать имеющемуся у нас значению RIPEMD-160. Значит мы пишем скрипт, по условию которого, мы получаем строку длинной в 64 символа состоящую из чисел от 0 до 9 и букв от a до f. Важно описать процессы так, чтобы генерируемая у нас рандомная строка рассматривалась IDE (среда разработки) как тип hex (шестнадцатеричный формат), а не string (строка). Потому что одно и тоже значение в каждом из этих форматов, при хешировании, выдает разный результат.
2. Как только вы добились того, чтобы ваш код выдавал вам результат в нужном формате, нужно добавить следующую логику: Наш результат (строка в hex, похожая на SHA256) должен быть хеширован через RIPEMD-160. Для этого можно использовать библиотеку crypto.js (да, да. Я колдовал в Java Script. Познания у меня в нем слабые, но он кажется мне проще для понимания, на фоне альтернатив. Вероятно. потому, что когда-то я баловался написанием смарт-контрактов на Solidity).
3. Итак, мы имеем случайно генерирующуюся строку, отвечающую требования SHA256, которую мы тут же хешируем в RIPEMD-160. Далее, нам необходимо прописать сравнение, полученного нами результата с уже имеющимся у нас значением в RIPEMD-160. Возьмем 3d79bd4ae1f562f8d2827ee689b91252f077e3f9 из примера со взломом.
4. Важно прописать логику кода так, чтобы помимо значений в RIPEMD-160, IDE также сообщало нам полученное подбором значение в SHA256, чтобы мы знали с чем работать дальше. Автоматизируем код. Нам нужно, чтобы рандомная псевдо-SHA256 строка в hex генерировалась, хешировалась и сравнивалась с нужным нам значением до тех пор, пока не будет получено нужное значение.
Конечно, многие скажут, что вариантов такого подбора может быть великое множество и это ничем не проще, чем просто подбирать приватник в ручную. Но за счет того, что нам нужно выполнять не всю цепочку преобразования до биткоин адреса и отсутствия необходимости запрашивать баланс, обращаясь к blockchain.com - все процессы должны будут проходить быстрее. Более того, количество вариантов перебора можно сократить, прописав для подбора определенный диапазон. Конкретно я, в примере, специально говорю о рандомной генерации псевдо-SHA256, потому как значения типа 0000…00001 и так далее - нам не нужны. Рандомизация позволит их исключить.
Итак, идем далее.
5. Теперь, если вам повезло и вы получили подходящий к вашему RIPEMD-160 псевдоSHA-256, нам остается немного переделать описанный выше скрипт. Но теперь, нам нужно генерировать строку в hex (от 0 до 9 и от a до f) из 130 символов, которую мы сразу же будем хешировать в SHA256. Принцип такой же, что и вышеописанном скрипте. Ищем и сравниваем до тех пор, пока не получим значение равное нашему псевдо-SHA256. Результат должен начинаться с “04”, так что заранее корректируем логику кода под это требование. Получаем приватный ключ биткоин адреса, пропущенный через ECDSA. Это строка, значение которой сводится к формуле 04+х+у (04 + 64 символа соответствующие координате Х + 64 символа соответствующие координате У).
6. Читаем про то, как происходит хеширование приватного ключа через ECDSA и подстраивает под это логику нашего третьего и финального скрипта. В этот раз, мы будет рандомно генерировать приватный ключ в формате hex (64 символа) и каждый из полученных вариантов пропускать через ECDSA, пока не получим строку равную нашему псевдо- ECDSA. Если логика прописана правильно, то через такой подбор, мы получим приватный ключ, соответствующий RIPEMD-160 от кошелька рассматриваемого нами в примере взлома. На котором, точно есть 50 биткоинов (50 BTC х примерно $60 000 = около $3млн).
Конечно, логику всех этих преобразований можно упростить. Но, для понимания принципа действий, я посчитал, что лучше будет описать метод более развернуто. И разумеется, что такой подбор, также может длиться достаточно долго. Однако, как я и говорил выше - за счет уменьшения количества необходимых преобразований и отсутствия необходимости сверяться с балансами через блокчейн - количество обрабатываемых вариантов подбора в секунду будет выше, чем если вы будете просто генерировать рандомный приватник и проходить всю цепочку преобразований до биткоин адреса, чтобы проверить его баланс. Более того, имея определенные знания о “пазлах”, можно значительно сократить диапазон поиска.
Буду благодарен за примеры описанного мною выше скрипта, особенно на JS (но не обязательно). Было бы интересно взглянуть на реализацию данного решения от различных гуру программирования. Комментарии к вашим услугам.
Ну, а если код это не ваше - не опускайте руки. Подобрать приватный ключ с помощью различных сервисов или написанного кем-то программного обеспечения - все-таки возможно. И некоторые энтузиасты даже доказывают это на собственном примере. Думаю, вы как и я, неоднократно сталкивались с новостными статьями, в рамках которых рассказывают о том, как со считающихся потерянными кошельков начинают снимать BTC. Кому-то просто везет. Однако, это даже хорошо. Ведь пока вероятность нахождения остается такой мизерной как сейчас, вы с вашим ноутбуком, имеете шансы на успех, сопоставимые с шансами тех, кто бросает на данное дело мощности целых “ферм”. В конечном итоге, успеха добьется не тот, кто сможет проверить больше всех кошельков, а тот, кто сможет увеличить собственные шансы на успех, правильно подобрав диапазон поиска.
Кто ищет - тот всегда найдет.