Cómo resolver el Día Mundial de Pi Premio de Puzles de Clave Privada OKX (con código completo)

El autor:- ¿ Por qué?, Creado: 2023-03-16 17:19:08, Actualizado: 2023-08-01 11:35:36

img

Cómo resolver el Día Mundial de Pi Premio de Puzles de Clave Privada OKX (con código completo)

Vi a algunos magnates en el grupo diciendo que OKX estaba celebrando un evento de misterio del Día Mundial de Pi, con el tema de Exploración, nunca termina.

Como programador veterano, cuando vi las noticias, sonreí y abrí mi MacBook Pro, y sin más preámbulos, ¡comencemos!

Análisis

Oficialmente, hay 61 bits de clave en la imagen y la parte de la superposición de la circunferencia, como todos sabemos, la longitud de la clave privada es de 32 bytes, convertida en hex es de 64 bits más el prefijo 0x, un total de 66 bits, ya hay 61 bits, para la primera mirada, el 0X en la primera línea en el gráfico obviamente no es Pi, es el comienzo del prefijo clave privada, entonces hay unos 5 bits (0123456789ABCDEF).

Vamos a usar una herramienta de Mac para agudizar el color simplemente:

img

De esta manera, el Mac puede reconocer los caracteres de la imagen automáticamente.

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

No se puede usar directamente. Corregámoslo manualmente. Los no confirmados cubiertos por la imagen están marcados con *. No estoy seguro. Hablemos de ello más tarde. Los otros bloqueados por la figura se pueden juzgar observando la forma de trazo de otras fuentes. En este momento, usamos Python para calcular la diferencia entre las dos, y usamos _ para las mismas y solo mostramos las diferentes.

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

Los resultados de la aplicación son los siguientes:

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

Hay tres más, y solo hay tres inciertos. Trata de eliminarlos, porque los otros 61 bits están bien después de la exclusión, dejando solo la diferencia más definida. Finalmente, el prefijo es el siguiente:

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

A continuación, utilizaremos Python y usaremos la fuerza para rastrear el saldo en la cadena OK. Podemos comparar qué clave privada tiene el saldo. De hecho, también podemos seleccionar la clave pública con la transferencia de 314 USDT primero, lo que es más rápido. Al ver la información en el sitio web oficial dijo que podemos verificar el saldo directamente si hay gas, el código es un poco desordenado.

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

Podemos ver que toma 1048576 iteraciones, pero es mucho más rápido con multi-threading, ejecutándolo en uno de mis servidores.

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

Esperando ansiosamente, llegaron malas noticias, y no hubo resultado antes de que la estrategia saliera.

El sendero serpentea a lo largo de las crestas de las montañas

No lo creo, no puedo entenderlo, empecé a mirar la discusión en Twitter, y me di cuenta de que todos y yo llegamos a los mismos pasos, pero lo extraño es que nadie ha dicho que el descifrado es exitoso, y el oficial no ha anunciado los primeros 61 bits correctos, entonces una respuesta extraña llamó mi atención, porque hay una diferenciaD2299En el medio, estoy muy seguro, pero parece terriblemente seguro.

img

Sin embargo, publicó un D2290 de 61 bits. También dijo que lo habían revisado cuidadosamente. No importa. Tome una oportunidad. De todos modos, es una pérdida de electricidad. Con la actitud de intentarlo, encontré a otras personas que dijeron que habían encontrado 61 bits. Los prefijos que se encuentran en la sección de comentarios se recogen, con el código sólo atravesado, el código básico no ha cambiado, y no se pegará repetidamente.

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

De hecho, hay más mensajes nuevos más tarde, el valor de PI de un hermano es diferente al mío, ¡es increíble! Vamos a correr con estos primero, no puedo creer mis ojos, pero salió, significa que uno de los prefijos arriba es correcto, que es muy poco científico, la clave privada es:

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

Aquí está D229, pero la imagen es claramente D2299, y 731 es seguido por 7, aquí está dos, pero en realidad, este es el correcto 61 bits, cómo él mismo lo calculó es desconocido, increíblemente curioso, pero no dudo de mi propia operación, vi uno de los comentarios dijo que el servicio al cliente oficial dijo que Pi tiene otra versión, era yo quien era ignorante, con lo que he aprendido y la comprensión humana actual del universo comprensión, la circunferencia de este número irracional puede representar el infinito del universo, su parte fraccionaria nunca se repite o termina, se puede interpretar como el UUID del universo en el que se encuentra, si hay otras versiones, probablemente de mundos paralelos.

Código de conversión de divisas Web3

Finalmente, es el código para transferir el bono lejos, para esta vez, uso la plataforma FMZ Web3 directamente, establecer la dirección de la cadena a OKC, la clave privada agregada al intercambio al azar, y luego dos líneas se hará, ejecutarlo en el modo de la herramienta de depuración directamente.

img

Prueba

Dirección de la clave pública descifrada

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

Mira el enlace:https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a

TX después de ser dirigido por mí:https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c

Podemos ver que la dirección del destinatario es:

0x25f0a126be95f437ee71d7c4de725567c5f6c731

img

Para probar que esta dirección es mía, usé la dirección de este destinatario para hacer una transferencia a una dirección de agujero negro.

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

La dirección del agujero negro es:

0x0000000000000000005757572e464d5a2e434f4d

Esta dirección de agujero negro contiene una URL decodificada como:

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

Después de la escritura

Este es el final de la historia, y en retrospectiva, estoy agradecido por el conocimiento que he acumulado a lo largo de los años, de lo contrario no habría sido capaz de descifrarlo tan rápido y habría sido derrotado por otros. Estoy seguro de que hubo un error en el diagrama oficial, pero en cualquier caso, tuve la suerte de descifrar la respuesta antes de que se hiciera pública, y espero que OKX sea más riguroso la próxima vez que realicen una actividad similar.


Relacionados

Más.