Comment résoudre la Journée mondiale de Pi OKX Prix de casse-tête de clé privée (avec code complet)

Auteur:Je ne sais pas., Créé à: 2023-03-16 17:19:08, Mis à jour à: 2023-08-01 11:35:36

img

Comment résoudre la Journée mondiale de Pi OKX Prix de casse-tête de clé privée (avec code complet)

J'ai vu des tycoons dans le groupe dire qu'OKX organisait un événement mystérieux pour la Journée mondiale du Pi, avec pour thème Exploration, Never Ending.

En tant que programmeur expérimenté, quand j'ai vu les nouvelles, j'ai souri et j'ai ouvert mon MacBook Pro, et sans plus tarder, commençons!

Analyse de la situation

Officiellement, il y a 61 bits de clé dans l'image et la partie du chevauchement de la circonférence, comme nous le savons tous, la longueur de la clé privée est de 32 octets, convertie en hex est de 64 bits plus le préfixe 0x, un total de 66 bits, il y a déjà 61 bits, pour la première vue, le 0X à la première ligne du graphique n'est évidemment pas Pi, c'est le début du préfixe de la clé privée, alors il y a environ 5 bits (0123456789ABCDEF).

Utilisons un outil Mac pour affiner la couleur simplement:

img

De cette façon, le Mac peut reconnaître les caractères sur l'image automatiquement.

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

On ne peut pas l'utiliser directement. Corrigeons-le manuellement. Ceux qui ne sont pas confirmés sur l'image sont marqués avec *. Les autres bloqués par la figure peuvent être jugés en observant la forme du trait d'autres polices.

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

Les résultats de la mise en œuvre sont les suivants:

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

Il y en a trois autres, et il n'y en a que trois incertains. Essayez de les supprimer, car les 61 autres bits sont bien après exclusion, ne laissant que la différence la plus définitive. Enfin, le préfixe est le suivant:

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

Ensuite, nous utiliserons Python et utiliserons la force pour explorer le solde sur la chaîne OK. Nous pouvons comparer quelle clé privée a le solde. En fait, nous pouvons également sélectionner la clé publique avec le transfert de 314 USDT en premier, ce qui est plus rapide.

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

On peut voir qu'il faut 1048576 itérations, mais c'est beaucoup plus rapide avec le multi-threading, en le lançant sur un de mes serveurs.

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

Anxieux d'attendre, les mauvaises nouvelles sont venues, et il n'y avait aucun résultat avant la stratégie de sortie.

Le sentier serpente le long des crêtes des montagnes

Je ne pense pas, je ne peux pas comprendre, j'ai commencé à regarder la discussion sur Twitter, et j'ai trouvé que tout le monde et moi sommes arrivés aux mêmes étapes, mais le plus étrange est que personne n'a dit que le décryptage a réussi, et le fonctionnaire n'a pas annoncé les 61 premiers bits corrects, puis une réponse étrange a attiré mon attention, parce qu'il y a une différenceD2299Au milieu, j'en suis sûre, mais il a l'air très confiant.

img

Mais il a posté un D2290 de 61 bits, il a aussi dit qu'il avait été vérifié soigneusement, ça n'a pas d'importance. Avec l'attitude d'essayer, j'ai trouvé quelques autres personnes qui ont dit qu'ils avaient trouvé 61 bits. Les préfixes trouvés dans la section des commentaires sont collectés, le code vient d'être traversé, le code de base n'a pas changé et il ne sera pas collé à plusieurs reprises.

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

En fait, il y a plus de nouveaux messages plus tard, la valeur de PI d'un frère est différente de la mienne, c'est incroyable! Allons-y d'abord avec ceux-ci, je ne peux pas croire mes yeux, mais il est sorti, cela signifie que l'un des préfixes ci-dessus est correct, ce qui est très non scientifique, la clé privée est:

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

Voici D229, mais l'image est clairement D2299, et 731 est suivi par 7, voici deux, mais en fait, c'est le 61 bits correct, comment il a calculé lui-même est inconnu, incroyablement curieux, mais je ne doute pas de mon propre fonctionnement, j'ai vu l'un des commentaires dit que le service client officiel a dit Pi a une autre version, c'était moi qui était ignorant, avec ce que j'ai appris et la compréhension humaine actuelle de l'univers compréhension, la circonférence de ce nombre irrationnel peut représenter l'infini de l'univers, sa partie fractionnaire ne se répète jamais ou se termine, vous pouvez l'interpréter comme l'UUID de l'univers dans lequel vous êtes, s'il y a d'autres versions, probablement de mondes parallèles.

Code de conversion de la devise Web3

Enfin, c'est le code pour transférer le bonus loin, pour cette fois, j'utilise la plate-forme FMZ Web3 directement, définir l'adresse de la chaîne à OKC, la clé privée ajoutée à l'échange au hasard, et puis deux lignes seront faites, l'exécuter dans le mode outil de débogage directement.

img

La preuve

Adresse de la clé publique décryptée

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

Regardez le lien:https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a

TX après avoir été dirigé par moi:https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c

On peut voir que l'adresse du destinataire est:

0x25f0a126be95f437ee71d7c4de725567c5f6c731

img

Pour prouver que cette adresse est la mienne, j'ai utilisé l'adresse de ce destinataire pour effectuer un transfert vers une adresse de trou noir.

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

L'adresse du trou noir est:

0x0000000000000000005757572e464d5a2e434f4d

Cette adresse de trou noir contient une URL décodée comme:

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

Post-script

C'est la fin de l'histoire, et en y repensant, je suis reconnaissant pour les connaissances que j'ai accumulées au fil des ans, sinon je n'aurais pas pu les déchiffrer aussi vite et j'aurais été battu par d'autres. Je suis sûr qu'il y a eu une erreur dans le diagramme officiel, mais en tout cas, j'ai eu la chance de déchiffrer la réponse avant qu'elle ne soit rendue publique, et j'espère que OKX sera plus rigoureux la prochaine fois qu'ils organiseront une activité similaire.


Relationnée

Plus de