На написание данной программы автора вдохновил проект "Large Bitcoin Collider" https://lbc.cryptoguru.org целью которого позиционируется поиск коллизий хеша ripemd160 (hash 160), являющегося основой для вычисления адреса bitcoin кошелька. Т.е. предполагается, что существует по крайней мере 2^96 различных закрытых ключей, которые будут иметь одинаковый ripemd160 хеш и, соответственно, один bitcoin адрес.
Данное программноге обеспечение разработано как инструмент изучения аспектов безопасности применения эллиптических кривых на практике. Программа выполняет перебор закрытых ключей, вычисляет открытый ключ и на его основе хеш ripemd160, ищет вычисленный хеш в списке хешей существующих bitcoin адресов. Если будет найдено совпадение хешей, это означает что найден закрытый ключ к одному из указанных bitcoin адресов.
-
Для начала потребуется создать файл со списком хешей ripemd160 интересуемых bitcoin адресов в бинарном формате. Т.е. это файл, в котором подряд друг за другом записаны хеши интересуемых адресов в бинарном формате (20 байт на хеш). К данному проекту прилагается файл с хешами bitcoin адресов (файл bitcoin.bin).
-
Далее, следует запустить программу с указанием созданного файла хешей в качестве параметра (о параметрах запуска смотрите соответствующий раздел).
-
Если начальный закрытый ключ не задан, то он генерируется случайным образом. Из закрытого ключа вычисляется открытый ключ, а из него в свою очередь вычисляется хеш ripemd160 (более детально о вычислении bitcoin адреса из закрытого ключа можно почитать тут: https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses), полученный хеш ищется в списке интересуемых хешей (если совпадение найдено, значит закрытый ключ найден, информация о находке будет выведена на экран и записана в файл found.txt в пвпку с программой), далее закрытый ключ инкрементируется на единицу и процесс повторяется.
-b обязательный параметр, указывающий программе путь к файлу со списком хешей ripemd160 в бинарном формате.
Пример: ./oclexplorer -b ./bitcoin.bin говорит о том, что следует использовать список хешей из файла bitcoin.bin
-k в параметре можно задать закрытый ключ (32-х байтное число в HEX формате), с которого начнутся вычисления хешей.
Если закрытый ключ не задан, то его значение будет сгенерировано случайным образом.
Пример: ./oclexplorer -b ./bitcoin.bin -k 1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF
-u если указан данный параметр, то закрытый ключ будет инкрементироваться до бесконечности,
в противном случае каждый раз после инкрементации 4 байт (4,294,967,296) значение закрытого ключа будет перегенерировано и задано случайным образом.
-p ID платформы. По-умолчанию задано как 0. Обычно этот параметр никогда не используется.
Платформа OpenCL состоит из хоста соединенного с устройствами, поддерживающими OpenCL.
-d ID устройства в выбранной пратформе, которое следует использовать для вычислений. По-умолчанию задано как 0.
Данный параметр используется, если на хосте установлено несколько устройств, поддерживающих OpenCL, и требуется конкретизировать, на каком именно устройстве выполнять вычисления.
Пример: ./oclexplorer -b ./bitcoin.bin -d 0
-g в параметре задается размер вычислительной матрицы (cols)x(rows) (числа в DEC формате). Данные значения вычисляются автоматически, исходя из данных GPU.
Вы можете поэксперементировать с этими значениями для улучшения производительности.
Пример: ./oclexplorer -b ./bitcoin.bin -g 1024x512
-i в параметре задается размер очереди модулярной инверсии чисел (число в DEC формате, всегда должно быть степерью числа 2).
Данное значение вычисляется автоматически, исходя из данных GPU.
Вы можете поэксперементировать с этим значением для улучшения производительности.
Пример: ./oclexplorer -b ./bitcoin.bin -g 1024x512 -i 256
-f Имя файла OpenCL скрипта, если параметр не задан, то по-умолчанию используется файл "gpu.cl"
Удобно использовать, если Вы хотите поэксперентировать с измененными OpenCL скриптами.
Пример: ./oclexplorer -f ./test.cl
Проведем синтетический тест, который более наглядно покажет работу программы.
Предположим, нас интересует несколько кошельков:
Адрес: 1testBq2oGSeE3WVfi1MUbJZbUSWwEktC
Private key: 6AA3789CFE067047480EED275D4A017B812D19AE6A4B82105E0B7DCEAF64A1B5
Public key: 0446C360263B1794E429E7D672A878B5083C37D6BA177BFB68405EED3DB01804A210BDFD925C8E2CD16C054C3919C6F0889376E96EDC6B2BAF5D06D8F139601268
RIPEMD-160: 09C4D5193EE73DE349FB8237CC83D14ED47DE115
Адрес: 13htk4yTWRp6NF86X2usfbv45nXijN99fw
Private key: 4C9FC687F5604F80F224BAC08999006E6967D5071331C121F503D8352556D61C
Public key: 045C6D700D71FD80E75AA4965DFB3B3398062B03DA419379F95F5C9DBF5E9AD8C2BD9FE30F4C46B24ADAB8CBEB2F4AC51002971EB45E7086822E14BC362BAAAACC
RIPEMD-160: 1DAC152238E7A162FB6B8C8D34CEEE2DAE1328B9
Сохраним хеши RIPEMD-160 в бинарном формате в файле "test1.bin"
Программу запускаем со следующими параметрами: ./oclexplorer -b ./test1.bin -k 6AA3789CFE067047480EED275D4A017B812D19AE6A4B82105E0B7DCEAF000000 -u
Через некоторое время работы программы, будет найдено совпадение вычисляемого хеша с одним из хешей, сохраненных в файле "test1.bin"
Результат поиска будет выведен на экран и сохранен в файл "found.txt"
++++++++++++++++++++++++++++++++++++++++++++++++++
TIME: 2018-01-25 16:03:42
PRIV: 6aa3789cfe067047480eed275d4a017b812d19ae6a4b82105e0b7dceaf64a1b5
PUBL: 0446c360263b1794e429e7d672a878b5083c37d6ba177bfb68405eed3db01804a210bdfd925c8e2cd16c054c3919c6f0889376e96edc6b2baf5d06d8f139601268
HASH: 09c4d5193ee73de349fb8237cc83d14ed47de115
ADDR: 1testBq2oGSeE3WVfi1MUbJZbUSWwEktC
SALT: 6aa3789cfe067047480eed275d4a017b812d19ae6a4b82105e0b7dceaf400000
OFST: 2400692
GPUH: 09c4d5193ee73de349fb8237cc83d14ed47de115
++++++++++++++++++++++++++++++++++++++++++++++++++
Расшифровка результата:
++++++++++++++++++++++++++++++++++++++++++++++++++
TIME: Дата и время нахождения
PRIV: Найденный приватный ключ
PUBL: Публичный ключ
HASH: Хеш bitcoin адреса в формате RIPEMD-160
ADDR: Bitcoin адрес
SALT: Приватный ключ, от которого начались вычисления
OFST: Дельта между найденным и начальным приватными ключами
GPUH: Хеш bitcoin адреса RIPEMD-160, вычисленный на GPU, всегда должен быть равен HASH
++++++++++++++++++++++++++++++++++++++++++++++++++
Работоспособность тестировалась на ОС Gentoo, Linux Mint, Debian. Тестирование проводилось на видеокартах: Nvidia GTX 230, Nvidia GT 730, Nvidia GTX 1060, Nvidia GTX 1080 ti, Radeon RX 570. Для работы требуются установленные библиотеки OpenCL и OpenSSL с включенной поддержкой эллиптических кривых.
Автор не несет ответственность за последствия, вызванные использованием Вами данного программного обеспечения. Помните, что нахождение закрытого ключа bitcoin кошелька и присвоение находящихся на нем средств в зависимости от вашей юрисдикции может считаться кражей и поэтому является незаконным.
Если Вас заинтересовал данный софт, но Вам нужно его модифицировать или написать аналогичный, автор всегда открыт к сотрудничеству, почта для связи: [email protected]
Если данное программное обеспечение помогло Вам, буду рад вашей благодарности:
Bitcoin кошелек: 1svtY22Rc9GngcUPBH9UEoowb2hhbsuPo
Yandex.деньги: 410014854164402