r/brdev • u/fazedordecodigo • 17h ago
Metodologias Origem das seeds das curvas NIST (P-256) explicada, segundo a Anthropic: lrand48 + timestamp de 1997. Rodei o script e bate com o OpenSSL
Saiu hoje (16/10) um post da Anthropic explicando de onde vieram as seeds das curvas elípticas NIST do ECDSA, uma dúvida de 25 anos em criptografia. Trago aqui porque a lição é de engenharia do dia a dia, não só de cripto.
Contexto - Em 2000, o FIPS 186-2 publicou as curvas P-192, P-224, P-256, P-384 e P-521. Cada uma tem uma seed cujo hash define um coeficiente da curva. - As seeds foram fornecidas pela NSA sem explicação. Isso alimentou anos de suspeita de backdoor. - O boato mais conhecido: seriam o hash de uma frase engraçada que o autor (Jerry Solinas, da NSA, que morreu em 2023) não lembrava mais. Houve investigação amadora e até uma recompensa, organizada pelo Filippo Valsorda.
O que a Anthropic publicou - As seeds são saída do lrand48, o gerador pseudoaleatório da biblioteca C, inicializado com srand48(timestamp Unix). Cada candidato é um bloco de 20 bytes da sequência. - Os timestamps das curvas primas vão de maio de 1997 a abril de 1998. A do P-256 é o candidato 1842 de srand48(16/08/1997 01:52:34 UTC). - Segundo a empresa, um modelo interno do Claude chegou nisso em menos de meia hora, sem receber a pista do boato. O caminho: procurar a assinatura de geradores dos anos 90 (bits altos zerados em algumas seeds denunciaram o lrand48) e recuperar o estado interno, com LLL no caso das curvas primas. - O post inclui o script em Python, em domínio público (CC0). - A recompensa (US$ 36.864) foi doada ao ISRG, que opera o Let's Encrypt.
O que eu conferi - Rodei o script aqui: as seeds de P-192, P-224, P-256, P-384 e P-521 saíram idênticas às que estão em crypto/ec/ec_curve.c do OpenSSL. Levou 0,1 s.
O que isso não é - A Anthropic diz com todas as letras: não é quebra, novo ataque ou fraqueza do ECDSA, e não há nada a mudar. Para eles, a descoberta torna um backdoor muito menos plausível. - O Filippo escreve que isso descarta a técnica de Bernstein e Lange para escolher uma curva fraca: sobram mal 30 bits de liberdade, contra os ~70 que ela usaria. - Ainda há pontas soltas: candidatos válidos que foram pulados sem explicação (no P-256, o candidato 876 também dava uma curva válida de ordem prima), a seed da B-163 e os pontos-base de P-224, P-256, P-384 e P-521.
Onde eu fico - Constante sem procedência vira suspeita, mesmo quando é inocente. O que encerrou a discussão foi um script que qualquer um roda, não a memória de quem gerou (que, no caso, estava errada). - Para o nosso dia a dia: seed de teste, número mágico, parâmetro gerado por script. Se o valor importa, o script e a entrada que o geraram deveriam estar versionados junto com ele.
Links: - Post da Anthropic, com o script: https://www.anthropic.com/research/ecdsa-curve-origins - Blog do Filippo Valsorda sobre o bounty: https://words.filippo.io/seeds-solved/ - Seeds no OpenSSL (o que usei para conferir): https://github.com/openssl/openssl/blob/master/crypto/ec/ec_curve.c
Perguntas: 1) No sistema de vocês, constante gerada (seed, número mágico, parâmetro) fica versionada com o script que a gerou, ou só o valor? 2) Alguém já herdou um número "que sempre foi assim" e ninguém sabia reproduzir? Como resolveram? 3) Na revisão de código, vocês pedem procedência de número mágico ou deixa passar?