Bagaimana untuk memecahkan World Pi Day OKX Private Key Puzzle Award (dengan kode lengkap)

Penulis:Lydia, Dibuat: 2023-03-16 17:19:08, Diperbarui: 2023-08-01 11:35:36

img

Bagaimana untuk memecahkan World Pi Day OKX Private Key Puzzle Award (dengan kode lengkap)

Saya melihat beberapa Tycoons di grup mengatakan bahwa OKX mengadakan World Pi Day Mystery Event, dengan tema Exploration, Never Ending.

Sebagai seorang programmer veteran, ketika saya melihat berita, saya tersenyum dan membuka MacBook Pro saya, dan tanpa basa-basi lagi, mari kita mulai!

Analisis

Secara resmi, ada 61 bit kunci dalam gambar dan bagian lingkar tumpang tindih, seperti yang kita semua tahu, panjang kunci pribadi adalah 32 byte, dikonversi ke hex adalah 64 bit ditambah awalan 0x, total 66 bit, sudah ada 61 bit, untuk tampilan pertama, 0X pada baris pertama dalam grafik jelas bukan Pi, itu adalah awal awalan kunci pribadi, maka ada sekitar 5 bit (0123456789ABCDEF).

Mari kita gunakan alat Mac untuk mempertajam warna dengan mudah:

img

Dengan cara ini, Mac dapat mengenali karakter pada gambar secara otomatis.

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

Tidak bisa digunakan secara langsung. Mari kita perbaiki secara manual. Yang tidak dikonfirmasi yang tertutup oleh gambar ditandai dengan *. Tidak yakin. Mari kita bicarakan nanti. Yang lain yang diblokir oleh gambar dapat dinilai dengan mengamati bentuk strok font lain. Pada saat ini, kita menggunakan Python untuk menghitung perbedaan antara keduanya, dan menggunakan _ untuk yang sama dan hanya menunjukkan yang berbeda.

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 sebagai berikut:

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

Ada tiga lagi, dan hanya ada tiga yang tidak pasti. Cobalah untuk menghapus mereka, karena 61 bit lainnya baik-baik saja setelah pengecualian, hanya meninggalkan perbedaan yang paling pasti. Akhirnya awalan adalah sebagai berikut:

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

Selanjutnya, kita akan menggunakan Python dan menggunakan force untuk merayapi saldo pada rantai OK. Kita dapat membandingkan kunci pribadi mana yang memiliki saldo. Bahkan, kita juga dapat memilih kunci publik dengan transfer 314 USDT terlebih dahulu, yang lebih cepat. Melihat informasi di situs web resmi mengatakan bahwa kita dapat memeriksa saldo secara langsung jika ada gas, kode sedikit 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 bisa melihat bahwa dibutuhkan 1048576 iterasi, tapi itu jauh lebih cepat dengan multi-threading, menjalankan di salah satu server 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.

Jalur berliku di sepanjang puncak gunung

Saya tidak berpikir begitu, saya tidak bisa mencari tahu, saya mulai melihat diskusi di twitter, dan saya menemukan bahwa semua orang dan saya sampai pada langkah yang sama, tapi hal yang aneh adalah bahwa tidak ada yang mengatakan bahwa dekripsi berhasil, dan pejabat tidak mengumumkan yang benar 61 bit pertama, kemudian jawaban aneh menarik perhatian saya, karena ada perbedaanD2299di tengah, aku sangat yakin, tapi dia terlihat sangat percaya diri.

img

Namun, dia memposting 61 bit D2290. dia juga mengatakan bahwa dia telah diperiksa dengan hati-hati. tidak masalah. mengambil kesempatan. bagaimanapun, itu buang-buang listrik. Dengan sikap mencoba, saya menemukan beberapa orang lain yang mengatakan bahwa mereka telah menemukan 61-bit. Prefiks yang ditemukan di bagian komentar dikumpulkan, dengan kode yang baru saja dilalui, kode dasar tidak berubah, dan tidak akan ditempelkan berulang kali.

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

Bahkan, ada lebih banyak pesan baru kemudian, salah satu nilai PI saudara berbeda dari saya, itu luar biasa! Mari kita jalankan dengan ini pertama, saya tidak percaya mata saya, tapi itu keluar, itu berarti bahwa salah satu awalan di atas adalah benar, yang sangat tidak ilmiah, kunci pribadi adalah:

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

Ini adalah D229, tapi gambarnya jelas D2299, dan 731 diikuti oleh 7, ini adalah dua, tapi sebenarnya, ini adalah 61 bit yang benar, bagaimana dia menghitungnya sendiri tidak diketahui, sangat penasaran, tetapi saya tidak meragukan operasi saya sendiri, saya melihat salah satu komentar mengatakan bahwa layanan pelanggan resmi mengatakan Pi memiliki versi lain, itu adalah saya yang tidak tahu, dengan apa yang saya pelajari dan pemahaman manusia saat ini tentang alam semesta, lingkar bilangan irasional ini dapat mewakili tak terbatasnya alam semesta, bagian pecahan tidak pernah berulang atau berakhir, Anda dapat menafsirkannya sebagai UUID alam semesta Anda berada di, jika ada versi lain, mungkin dari dunia paralel.

Kode konversi mata uang Web3

Akhirnya, itu kode untuk mentransfer bonus pergi, untuk kali ini, saya menggunakan platform FMZ Web3 langsung, mengatur alamat rantai untuk OKC, kunci pribadi ditambahkan ke pertukaran secara acak, dan kemudian dua baris akan dilakukan, mengeksekusi di mode alat debug langsung.

img

Bukti

Alamat kunci publik yang didekripsi

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

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

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

Kita bisa melihat bahwa alamat penerima adalah:

0x25f0a126be95f437ee71d7c4de725567c5f6c731

img

Untuk membuktikan bahwa alamat ini adalah milikku, aku menggunakan alamat penerima ini untuk melakukan transfer ke alamat lubang hitam.

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

Alamat lubang hitam adalah:

0x0000000000000000005757572e464d5a2e434f4d

Alamat lubang hitam ini berisi URL yang didekode sebagai:

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

Post-script

Ini adalah akhir dari cerita, dan dengan melihat ke belakang, saya bersyukur atas pengetahuan yang saya kumpulkan selama bertahun-tahun, jika tidak saya tidak akan bisa memecahkannya dengan cepat dan saya akan dikalahkan oleh orang lain. Aku yakin ada kesalahan dalam diagram resmi, tapi bagaimanapun, aku cukup beruntung untuk memecahkan jawabannya sebelum dipublikasikan, dan aku berharap OKX akan lebih ketat lain kali mereka mengadakan kegiatan serupa.


Berkaitan

Lebih banyak