How to Solve the World Pi Day OKX Private Key Puzzle Award (dengan kod lengkap)

Penulis:Lydia, Dicipta: 2023-03-16 17:19:08, Dikemas kini: 2023-08-01 11:35:36

img

How to Solve the World Pi Day OKX Private Key Puzzle Award (dengan kod lengkap)

Saya melihat beberapa Tycoon dalam kumpulan itu mengatakan bahawa OKX mengadakan Acara Misteri Hari Pi Dunia, dengan tema Penjelajahan, Tidak Pernah Berakhir.

Sebagai seorang pengaturcara veteran, apabila saya melihat berita, saya tersenyum dan membuka MacBook Pro saya, dan tanpa sebarang lagi, mari kita mulakan!

Analisis

Secara rasmi, terdapat 61 bit kunci dalam gambar ini dan sebahagian daripada keliling yang bertindih, seperti yang kita semua tahu, panjang kunci peribadi adalah 32 bait, ditukar kepada hex adalah 64 bit ditambah awalan 0x, sejumlah 66 bit, sudah ada 61 bit, untuk pandangan pertama, 0X pada baris pertama dalam carta jelas bukan Pi, ia adalah permulaan awalan kunci peribadi, maka terdapat kira-kira 5 bit (0123456789ABCDEF).

Mari kita gunakan alat Mac untuk mengasah warna dengan mudah:

img

Dengan cara ini, Mac boleh mengenali aksara pada gambar secara automatik.

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

Ia tidak boleh digunakan secara langsung. Mari kita betulkannya secara manual. yang tidak disahkan yang dilindungi oleh gambar ditandakan dengan *. Tidak pasti. Mari kita bincangkannya kemudian. Yang lain yang disekat oleh angka boleh dinilai dengan memerhatikan bentuk strok fon lain. Pada masa ini, kita menggunakan Python untuk mengira perbezaan antara keduanya, dan menggunakan _ untuk yang sama dan hanya menunjukkan yang berbeza.

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))

Hasil pelaksanaan adalah seperti berikut:

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

Terdapat tiga lagi, dan hanya ada tiga yang tidak pasti. Cuba hilangkan mereka, kerana 61 bit yang lain tidak apa-apa selepas pengecualian, hanya meninggalkan perbezaan yang paling pasti. Akhirnya awalan adalah seperti berikut:

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

Seterusnya, kita akan menggunakan Python dan menggunakan kekuatan untuk merangkak baki pada rantaian OK. Kita boleh membandingkan kunci peribadi mana yang mempunyai baki. Sebenarnya, kita juga boleh memilih kunci awam dengan pemindahan 314 USDT terlebih dahulu, yang lebih cepat. Melihat maklumat di laman web rasmi mengatakan bahawa kita boleh memeriksa baki secara langsung jika ada gas, kodnya agak berantakan.

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()
    

Kita boleh lihat bahawa ia mengambil 1048576 pengulangan, tetapi ia jauh lebih cepat dengan pelbagai benang, menjalankan ia pada salah satu pelayan saya.

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...

Menunggu dengan cemas~~~, berita buruk datang, dan tidak ada hasil sebelum strategi keluar.

Laluan berliku di sepanjang puncak gunung

Saya tidak fikir begitu, saya tidak dapat mengetahuinya, saya mula melihat perbincangan di twitter, dan saya mendapati bahawa semua orang dan saya tiba pada langkah yang sama, tetapi perkara yang pelik adalah bahawa tiada siapa yang mengatakan bahawa penyahkodan berjaya, dan pegawai tidak mengumumkan 61 bit pertama yang betul, maka jawapan yang pelik menarik perhatian saya, kerana terdapat perbezaanD2299di tengah, saya sangat yakin, tetapi dia kelihatan sangat yakin.

img

Namun, dia memposting D2290 61 bit. dia juga berkata bahawa dia telah diperiksa dengan teliti. tidak kira. mengambil peluang. bagaimanapun, ia adalah pemborosan elektrik. Dengan sikap cuba, saya menemui beberapa orang lain yang mengatakan bahawa mereka telah menemui 61-bit. Prefiks yang terdapat di bahagian komen dikumpulkan, dengan kod yang baru dilalui, kod asas tidak berubah, dan ia tidak akan ditampal berulang kali.

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

Malah, ada lebih banyak mesej baru kemudian, nilai PI seorang saudara berbeza dengan saya, ia luar biasa! Mari kita berlari dengan ini terlebih dahulu, saya tidak boleh percaya mata saya, tetapi ia keluar, ia bermakna bahawa salah satu awalan di atas adalah betul, yang sangat tidak saintifik, kunci peribadi adalah:

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

Di sini adalah D229, tetapi gambarnya jelas D2299, dan 731 diikuti oleh 7, di sini adalah dua, tetapi sebenarnya, ini adalah 61 bit yang betul, bagaimana dia mengira sendiri tidak diketahui, sangat ingin tahu, tetapi saya tidak meragui operasi saya sendiri, saya melihat salah satu komen mengatakan bahawa perkhidmatan pelanggan rasmi berkata Pi mempunyai versi lain, ia adalah saya yang tidak tahu, dengan apa yang saya pelajari dan pemahaman manusia semasa alam semesta pemahaman, lilitan nombor tidak rasional ini boleh mewakili tak terhingga alam semesta, bahagian pecahan tidak pernah berulang atau berakhir, anda boleh menafsirkannya sebagai UUID alam semesta yang anda berada di, jika ada versi lain, mungkin dari dunia selari.

Kod penukaran mata wang Web3

Akhirnya, ia adalah kod untuk memindahkan bonus jauh, untuk masa ini, saya menggunakan platform FMZ Web3 terus, menetapkan alamat rantaian untuk OKC, kunci peribadi ditambah kepada pertukaran secara rawak, dan kemudian dua baris akan dilakukan, melaksanakannya dalam mod alat debug terus.

img

Bukti

Alamat kunci awam yang didekripsi

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

Lihat pautan:https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a

TX selepas dipimpin oleh saya:https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c

Kita boleh lihat bahawa alamat penerima adalah:

0x25f0a126be95f437ee71d7c4de725567c5f6c731

img

Untuk membuktikan bahawa alamat ini adalah milik saya, saya menggunakan alamat penerima ini untuk membuat pemindahan ke alamat lubang hitam.

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

Alamat lubang hitam adalah:

0x0000000000000000005757572e464d5a2e434f4d

Alamat lubang hitam ini mengandungi URL yang didekod sebagai:

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

Postcript

Ini adalah akhir cerita, dan dengan melihat ke belakang, saya bersyukur atas pengetahuan yang saya kumpulkan selama bertahun-tahun, jika tidak saya tidak akan dapat memecahkannya dengan cepat dan saya akan dikalahkan oleh orang lain. Saya pasti ada kesilapan dalam rajah rasmi, tetapi dalam apa jua keadaan, saya cukup bernasib baik untuk memecahkan jawapannya sebelum ia dibuat awam, dan saya harap OKX akan lebih ketat lain kali mereka mengadakan aktiviti yang sama.


Berkaitan

Lebih lanjut