A matemática da aula anterior nunca falhou. O que falha, com regularidade deprimente, é o sorteio da terceira linha — e quando ele falha, a chave privada sai em quatro linhas de álgebra que qualquer estudante de ensino médio acompanha.
Suponha duas assinaturas feitas com a mesma chave e o mesmo nonce k, sobre mensagens diferentes. Como r é a coordenada x do ponto k vezes G, e k é o mesmo, o r das duas é idêntico — e isso é visível na blockchain, de graça, para quem estiver olhando.
Escreva as duas: s1 é o inverso de k vezes a soma de z1 com r vezes d; s2 é o inverso de k vezes a soma de z2 com r vezes d. Subtraia uma da outra. As parcelas com r vezes d se cancelam, porque são idênticas, e sobra que s1 menos s2 é o inverso de k vezes z1 menos z2. Isole: k é igual a z1 menos z2 dividido por s1 menos s2. Com k na mão, volte à primeira equação e isole d, que é s1 vezes k menos z1, dividido por r.
Acabou. Duas subtrações, duas divisões, e a chave privada está na tela. Não há força bruta, não há tabela, não há hardware especial — e não existe defesa depois do fato, porque as duas assinaturas já estão publicadas e ninguém as apaga.

O primeiro caso célebre não foi no Bitcoin. Em 27 de dezembro de 2010, no congresso do Chaos Computer Club em Berlim, o grupo fail0verflow mostrou que a Sony assinava o software do PlayStation 3 usando sempre o mesmo k — um valor constante, escrito no código. Duas assinaturas quaisquer bastavam. A chave que autorizava todo o software do console foi deduzida em público, no palco.
No Bitcoin, o desastre equivalente veio em agosto de 2013. Uma falha no gerador de números aleatórios do Android fazia aplicativos receberem a mesma semente de aleatoriedade, e carteiras que assinavam mais de uma transação repetiam nonces sem que nada indicasse problema. Em 11 de agosto, o site bitcoin.org publicou o alerta. Quem estava varrendo a blockchain à procura de valores de r repetidos já havia esvaziado os endereços afetados.
E o problema não é histórico. Pesquisadores que passam a blockchain inteira em busca de r repetidos continuam encontrando ocorrências, quase sempre de carteiras artesanais e programas improvisados.
A defesa é elegante e é o padrão desde 2013: parar de sortear. A norma RFC 6979 descreve como derivar k de forma determinística, aplicando HMAC sobre a chave privada e o resumo da mensagem. O k continua imprevisível para quem está de fora, porque depende da chave privada, mas deixa de depender da qualidade do gerador aleatório da máquina. A mesma chave assinando a mesma mensagem produz sempre a mesma assinatura — o que, além de seguro, é conveniente para testar.

Existe ainda uma versão mais sutil do mesmo problema, e ela é bonita o bastante para merecer o parágrafo final. Não é preciso repetir o nonce inteiro. Basta que ele vaze um pouquinho — que os primeiros bits sejam previsíveis, por exemplo, porque o gerador é enviesado. Cada assinatura entrega então uma lasca de informação. Reunindo algumas centenas delas, uma técnica de redução de reticulados recupera a chave privada inteira a partir dessas lascas, sem que nenhum nonce jamais tenha se repetido.

Repare no que todas essas quebras têm em comum: nenhuma delas atacou a curva. A secp256k1 continua intacta, o logaritmo discreto continua sem solução, e o que caiu foi sempre um pedaço de código mal escrito ou um gerador defeituoso.
Existe, porém, uma família inteira de ataques que vai direto à matemática — não por acreditar que ela seja frágil, mas por escolher intervalos em que a raiz quadrada do espaço deixa de ser assustadora. É o que torna os desafios da blockchain possíveis, e é o assunto do próximo módulo.