Как решить задачу Всемирного дня пи ОКХ Приватный ключ (с полным кодом)

Автор:Лидия., Создано: 2023-03-16 17:19:08, Обновлено: 2023-08-01 11:35:36

img

Как решить задачу Всемирного дня пи ОКХ Приватный ключ (с полным кодом)

Я увидел, что в группе есть некоторые магнаты, которые говорят, что OKX проводит мистическое мероприятие Всемирного дня пи, с темой "Исследование, никогда не заканчивается".

Как ветеран программирования, когда я увидел новости, я улыбнулся и открыл свой MacBook Pro, и без дальнейших задержек, давайте начнем!

Анализ

Официально на картинке 61 бит ключа, а часть окружности перекрывается, как мы все знаем, длина частного ключа 32 байта, преобразованный в шестеркутник 64 бита плюс префикс 0x, в общей сложности 66 бит, уже 61 бит, для первого взгляда, 0X на первой строке в графике, очевидно, не Пи, это начало префикса частного ключа, то есть около 5 бит (0123456789ABCDEF).

Давайте просто воспользуемся инструментом для Mac для обострения цвета:

img

Таким образом, Mac может распознать символы на картинке автоматически.

3.141592653589793230X1D64338
А694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B3
81284
• Exploration, 
038
Never Ending
027
493
05%
0128
4756482337867831731712019091
47D9E56692346034861045432664
8213393607743749141273724587
006606315588174881BEEA209628
2925409192744436789259036001

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

img = '''
3.141592653589793230X1D64338
A694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B32594081284811174502841027
0193**2*D2299964462294895493
0381960EFC8103F9365933446128
4756482337867831731712019091
47D9E56692346034861045432664
82133936077A3749141273724587
006606315588174881BEEA209628
2925409192744436789259036001
'''
# True Pi
real='''
3.14159265358979323846264338
3279502884197169399375105820
9749445923078164062862089986
2803482534211706798214808651
3282306647093844609550582231
7253594081284811174502841027
0193852110555964462294895493
0381964428810975665933446128
4756482337867831652712019091
4564856692346034861045432664
8213393607260249141273724587
0066063155881748815209209628
2925409171536436789259036001
'''

items = img.strip().split('\n')
diffStr = ''
for pos, line in enumerate(real.strip().split('\n')):
    for i, c in enumerate(line):
        imgLine = list(items[pos])
        if line[i] == imgLine[i]:
            imgLine[i] = '_'
        else:
            diffStr += imgLine[i]
        items[pos] = ''.join(imgLine)
print('\n'.join(items))
print(diffStr, 'Len:', len(diffStr))

Результаты реализации:

Copy code
___________________0X1D_____
A694________________________
____25E1____________________
____3DB0________4099________
___________ED42_____________
8B32________________________
____**_*D2299_______________
______0EFC___3F93___________
________________731_________
_7D9E_______________________
__________7A37______________
__________________BEEA______
________92744_______________
0X1DA69425E13DB04099ED428B32***D22990EFC3F937317D9E7A37BEEA92744 Len: 64

Есть еще три, и есть только три неопределенных. Попробуйте удалить их, потому что остальные 61 бит в порядке после исключения, оставляя только наиболее определенную разницу. Наконец, префикс следующий:

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

Далее мы будем использовать Python и использовать силу для сканирования баланса на цепочке OK. Мы можем сравнить, какой частный ключ имеет баланс. На самом деле, мы также можем выбрать публичный ключ с первым переводом 314 USDT, что быстрее. Увидев информацию на официальном сайте сказал, что мы можем проверить баланс непосредственно, если есть газ, код немного беспорядочен.

import sys
import web3,time,logging
from eth_account import Account
from web3 import Web3
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
w3 = Web3(Web3.HTTPProvider("https://exchainrpc.okex.org"))
logging.info(w3.clientVersion)
found = None

def get_balance_gas(key):
    global found
    _counter += 1
    address = Account.from_key(key).address
    logging.info('fetch address %s %s' % (found, address))
    while True:
        try:
            balance = w3.eth.get_balance(address)
            break
        except:
            logging.warning(traceback.format_exc())
            time.sleep(1)
            continue
    if balance != 0:
        found = key
        raise BaseException('Found balance: %s %s' % (address, balance))
    return balance

