← Volver a la Bitácora

El origen secreto de las curvas ECDSA

El origen secreto de las curvas ECDSA

“The Reality: It’s just timestamps.”

Así arranca el informe que Anthropic publicó el 16 de octubre de 2026, y con esa frase se cierra una discusión de veinticinco años. Las semillas con las que se construyeron las curvas elípticas que protegen casi todo el tráfico de internet no eran un hash sobre una frase graciosa ni un algoritmo secreto: eran la salida de lrand48, el generador pseudoaleatorio que venía con la biblioteca C de cualquier Unix de los noventa, inicializado con la hora del reloj.

Un srand48(time), veinte bytes por candidato, y el que pasaba el filtro se publicaba como semilla estándar.

La historia vale la pena, porque el valor no está en el resultado sino en cómo se llegó. Y porque el resultado es una buena noticia.

El sobre con semillas

En 2000, el NIST adoptó FIPS 186-2, el estándar de firmas digitales: P-192, P-224, P-256, P-384 y P-521. Para cada curva, el estándar publicaba una semilla de 160 bits cuyo hash SHA-1 define el coeficiente b, siguiendo el procedimiento de ANSI X9.62.

Las semillas las entregó la NSA. Sin justificación matemática. Sin explicaciones. Sin decir de dónde salían.

El esquema se llama nothing up my sleeve —nada en la manga— y la idea es razonable: si no podés elegir los parámetros, no podés esconder una debilidad en ellos. Pero la promesa tiene un agujero: la semilla se publica, sí, pero la semilla misma puede ser cualquiera. El hash prueba que la curva se derivó de ese número; no prueba nada sobre cómo se eligió el número.

Ilustración: dos agentes de traje le entregan un tazón de semillas a un gato escéptico

Veinticinco años de sospecha

El rumor oficial decía que eran el hash de una broma interna militar. La versión más citada venía del propio Jerry Solinas, empleado de larga data de la NSA, en 2015:

“I believe there was a counter rather than multiple hashing, but I don’t know details. The message was along the lines of ‘Give Bob and Jerry a raise’ or ‘Bob and Jerry rule’ or something like that. It was Bob Reiter who actually wrote the code, and he doesn’t remember the details either. Nor were we able to find archives from so long ago. If they exist, they are no doubt sitting on a hard drive near the Ark of the Covenant.”

— Jerry Solinas, ex-empleado de la NSA, 2015

Solinas murió en 2023 sin poder aclararlo. Koblitz y Menezes publicaron A Riddle Wrapped in an Enigma (2015) argumentando que era implausible esconder una debilidad que resistiera quince años de criptoanálisis —pero registrando también la objeción contraria: Bernstein y Lange les describieron una técnica que podría haber usado 70 bits de libertad en la elección de la semilla para apuntar a una clase hipotética de curvas débiles. Bernstein es el autor de Curve25519, la curva competidora.

En 2023, Filippo Valsorda puso plata: una recompensa para quien encontrara el origen. Tres años después, nadie la había cobrado.

Ilustración: un gato rodeado de un tablero de corcho con fotos, hilos rojos y recortes de conspiración

Media hora

En octubre de 2026, un empleado curioso de Anthropic le preguntó a un modelo de investigación interno si podía averiguar cómo se habían generado esas semillas, con una condición: sin darle la pista de la frase humorística. Esa pista ya la habían seguido varios empleados sin éxito, y era falsa.

En menos de media hora, el modelo encontró el origen de las cinco semillas del NIST. No era ningún hash.

Del registro quedó un detalle lindo: el momento en que el modelo sospecha de lo que está viendo.

“Hmm wait. Let me be skeptical: am I in some sort of simulated environment? … 160-bit match from a 32-bit seed + small index: no chance coincidences (10 × 160 bits). It’s real.”

Ilustración: un gato con sombrero de detective patea un tacho de basura lleno de recortes

Cómo se resuelve un misterio de 1997

Pensar como en los 90

En lugar de buscar qué mensaje se hasheó, el modelo intentó anticipar cómo tuvo que funcionar el software. El código se escribió a fines de los noventa, en C: lo más probable es que hayan usado un generador pseudoaleatorio estándar de las bibliotecas de la época. Y esos generadores son tan débiles que su salida se puede reconocer.

Ilustración: un gato con auriculares frente a una computadora de los noventa con el monitor en verde

El método fue un escáner que recorrió cada semilla publicada, bit por bit, probando si trozos adyacentes se comportaban como salidas consecutivas de un generador de los noventa: 34 combinaciones de generador y recorte.

