Saya melihat di kelompok ahli sebelah bahwa OKX mengadakan acara pemecahan misteri Hari Pi Sedunia, temanya adalah sebagai berikut
Sebagai seorang programmer senior, setelah melihat berita itu, sudut mulut saya sedikit terangkat, dan saya membuka MacBook Pro dan mulai bekerja tanpa berkata apa-apa.
menganalisa
Pejabat mengatakan bahwa ada 61 bit kunci di bagian gambar yang tumpang tindih dengan pi. Seperti yang kita ketahui, panjang kunci privat adalah 32 byte, yang diubah menjadi hex, yaitu 64 bit ditambah awalan 0x. , totalnya 66 bit, 61 bit sudah ada. Sekilas, “0X” di baris pertama gambar itu jelas bukan pi, melainkan awalan kunci privat. Lalu ada 5 digit (0123456789ABCDEF) susunan acak karakter-karakter ini. Tidak ada masalah dengan brute force running, jadi mari kita mulai
Gunakan alat bawaan Mac untuk mempertajam dan menyesuaikan warna secara sederhana
Seperti ini. Mac dapat mengenali karakter pada gambar secara otomatis. Mari kita salin langsung:
3.141592653589793230X1D64338
А694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B3
81284
•探索,
038
永无止境
027
493
05%
0128
4756482337867831731712019091
47D9E56692346034861045432664
8213393607743749141273724587
006606315588174881BEEA209628
2925409192744436789259036001
Ini jelas tidak dapat digunakan. Mari kita perbaiki secara manual. Kita tandai yang belum dikonfirmasi yang diblokir oleh gambar sebagai*Tidak. Tidak yakin, aku akan memberitahumu nanti. Yang lainnya yang diblokir oleh gambar dapat dinilai dengan mengamati bentuk goresan font lainnya. Saat ini, kami menggunakan Python untuk menghitung perbedaan antara keduanya. Hal yang sama digunakan_’ berarti hanya berbeda
img = '''
3.141592653589793230X1D64338
A694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B32594081284811174502841027
0193**2*D2299964462294895493
0381960EFC8103F9365933446128
4756482337867831731712019091
47D9E56692346034861045432664
82133936077A3749141273724587
006606315588174881BEEA209628
2925409192744436789259036001
'''
# 真实圆周率
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 eksekusinya adalah sebagai berikut:
___________________0X1D_____
A694________________________
____25E1____________________
____3DB0________4099________
___________ED42_____________
8B32________________________
____**_*D2299_______________
______0EFC___3F93___________
________________731_________
_7D9E_______________________
__________7A37______________
__________________BEEA______
________92744_______________
0X1DA69425E13DB04099ED428B32***D22990EFC3F937317D9E7A37BEEA92744 Len: 64
Ada 3 digit tambahan, dan ada tepat 3 digit yang tidak pasti. Mari kita coba hilangkan digit-digit tersebut, karena setelah menghilangkannya, 61 digit lainnya semuanya baik-baik saja. Hanya perbedaan yang paling pasti yang disimpan, dan awalan terakhirnya adalah sebagai berikut
0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744
Selanjutnya, kita masih perlu menggunakan Python untuk menaikkan saldo pada rantai OK secara drastis dan membandingkan kunci privat mana yang memiliki saldo. Bahkan, Anda juga dapat memilih kunci publik terlebih dahulu dengan transfer 314USDT, yang lebih cepat. Menurut situs web resmi , masih ada bensin. Cek saldo langsung saja. Kodenya 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'
# 无所谓优化算法了, 争分夺秒跑密钥
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()
Anda dapat melihat bahwa ia perlu dilintasi sebanyak 1048576 kali. Menggunakan multithreading jauh lebih cepat. Jalankan 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
以下省略......
Menunggu dengan cemas~~~~, berita buruk, tidak ada hasil sebelum strategi keluar, semua yang ditampilkan adalah None
Perubahan peristiwa yang tiba-tiba
Seharusnya tidak seperti itu. Saya tidak dapat menemukan jawabannya. Saya mulai membaca diskusi semua orang di Twitter dan menemukan bahwa semua orang telah mengikuti langkah yang sama dengan saya. Namun anehnya, tidak ada yang mengatakan bahwa dekripsi berhasil. , dan petugasnya belum mengumumkannya. 61 digit pertama sudah benar. Saat itu, balasan yang aneh menarik perhatian saya karena ada perbedaan di tengahnya.D2299
Tidak ada keberatan, saya yakin, tetapi dia juga tampak sangat percaya diri.
Namun, digit ke-61 yang diberikan orang ini adalah D2290. Ia juga mengatakan bahwa ia telah memeriksanya dengan saksama. Tidak masalah. Mari kita coba peruntungan. Itu hanya pemborosan listrik.
Dengan sikap mencoba, saya menemukan beberapa orang lain yang meninggalkan pesan yang mengatakan mereka telah menemukan 61 orang, dan mereka semua tampak sangat percaya diri.
Saya kumpulkan semua awalan yang ditemukan di area komentar dan telusuri dengan kode sebelumnya. Kode dasarnya tidak banyak berubah, jadi saya tidak akan menempelkannya lagi.
prefixs =[
'1DA69425E13DB04099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B320D2290EFC3F937317D9E7A37BEEA92744',
'1DA694255E3DB040990ED428B3208890EFC3F937317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B3202299EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB01099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744',
]
Bahkan, ada lebih banyak komentar baru. Nilai PI salah satu saudara berbeda dengan nilai PI saya. Sungguh menakjubkan. Mari kita coba dulu. Saya tidak percaya dengan apa yang saya lihat. Ini benar-benar berhasil. Ini berarti salah satu awalan di atas benar. Ini tidak ilmiah. Kunci pribadinya adalah:
1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155
Yang ini D229, tapi gambarnya jelas menunjukkan D2299, dan ada angka 7 setelah 731, tapi dia punya dua. Tapi ternyata 61 digitnya benar. Saya tidak tahu bagaimana dia menghitungnya. Saya sangat penasaran, tetapi saya tidak meragukan operasi saya. Saya melihat di komentar bahwa layanan pelanggan resmi mengatakan ada versi lain dari pi. Saya tidak tahu. Pengetahuan yang dipelajari dan pemahaman manusia saat ini tentang alam semesta, bilangan irasional pi dapat mewakili ketidakterbatasan alam semesta, dan bagian desimalnya tidak akan pernah berulang atau berakhir. Anda dapat menganggapnya sebagai UUID dari alam semesta tempat Anda berada. Jika ada versi lain, mungkin dari dunia paralel.
Ini adalah tanggapan layanan pelanggan setelah kakak besar lainnya menyatakan keraguan:
Itu adalah peningkatan pengetahuan.
Kode transfer koin Web3
Terakhir, berikut kode untuk mentransfer bonus. Kali ini saya langsung menggunakan fungsi Web3 dari platform FMZ. Saya hanya mengatur alamat rantai ke OKC. Saat menambahkan kunci pribadi ke bursa, itu tidak masalah. Lalu Saya dapat melakukannya dalam dua baris. Jalankan dalam mode debugger
membuktikan
Alamat kunci publik yang diretas
>>> from eth_account import Account
>>> Account.from_key('0x1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155').address
'0x0bd08825e05e540C9508961a32E58D14da47275A'
Lihat tautan: https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a
TX setelah saya mengambilnya: https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c
Anda dapat melihat bahwa alamat penerima adalah
0x25f0a126be95f437ee71d7c4de725567c5f6c731
Untuk membuktikan bahwa alamat ini adalah milik saya, saya menggunakan alamat penerima untuk mentransfer uang ke alamat lubang hitam.
Alamat lubang hitam adalah
0x0000000000000000005757572e464d5a2e434f4d
Alamat lubang hitam ini berisi URL yang, setelah didekode,
~ % python -c 'print(bytes.fromhex("0000000000000000005757572e464d5a2e434f4d"))'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00WWW.FMZ.COM'
Kata Penutup
Ini adalah akhir. Kalau dipikir-pikir, saya bersyukur atas pengetahuan yang saya kumpulkan selama bertahun-tahun. Kalau tidak, kecepatan pemecahannya tidak akan secepat ini dan yang lain akan mendahului saya. Saya yakin ada kesalahan dalam diagram resmi. Bagaimanapun, saya beruntung telah memecahkan jawabannya sebelum dipublikasikan. Saya berharap OKX akan lebih teliti saat menyelenggarakan acara serupa berikutnya.