Como decifrar o prêmio de quebra-cabeça de chave privada do OKX para o Dia Mundial do Ciclo (com código completo)

Autora:Inventor de quantificação, Criado: 2023-03-14 23:25:45, Atualizado: 2023-09-18 20:08:33

img

Veja o grupo de pessoas do vizinho que dizem que a OKX está organizando o Dia Mundial da Rondônia para desvendar o segredo, e o tema é o seguinte:

img

Como um velho agricultor, quando eu vi a mensagem, o canto da boca subiu um pouco, abri o meu MacBook Pro, e eu não disse nada, comecei a fazer.

Análise

O oficial diz que há 61 bits de chave na imagem que se sobrepõem à circunferência, e que a chave privada é 32 bytes de comprimento, convertida em hex, ou seja, 64 bits mais o prefixo 0x, o total de 66 bits, já são 61.

A partir de uma simples manipulação de tons de hibridação com a ferramenta do Mac

img

O Mac reconhece automaticamente os caracteres das imagens e nós copiamos diretamente:

3.141592653589793230X1D64338
А694502884197169399375105820
974925E123078164062862089986
28033DB034211706409914808651
32823066470ED424609550582231
8B3
81284
•探索,
038
永无止境
027
493
05%
0128
4756482337867831731712019091
47D9E56692346034861045432664
8213393607743749141273724587
006606315588174881BEEA209628
2925409192744436789259036001

Este tipo de imagem não pode funcionar, mas nós modificamos manualmente, e as imagens não confirmadas que estão ocultas são marcadas com um *, não muito seguras, mais sobre isso depois. Outras são obstruídas por imagens, que podem ser julgadas observando a forma da caneta de outras fontes, e agora estamos no Python, calculando a diferença entre as duas, representadas pela mesma conotação, apenas mostrando diferentes.

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

Os resultados da execução são os seguintes:

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

Então, se eu tiver mais três dígitos, então eu tenho três indeterminados, então eu vou tentar removê-lo, porque se eu excluir os outros 61 dígitos, tudo bem. Deixando apenas as diferenças mais definidas, e finalmente considerando o prefixo:

0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744

Então, você pode usar o Python, violência para escalar o saldo na cadeia OK, comparar qual chave privada tem o saldo, e na verdade, você também pode selecionar a chave pública que tem 314 USDT de transferência, assim é mais rápido, ver se o site diz que há gás, então é melhor verificar o saldo diretamente, o código é mais confuso.

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

Como podem ver, é preciso fazer 10 485 76 movimentos, muito mais rápido, com vários fios, para colocar isso em um dos meus 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
以下省略......

Em meio à ansiedade de espera, as más notícias chegaram, a estratégia não resultou antes de sair, tudo mostrado

A rotação do pico

Não deveria, o que eu não entendi, foi quando comecei a ir ao Twitter e a ver as discussões, e descobri que todos estavam quase no mesmo caminho que eu, mas o estranho é que ninguém estava dizendo que a decifração tinha sido bem-sucedida, e não havia um anúncio oficial sobre os 61 primeiros lugares, então um comentário estranho chamou a minha atenção, porque havia uma diferença.D2299Não há nenhuma diferença, eu tenho certeza, mas ele também parece confiante.

img

Mas este tipo deu 61 dígitos e foi D2290, e ele disse que foi verificado cuidadosamente, não importa, por acaso, foi um desperdício de energia.

img

Com a mentalidade de experimentar, encontrei os 61 números que outras pessoas escreveram que encontrei, e todos pareciam confiantes.

img

O prefixo encontrado na área de comentários foi coletado e repassado em código rígido, com o código básico inalterado, sem duplicação.

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

Na verdade, há mais novos comentários, e um dos meus irmãos também tem um PI diferente do meu, é fantástico. A primeira coisa que você deve fazer é correr com estes dois, não acredita em seus olhos, mas corre para fora e mostra que um dos dois está certo, que é incrível, e a chave privada é:

1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155

Ele é D229 aqui, mas a imagem mostra claramente que é D2299, e o 731 é seguido por um 7, ele é seguido por dois, e o 731 é seguido por um 7. Mas é verdade que são 61 digitos, não se sabe como ele calculou, curiosidade imensa, mas eu não tenho dúvidas sobre a minha operação, olhando para a área de comentários que os clientes oficiais dizem que a taxa de circunferência tem outra versão, eu estou sozinho e desconfortável, com o conhecimento que eu aprendi e a compreensão atual da humanidade sobre o universo, a taxa de circunferência é um número irracional que pode representar o universo infinito, cujas frações nunca se repetem ou terminam, você pode entendê-lo como o seu UUID no universo, se houver outras versões, talvez do mundo paralelo.

Este é o outro irmão mais velho que respondeu ao atendimento após ser questionado:

img

O que é que é isso?

Código de transferência Web3

E, finalmente, o código para transferir o prêmio, desta vez, a função Web3 da plataforma FMZ, que eu uso diretamente, o endereço da cadeia é definido como OKC e funciona, e a chave privada é adicionada para a troca, mas não funciona, e depois as duas linhas são resolvidas, executadas diretamente no modo de ferramenta de depuração.

img

Prova

Endereço de chave pública quebrado

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

Veja o link:https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a

TX, que fui levado para trás:https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c

O endereço do destinatário é:

0x25f0a126be95f437ee71d7c4de725567c5f6c731

img

Para provar que o endereço é meu, eu uso o endereço do destinatário para transferir uma conta para um endereço de buraco negro.

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

O endereço do buraco negro é:0x0000000000000000005757572e464d5a2e434f4d

O endereço do buraco negro contém um endereço decodificado que diz:

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

Depois

Aqui é o fim, vamos voltar atrás, ou seja, graças a todos os anos de conhecimento acumulado, ou não é assim tão rápido e será um passo adiantado por outros. O que é certo é que os gráficos oficiais estão errados, ou seja, que tiveram sorte de serem decifrados antes da resposta ser divulgada, e esperamos que a OKX seja mais rigorosa na próxima vez que organizar eventos semelhantes.


Relacionados

Mais.

Papá!Quanto tempo leva 104 mil vezes?

Johnny, não.O Z é um arrogante!

btcrobotA capacidade de agir é excelente

Quantificação de óculosO Z é um arrogante!

Inventor de quantificaçãoCerca de 20 minutos.

Inventor de quantificaçãoChegou o velho ferro.