Ilustración: un gato mira con lupa una cinta de papel con dígitos binarios

El bit de arriba en cero

En cuatro de las diez semillas, el bit superior de cada palabra era cero. Siempre. La probabilidad de que eso ocurra por azar es de 1 en 5.810, y no es azar: es la firma exacta de lrand48, un generador congruencial lineal que solo devuelve los 31 bits superiores de un estado de 48 bits.

Ilustración: un gato abre una carpeta con un papel que dice lrand48 y un sello de Top Secret

Para las curvas primas, que mostraban menos bits de cada salida (estaban truncadas), recuperar el estado interno es un problema clásico de retículos matemáticos, y se resuelve con el algoritmo LLL. La prueba de que el truco era correcto: cada estado de 48 bits recuperado regenera los 160 bits completos de su semilla, y eso no pasa por accidente.

Ilustración: un gato hace una patada de kung fu en el centro de una estructura de retículos geométricos

Rebobinar el reloj

Un generador congruencial lineal funciona hacia atrás igual de bien que hacia adelante. Para cada semilla, el modelo retrocedió el estado hasta la forma que le habría dejado srand48 al inicializarlo: los 16 bits inferiores en 0x330E. Ese estado aparece una vez cada 65.536 pasos, así que llegar a uno no prueba nada.

Lo que prueba todo es el paso siguiente: en las diez semillas de curvas primas, cada inicialización era un timestamp Unix entre mayo de 1997 y abril de 1998. Nadie había elegido nada. Alguien había corrido un programa y el programa leyó el reloj.

Ilustración: un gato cuelga de las agujas de un reloj de pared gigante

El gran secreto de la NSA

No hubo hashes ocultos. No hubo contraseñas. Todo salió del reloj de una computadora, y se reproduce hoy en seis líneas de Python:

Curvasrand48(t) (UTC)Candidato aceptado
prime239v11997-05-15 15:49:032185
prime239v21997-05-15 15:49:032320
prime239v31997-05-15 15:49:033048
P-192 (prime192v1)1997-05-18 14:45:34139
prime192v31997-05-18 14:45:345228
prime192v21997-05-18 14:45:346013
P-5211997-08-08 01:12:041136
P-256 (prime256v1)1997-08-16 01:52:341842
P-3841997-08-30 14:50:082688
P-2241998-04-03 12:52:077026

Mirá las fechas: tres curvas de ejemplo salieron de una misma corrida del 15 de mayo; P-192 y dos más, de una del 18. P-224, la que llegó última al estándar, es también la última semilla. Son los tiempos de un grupo de personas trabajando, no los de una operación encubierta.

Y el remate: las cuatro semillas de las curvas binarias, leídas como timestamp, daban febrero de 1984. Duplicadas, caían el 17 de abril de 1998, dos semanas después de P-224. Probablemente el programa dividía el reloj por la mitad.

Ilustración: un gato mira un calendario de pared abierto en diciembre de 1997, bajo el año 1998

Como propina, los puntos base (G) de seis curvas vinieron de otra librería estándar: FreeLIP, el paquete de enteros largos de Arjen Lenstra. Se sembraba con un número chico (20000 para P-192), se descartaban siete salidas y se probaban coordenadas de 26 bits hasta que cayeran sobre la curva.

Ilustración: un gato barre una alfombra y deja al descubierto el número 20000

Expectativa vs. realidad

Toda la teoría se sostenía en una intuición razonable: si te entregan parámetros criptográficos sin explicar su origen, la respuesta sana es desconfiar.

Pero la realidad fue mucho más aburrida que el mito, y esa es justamente la prueba: nadie construye una puerta trasera tan torpe.

Ilustración: dos paneles, la expectativa con científicos abriendo un cofre brillante, la realidad con un oficinista cansado frente a una PC

¿Y mi criptomoneda?

Esta historia es sobre el ecosistema, no sobre las cadenas. Vale separar dos mundos que se confunden todo el tiempo.

Bitcoin no está afectado. No usa curvas del NIST: usa secp256k1. Y ahí está la diferencia de fondo. Satoshi eligió una curva con parámetros simples y públicos, justamente para no tener que confiar en nadie: a = 0, b = 7, un primo p con una forma matemática clara y justificable, sin ninguna seed secreta ni proceso opaco detrás. Cualquiera puede verificar que esos números producen una curva segura de orden primo. Ethereum siguió el mismo camino: secp256k1, no P-256.

Monero tampoco. No usa ni secp256k1 ni P-256: usa Ed25519, otra familia, sin semillas.

