J’ai vu dans le groupe d’experts d’à côté qu’OKX organise un événement de résolution de mystères pour la Journée mondiale du Pi, le thème est le suivant
En tant que programmeur senior, après avoir vu les nouvelles, les coins de ma bouche se sont légèrement relevés et j’ai ouvert mon MacBook Pro et j’ai commencé à travailler sans rien dire.
analyser
Les responsables affirment qu’il y a 61 bits de la clé dans la partie de l’image qui chevauche Pi. Comme nous le savons tous, la longueur de la clé privée est de 32 octets, qui sont convertis en hexadécimal, soit 64 bits plus le préfixe 0x , un total de 66 bits, 61 bits sont déjà là. À première vue, le “0X” dans la première ligne de l’image n’est évidemment pas pi, mais le préfixe de la clé privée. Ensuite, il y a 5 chiffres (0123456789ABCDEF) de disposition aléatoire de ces caractères. Il n’y a aucun problème avec l’exécution en force brute, alors commençons
Utilisez les outils intégrés de Mac pour affiner et ajuster simplement la couleur
Cela ressemble à ceci. Mac peut reconnaître automatiquement les caractères sur l’image. Copions-les directement :
3.141592653589793230X1D64338
А694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B3
81284
•探索,
038
永无止境
027
493
05%
0128
4756482337867831731712019091
47D9E56692346034861045432664
8213393607743749141273724587
006606315588174881BEEA209628
2925409192744436789259036001
Ce n’est certainement pas utilisable. Corrigeons-le manuellement. Ceux qui sont bloqués par l’image et qui ne sont pas confirmés sont marqués comme*Non, je ne suis pas sûr, je te le dirai plus tard. D’autres qui sont bloqués par l’image peuvent être jugés en observant la forme du trait d’autres polices. À ce stade, nous utilisons Python pour calculer la différence entre les deux. Le même est utilisé_” signifie que seulement différent
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))
Les résultats de l’exécution sont les suivants :
___________________0X1D_____
A694________________________
____25E1____________________
____3DB0________4099________
___________ED42_____________
8B32________________________
____**_*D2299_______________
______0EFC___3F93___________
________________731_________
_7D9E_______________________
__________7A37______________
__________________BEEA______
________92744_______________
0X1DA69425E13DB04099ED428B32***D22990EFC3F937317D9E7A37BEEA92744 Len: 64
Il y a 3 chiffres supplémentaires, qui sont incertains. Supprimons-les et essayons. Car après les avoir éliminés, les 61 autres chiffres sont tous corrects. Seules les différences les plus certaines sont conservées, et le préfixe final est le suivant
0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744
Ensuite, nous devons encore utiliser Python pour grimper violemment le solde sur la chaîne OK et comparer quelle clé privée possède le solde. En fait, vous pouvez également d’abord sélectionner la clé publique avec le transfert 314USDT, ce qui est plus rapide. Selon le site officiel , il reste du gaz. Vérifiez simplement le solde directement. Le code est confus.
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()
Vous pouvez voir qu’il doit être parcouru 1048576 fois. L’utilisation du multithreading est beaucoup plus rapide. Exécutez-le sur l’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
以下省略......
Attendre avec impatience~~~~, mauvaise nouvelle, il n’y a aucun résultat avant la sortie de la stratégie, tous les résultats affichés sont Aucun
Un tournant soudain dans les événements
Cela ne devrait pas être le cas. Je n’arrivais pas à comprendre. J’ai commencé à lire les discussions de tout le monde sur Twitter et j’ai découvert que tout le monde avait suivi des étapes similaires aux miennes. Mais ce qui est étrange, c’est que personne n’avait dit que le décryptage avait réussi , et le responsable ne l’avait pas encore annoncé. Les 61 premiers chiffres sont corrects. À ce moment-là, une réponse étrange a attiré mon attention car il y avait une différence au milieu.D2299
Il n’y a aucune objection, j’en suis sûr, mais il semble également très confiant.
Mais le 61e chiffre donné par cette personne est D2290. Il a également dit qu’il l’avait soigneusement vérifié. Cela n’a pas d’importance. Tentons notre chance. C’est de toute façon un gaspillage d’électricité.
Avec une attitude d’essai, j’ai trouvé plusieurs autres personnes qui ont laissé des messages disant qu’ils avaient trouvé 61 personnes, et ils semblaient tous très confiants.
J’ai récupéré tous les préfixes trouvés dans la zone de commentaires et je les ai parcourus avec le code précédent. Le code de base n’a pas beaucoup changé, je ne le recollerai donc pas.
prefixs =[
'1DA69425E13DB04099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B320D2290EFC3F937317D9E7A37BEEA92744',
'1DA694255E3DB040990ED428B3208890EFC3F937317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B3202299EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB01099ED428B3202290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D2290EFC3F9317317D9E7A37BEEA92744',
'1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744',
]
En fait, il y a plus de nouveaux commentaires. La valeur PI d’un frère est différente de la mienne. C’est incroyable. Commençons par les exécuter. Je n’en crois pas mes yeux. Cela fonctionne réellement. Cela signifie que l’un des préfixes ci-dessus est correct. Ce n’est pas scientifique. La clé privée est :
1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155
Le sien est D229, mais la photo montre clairement D2299, et il y a un 7 après 731, mais il en a deux. Mais il s’est avéré que c’était les 61 chiffres corrects. Je ne sais pas comment il l’a calculé. Je suis très curieux, mais je ne doute pas de ma propre opération. J’ai vu dans les commentaires que le service client officiel a dit qu’il y en avait un autre version de pi. Je suis ignorant. Les connaissances acquises et la compréhension actuelle de l’univers par les humains, le nombre irrationnel pi peut représenter l’infinité de l’univers, et sa partie décimale ne se répétera ni ne finira jamais. Vous pouvez le considérer comme le UUID de l’univers dans lequel vous vous trouvez. S’il existe d’autres versions, peut-être d’un monde parallèle.
Voici la réponse du service client après qu’un autre grand frère ait exprimé des doutes :
C’est une augmentation des connaissances.
Code de transfert de pièces Web3
Enfin, voici le code pour transférer le bonus. Cette fois, j’ai utilisé directement la fonction Web3 de la plateforme FMZ. J’ai juste défini l’adresse de la chaîne sur OKC. Lors de l’ajout de la clé privée à l’échange, cela n’a de toute façon pas d’importance. Ensuite Je peux le faire en deux lignes. Exécutez en mode débogueur
prouver
Adresse de clé publique piratée
>>> from eth_account import Account
>>> Account.from_key('0x1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155').address
'0x0bd08825e05e540C9508961a32E58D14da47275A'
Voir le lien : https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a
TX après l’avoir emporté : https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c
Vous pouvez voir que l’adresse du destinataire est
0x25f0a126be95f437ee71d7c4de725567c5f6c731
Pour prouver que cette adresse est la mienne, j’ai utilisé l’adresse du destinataire pour transférer de l’argent vers une adresse de trou noir.
L’adresse du trou noir est
0x0000000000000000005757572e464d5a2e434f4d
Cette adresse de trou noir contient une URL qui, après décodage, est
~ % python -c 'print(bytes.fromhex("0000000000000000005757572e464d5a2e434f4d"))'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00WWW.FMZ.COM'
Épilogue
C’est la fin. En y repensant, je suis reconnaissant pour les connaissances que j’ai accumulées au fil des ans. Sinon, la vitesse de craquage ne serait pas aussi rapide et d’autres m’auraient devancé. Je suis sûr qu’il y a une erreur dans le diagramme officiel. Quoi qu’il en soit, j’ai eu la chance d’avoir trouvé la réponse avant qu’elle ne soit rendue publique. J’espère qu’OKX sera plus rigoureux la prochaine fois qu’il organisera des événements similaires.