from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=50)
keys = []
prefix = '1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744'
# It doesn't matter how to optimize the algorithm. Run the secret key against the clock.
ch = '0123456789ABCDEF'
for a in range(0, 16):
    for b in range(0, 16):
        for c in range(0, 16):
            for d in range(0, 16):
                for e in range(0, 16):
                    keys.append("0x"+prefix+ch[a]+ch[b]+ch[c]+ch[d]+ch[e])
print('all keys:', len(keys))
tasks = [None for t in keys]
for idx, key in enumerate(keys):
    tasks[idx] = executor.submit(get_balance_gas, key)
for t in tasks:
    t.result()
    

Мы можем видеть, что это занимает 1048576 итераций, но это намного быстрее с многопоточным, запуская его на одном из моих серверов.

2023-03-15 00:20:19,491 exchain-v1.6.8.5
all keys: 1048576
2023-03-15 00:20:20,372 fetch address None 0xc20C41f06F2428a0FD84ef03Ec6960992F5f8016
2023-03-15 00:20:20,473 fetch address None 0xcFa87ee54bc1c14c09a3AB3f41640bBab5C5480a
2023-03-15 00:20:20,483 fetch address None 0x126E922652f8B276F231D0eCA94d98685a26a45D
The following is omitted...

Беспокойное ожидание, плохие новости пришли, и не было никаких результатов до того, как стратегия вышла.

Путь извивается по горным хребтам.

Я не думаю, я не могу понять, я начал смотреть на обсуждение в Твиттере, и я обнаружил, что все и я пришли к тем же шагам, но странное то, что никто не сказал, что расшифровка успешна, и официальный не объявил правильные первые 61 бит, затем странный ответ привлек мое внимание, потому что есть разницаD2299в середине, я уверена, но он выглядит ужасно уверенно.

img

Он также сказал, что его тщательно проверили. не важно. рискни. в любом случае, это пустая трата электричества. С позицией попытки, я нашел несколько других людей, которые сказали, что они нашли 61-бит. Префиксы, найденные в разделе комментариев, собраны, код только что пересечен, базовый код не изменился, и он не будет вставляться снова и снова.

prefixs =[
'1DA69425E13DB04099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B320D2290EFC3F937317D9E7A37BEEA92744',
'1DA694255E3DB040990ED428B3208890EFC3F937317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B3202299EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB01099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744',
]

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

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

Здесь D229, но на картинке явно D2299, и 731 сопровождается 7, здесь два, но на самом деле, это правильные 61 бит, как он сам рассчитал это неизвестно, невероятно любопытно, но я не сомневаюсь в моей собственной операции, я видел один из комментариев сказал, что официальный клиентский сервис сказал, что Пи имеет другую версию, это был я, кто был невежественным, с тем, что я узнал и текущее человеческое понимание понимания Вселенной, окружность этого иррационального числа может представлять бесконечность Вселенной, его дробная часть никогда не повторяется или не заканчивается, вы можете интерпретировать его как UUID Вселенной, в которой вы находитесь, если есть другие версии, вероятно, из параллельных миров.

Код конвертации валюты Web3

Наконец, это код для передачи бонуса, на этот раз, я использую платформу FMZ Web3 напрямую, установить адрес цепочки на OKC, частный ключ добавлен в обмен случайным образом, а затем две строки будут выполнены, выполните его в режиме инструмента отладки напрямую.

img

Доказательство

Адрес расшифрованного открытого ключа

>>> from eth_account import Account
>>> Account.from_key('0x1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155').address
'0x0bd08825e05e540C9508961a32E58D14da47275A'

Посмотрите на ссылку:https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a

TX после того, как меня возглавил:https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c

Мы видим, что адрес получателя:

0x25f0a126be95f437ee71d7c4de725567c5f6c731

img

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

https://www.okx.com/cn/explorer/okc/tx/0xc32b5e299064456af3eb67c34a3b153f74a1bd18a31429052e3e3c5614bcdb6e

Адрес черной дыры:

0x0000000000000000005757572e464d5a2e434f4d

Этот адрес чёрной дыры содержит URL, декодированный как:

~ % python -c 'print(bytes.fromhex("0000000000000000005757572e464d5a2e434f4d"))'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00WWW.FMZ.COM'

Постскрипт

Это конец истории, и, оглядываясь назад, я благодарен за знания, которые я накопил за эти годы, иначе я бы не смог раскрыть их так быстро, и меня бы победили другие. Я уверена, что в официальной схеме была ошибка, но в любом случае, мне повезло разгадать ответ до того, как он был обнародован, и я надеюсь, что OKX будет более строгим в следующий раз, когда они проведут подобную деятельность.


Связанные

Больше