P-256 (secp256r1) es la que sí está en todas partes, y la que cargó con la sospecha durante veinticinco años:

ÁmbitoUso concreto
Internet / WebTLS/HTTPS, la mayoría de las conexiones seguras, certificados digitales
Autenticación modernaPasskeys / WebAuthn / FIDO2
AppleSecure Enclave (iPhone, Mac, Apple Pay, Face ID / Touch ID)
AndroidStrongBox / Keystore, claves protegidas por hardware
Gobierno y empresaFIPS 140, HSMs, tarjetas inteligentes, firma digital oficial
Navegadores y sistemas operativosChrome, Firefox, Windows, macOS, iOS (soporte nativo)
Otros protocolosJWT, OAuth, DNSSEC, sistemas de identidad

O sea: cuando mirabas el candadito del navegador, ahí estaba esta semilla. Por eso importa que sea aburrida.

¿Es la prueba de que no hay puertas traseras?

No del todo, y conviene decirlo antes de cerrar el caso con un sello.

Esto no es una prueba matemática absoluta de que las curvas no tienen puertas traseras. Lo que demuestra es más específico y más útil: que las semillas se generaron de una manera banal, reproducible y con muy poco margen de elección. Hace que una puerta trasera deliberada sea enormemente menos plausible, y resuelve la sospecha principal que rodeó a estas curvas durante más de veinticinco años.

El argumento central es de conteo. Aun siendo generosos —suponiendo que la NSA hubiera podido elegir cualquier timestamp de 1997–98 y cualquiera de los primeros 16 candidatos, lo que cubre de sobra los candidatos salteados— habrían tenido apenas 30 bits de libertad. Eso no alcanza para apuntar a una clase hipotética de curvas débiles ni para incrustar una puerta trasera de tipo NOBUS (nobody but us: solo nosotros podemos abrirla). La técnica de 70 bits de Bernstein y Lange queda descartada.

Y quedan cabos sueltos, que el informe enumera:

  • Candidatos salteados. Para P-256 se publicó el 1842, pero el 876 de la misma corrida también daba una curva válida de orden primo. Sobran candidatos: hay más o menos el doble de los publicados. Pudo ser un criterio no documentado o un bug que devolvía mal el resultado la mitad de las veces. En 1997 estos cálculos eran estado del arte; hoy se hacen en minutos.
  • Una semilla perdida. B-163 no encaja con ningún patrón probado.
  • Bases faltantes. Los puntos base de P-224, P-256, P-384 y P-521 no siguen la receta de FreeLIP.

Ninguna de las tres es una alarma. Son, literalmente, las preguntas que quedaron abiertas después de que se contestara la grande.

Ilustración: un gato con piloto camina de espaldas y deja atrás una pieza de rompecabezas negra

Caso cerrado

El botín de 36.864 dólares fue donado íntegramente al Internet Security Research Group, la ONG detrás de Let’s Encrypt. Valsorda había triplicado el valor de la recompensa; el equipo de Anthropic (John Wood, Henry de Valence, Ava Howell, Zack Voase, Lucy Sweet, Amir Omidi, Paul Crowley, Iain McGinniss, Nicholas Carlini y Steve Weis) la cobró el 15 de octubre de 2026 a las 01:07:51 UTC.

Ilustración: un gato negro duerme hecho un ovillo arriba de un candado con señal de wifi

La simetría se explica sola: la plata que se puso para averiguar el origen de P-256 terminó financiando la infraestructura que emite certificados con P-256. Valsorda lo resumió con una ironía perfecta: la rehabilitación de las curvas del NIST llega “justo a tiempo para que las retiren en favor de las firmas post-cuánticas”. Hoy las recomienda por encima de Curve25519 —curiosa inversión para el bando que llevaba una década acusándolas.

Y para el final, lo que me interesa de esta historia. Durante veinticinco años, la semilla de P-256 estuvo ahí, publicada en el estándar, verificable por cualquiera. Nadie la verificó, porque nadie sabía qué buscar, y porque el hash probaba la derivación pero no la elección. La confianza era verificable en teoría, y por eso mismo nadie la verificaba.

Necesitó que apareciera alguien —o algo— con la paciencia de preguntarse cómo se escribe un programa, en vez de qué frase olvidó un hombre. La verificación no es un documento firmado que se guarda: es trabajo que se puede rehacer. Y a veces hay que rehacerlo, veinticinco años después, para que la respuesta valga lo mismo que habría valido el primer día.

Ilustración: un gato con los ojos cerrados junta las manos junto a un cofre de madera con la leyenda Internet Security Research Group