세계 Pi의 날 OKX 개인 키 퍼즐 어워드 (완전 코드) 를 해결하는 방법

저자:리디아, 창작: 2023-03-16 17:19:08, 업데이트: 2023-08-01 11:35:36

img

세계 Pi의 날 OKX 개인 키 퍼즐 어워드 (완전 코드) 를 해결하는 방법

저는 그룹에 있는 몇몇 타이콘들이 OKX가 세계 Pi의 날 미스터리 행사를 개최하고 있다고 말하는 것을 보았습니다.

베테랑 프로그래머로서, 뉴스를 봤을 때, 저는 미소를 지으며 맥북 프로를 열었고, 더 이상 말없이, 시작하자!

분석

공식적으로는 그림에 61비트 키가 있고 둘레가 겹치는 부분입니다. 우리 모두 알고 있듯이 사설 키의 길이는 32바이트입니다. 으로 변환하면 64비트 더하기 0x 접두어, 총 66비트입니다. 이미 61비트가 있습니다. 첫 번째 보기에는 차트 첫 번째 줄의 0X은 분명히 Pi가 아닙니다. 사설 키 접두어의 시작입니다. 그 다음에는 약 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

직접 사용할 수 없습니다. 수동으로 수정해 보겠습니다. 사진에 덮여있는 확인되지 않은 것은 *.와 표시되어 있습니다. 확실하지 않습니다. 나중에 이야기 해 보겠습니다. 그림에 의해 차단 된 다른 글꼴은 다른 글꼴의 스트로크 모양을 관찰하여 판단 할 수 있습니다. 이 시점에서 우리는 Python을 사용하여 둘 사이의 차이를 계산하고 동일한 글꼴에 대해 _을 사용하여 다른 글꼴만을 표시합니다.

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

3개 더 있고, 3개만 불확실합니다. 다른 61비트가 제외된 후에 괜찮기 때문에 제거하려고 노력하십시오. 가장 확실한 차이만 남겨두고 있습니다. 마지막으로 접두어는 다음과 같습니다.

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

다음으로, 우리는 파이썬을 사용 하 고 힘을 사용 하 여 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...

불안한 기다림~~~, 나쁜 소식이 왔고, 전략이 종료되기 전에 결과가 없었습니다. 모두 아무 것도 표시되지 않았습니다.

길 은 산 산맥 을 따라 나선다

저는 그렇게 생각하지 않습니다. 저는 그것을 알아낼 수 없습니다. 저는 트위터에 대한 토론을 보기 시작했고, 모든 사람들이 저와 같은 단계에 도달했다는 것을 발견했습니다. 하지만 이상한 것은 아무도 암호 해독이 성공했다고 말하지 않았다는 것입니다.D2299중간에, 나는 매우 확신하지만, 그는 매우 자신있게 보인다.

img

하지만 그는 61비트 D2290을 올렸어요. 그는 또한 그가 신중하게 확인되었다고 말했습니다. 상관없습니다. 기회를 잡으세요. 어쨌든, 그것은 전기를 낭비하는 것입니다. 시도하는 태도로 61비트를 찾았다고 말하는 다른 사람들을 찾았습니다. 그들은 모두 매우 자신감을 가지고 있었습니다. 댓글 섹션에서 발견 된 접두어는 수집됩니다. 코드가 방금 통과되었습니다. 기본 코드는 변경되지 않았으며 반복적으로 붙이지 않습니다.

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

사실, 나중에 더 많은 새로운 메시지가 있습니다. 한 형제의 PI 값이 저것과 다릅니다. 놀랍습니다! 먼저 이것으로 실행해 봅시다. 제 눈을 믿을 수 없지만, 그것은 나왔어요. 그것은 위의 접두법 중 하나가 옳다는 것을 의미합니다.

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

여기 D229이 있지만 그림은 분명히 D2299이고, 731은 7로 이어집니다. 여기 2가 있습니다. 하지만 사실, 이것은 올바른 61비트입니다. 그가 직접 계산한 방법은 알려지지 않았습니다. 믿을 수 없을 정도로 호기심 많지만, 나는 내 자신의 작동을 의심하지 않습니다.

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가 다음 번에 비슷한 활동을 할 때 더 엄격해질 것을 희망합니다.


관련

더 많은