Tôi thấy trong nhóm chuyên gia bên cạnh OKX đang tổ chức sự kiện giải mã bí ẩn Ngày Pi Thế giới, chủ đề như sau
Là một lập trình viên kỳ cựu, sau khi xem tin tức, khóe miệng tôi hơi cong lên, tôi mở MacBook Pro và bắt đầu làm việc mà không nói gì.
phân tích
Các viên chức cho biết có 61 bit của khóa trong phần hình ảnh chồng lên pi. Như chúng ta đều biết, độ dài của khóa riêng là 32 byte, được chuyển đổi thành hex, tức là 64 bit cộng với tiền tố 0x , tổng cộng 66 bit, 61 bit đã có. Thoạt nhìn, “0X” ở dòng đầu tiên của hình ảnh rõ ràng không phải là pi, mà là tiền tố của khóa riêng. Sau đó có 5 chữ số (0123456789ABCDEF) của sắp xếp ngẫu nhiên các ký tự này. Không có vấn đề gì với việc chạy brute force, vì vậy hãy bắt đầu
Sử dụng các công cụ tích hợp của Mac để làm sắc nét và điều chỉnh màu sắc một cách đơn giản
Có vẻ như thế này. Mac có thể tự động nhận dạng các ký tự trên hình ảnh. Hãy sao chép chúng trực tiếp:
3.141592653589793230X1D64338
А694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B3
81284
•探索,
038
永无止境
027
493
05%
0128
4756482337867831731712019091
47D9E56692346034861045432664
8213393607743749141273724587
006606315588174881BEEA209628
2925409192744436789259036001
Điều này chắc chắn không thể sử dụng được. Hãy sửa thủ công. Những mục bị hình ảnh chặn và không được xác nhận sẽ được đánh dấu là*Không. Không chắc lắm, tôi sẽ nói với bạn sau. Những font chữ khác bị chặn bởi hình ảnh có thể được đánh giá bằng cách quan sát hình dạng nét của các font chữ khác. Lúc này, chúng tôi sử dụng Python để tính toán sự khác biệt giữa hai font chữ. Tương tự như vậy_’ có nghĩa là chỉ khác nhau
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))
Kết quả thực hiện như sau:
___________________0X1D_____
A694________________________
____25E1____________________
____3DB0________4099________
___________ED42_____________
8B32________________________
____**_*D2299_______________
______0EFC___3F93___________
________________731_________
_7D9E_______________________
__________7A37______________
__________________BEEA______
________92744_______________
0X1DA69425E13DB04099ED428B32***D22990EFC3F937317D9E7A37BEEA92744 Len: 64
Có 3 chữ số thừa, không chắc chắn. Hãy loại bỏ chúng và thử lại. Bởi vì sau khi loại bỏ chúng, 61 chữ số còn lại đều đúng. Chỉ những khác biệt chắc chắn nhất được giữ lại và tiền tố cuối cùng như sau
0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744
Tiếp theo, chúng ta vẫn cần sử dụng Python để leo thang mạnh mẽ số dư trên chuỗi OK và so sánh khóa riêng nào có số dư. Trên thực tế, bạn cũng có thể chọn khóa công khai trước với chuyển khoản 314USDT, nhanh hơn. Theo trang web chính thức , còn gas. Chỉ cần kiểm tra số dư trực tiếp. Mã này lộn xộn.
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()
Bạn có thể thấy rằng nó cần phải được duyệt 1048576 lần. Sử dụng đa luồng nhanh hơn nhiều. Chạy nó trên một trong các máy chủ của tôi.
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
以下省略......
Đang hồi hộp chờ đợi~~~~, tin xấu, không có kết quả nào trước khi chiến lược thoát, tất cả hiển thị là Không có
Một sự thay đổi đột ngột của các sự kiện
Điều này không nên xảy ra. Tôi không thể hiểu được. Tôi bắt đầu đọc các cuộc thảo luận của mọi người trên Twitter và thấy rằng mọi người đều đã làm theo các bước tương tự như tôi. Nhưng điều kỳ lạ là không ai nói rằng việc giải mã đã thành công , và viên chức vẫn chưa công bố. 61 chữ số đầu tiên chính xác. Lúc này, một câu trả lời kỳ lạ đã thu hút sự chú ý của tôi vì có sự khác biệt ở giữa.D2299
Tôi chắc chắn là không có ai phản đối, nhưng anh ấy cũng có vẻ rất tự tin.
Nhưng chữ số thứ 61 mà người này đưa ra là D2290. Anh ta cũng nói rằng đã kiểm tra cẩn thận rồi. Không sao cả. Chúng ta hãy thử vận may của mình. Dù sao thì cũng chỉ là lãng phí điện.
Với thái độ cố gắng, tôi tìm được một số người khác để lại tin nhắn nói rằng họ đã tìm được 61 người và tất cả họ đều có vẻ rất tự tin.
Tôi đã thu thập tất cả các tiền tố được tìm thấy trong phần bình luận và duyệt qua chúng bằng mã trước đó. Mã cơ bản không thay đổi nhiều, vì vậy tôi sẽ không dán lại nữa.
prefixs =[
'1DA69425E13DB04099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B320D2290EFC3F937317D9E7A37BEEA92744',
'1DA694255E3DB040990ED428B3208890EFC3F937317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B3202299EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB01099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744',
]
Thực tế, có nhiều bình luận mới hơn. Giá trị PI của một anh khác với tôi. Thật đáng kinh ngạc. Trước tiên, hãy chạy những cái này. Tôi không tin vào mắt mình. Nó thực sự hoạt động. Điều này có nghĩa là một trong những tiền tố ở trên là đúng. Điều này không mang tính khoa học. Khóa riêng là:
1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155
Số của anh ấy là D229, nhưng hình ảnh cho thấy rõ ràng là D2299, và có số 7 sau số 731, nhưng anh ấy có hai số. Nhưng hóa ra là đúng 61 chữ số. Tôi không biết anh ấy tính toán thế nào. Tôi rất tò mò, nhưng tôi không nghi ngờ hoạt động của mình. Tôi thấy trong phần bình luận rằng bộ phận dịch vụ khách hàng chính thức nói rằng có một phiên bản khác của pi. Tôi không biết gì cả. Kiến thức học được và sự hiểu biết hiện tại về vũ trụ của con người, số vô tỷ pi có thể biểu diễn vô hạn của vũ trụ, và phần thập phân của nó sẽ không bao giờ lặp lại hoặc kết thúc. Bạn có thể nghĩ về nó như UUID của vũ trụ mà bạn đang sống. Nếu có những phiên bản khác, có thể là từ một thế giới song song.
Đây là phản hồi của bộ phận chăm sóc khách hàng sau khi một anh lớn khác bày tỏ sự nghi ngờ:
Đó là sự gia tăng kiến thức.
Mã chuyển tiền Web3
Cuối cùng, đây là mã để chuyển tiền thưởng. Lần này tôi trực tiếp sử dụng chức năng Web3 của nền tảng FMZ. Tôi chỉ đặt địa chỉ chuỗi thành OKC. Khi thêm khóa riêng vào sàn giao dịch, dù sao thì cũng không quan trọng. Sau đó Tôi có thể làm điều đó trong hai dòng. Thực hiện ở chế độ gỡ lỗi
chứng minh
Địa chỉ khóa công khai bị bẻ khóa
>>> from eth_account import Account
>>> Account.from_key('0x1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155').address
'0x0bd08825e05e540C9508961a32E58D14da47275A'
Xem liên kết: https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a
TX sau khi tôi lấy nó đi: https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c
Bạn có thể thấy địa chỉ người nhận là
0x25f0a126be95f437ee71d7c4de725567c5f6c731
Để chứng minh địa chỉ này là của tôi, tôi đã sử dụng địa chỉ của người nhận để chuyển tiền đến một địa chỉ hố đen.
Địa chỉ lỗ đen là
0x0000000000000000005757572e464d5a2e434f4d
Địa chỉ lỗ đen này chứa một URL, sau khi giải mã, là
~ % python -c 'print(bytes.fromhex("0000000000000000005757572e464d5a2e434f4d"))'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00WWW.FMZ.COM'
Lời bạt
Đây là kết thúc. Nhìn lại, tôi biết ơn vì đã tích lũy được kiến thức trong nhiều năm. Nếu không, tốc độ bẻ khóa sẽ không nhanh như vậy và những người khác sẽ vượt lên trước tôi. Tôi chắc chắn rằng có lỗi trong sơ đồ chính thức. Dù sao thì tôi cũng may mắn khi đã tìm ra câu trả lời trước khi nó được công khai. Tôi hy vọng OKX sẽ nghiêm ngặt hơn vào lần tới khi tổ chức một sự kiện tương tự.