Zendoric
← Volver al día · 21 de octubre de 2026

Claude descubre el origen de las semillas de las curvas ECDSA del NIST: un generador lrand48 inicializado con la hora Unix

🕒 Publicado en Zendoric: 21 de octubre de 2026 · 00:18

✨ Generado con IA · cómo se hace

Anthropic publica en su blog de investigación un trabajo de su equipo Frontier Red Team. Según el texto, un modelo de investigación interno, Claude, ha resuelto un misterio de unos 25 años de la criptografía: cómo se generaron las «semillas» (seeds) de las curvas elípticas estándar que sustentan ECDSA.

Anthropic publica en su blog de investigación un trabajo de su equipo Frontier Red Team. Según el texto, un modelo de investigación interno, Claude, ha resuelto un misterio de unos 25 años de la criptografía: cómo se generaron las «semillas» (seeds) de las curvas elípticas estándar que sustentan ECDSA. Es un relato de la propia empresa sobre su modelo, y el código que incluye permite reproducir los resultados.

La publicación insiste en que no es una ruptura criptográfica, ni un nuevo ataque, ni una debilidad en las curvas. Pide que se lea como un «capítulo final divertido» tras años de especulación. No hay que tomar ninguna medida ni cambiar nada, y según el texto la mayoría de los investigadores ya confiaba en las curvas.

Contexto: ECDSA es el estándar de criptografía de curva elíptica más usado. El NIST lo adoptó en 2000 como parte del Digital Signature Standard (FIPS 186-2), que lista curvas de distintos tamaños y niveles de seguridad. Para las curvas sobre cuerpos primos y binarios, la especificación publicó un parámetro «seed» cuyo valor hash define el coeficiente b de la curva. Esas semillas las aportó la NSA sin explicar su origen. Por ejemplo, la de NIST P-256 es C49D3608 86E70493 6A6678E1 139D26B7 819F7E90.

La falta de justificación alimentó durante años la sospecha de que las curvas se hubieran elegido con puertas traseras o debilidades deliberadas. Neal Koblitz y Alfred Menezes resumieron la polémica en «A Riddle Wrapped in an Enigma». Hubo además una investigación amateur y una recompensa para quien encontrara las semillas.

La mejor historia disponible atribuía las semillas a Jerry Solinas, veterano de la NSA, que habría aplicado un hash a una frase humorística del tipo «Give Bob and Jerry a raise». Así lo contaba él mismo en 2015, con reservas sobre los detalles. Solinas murió en 2023 y los demás implicados no respondieron, así que la pregunta seguía abierta.

El hallazgo: según Anthropic, varios empleados habían intentado sin éxito encontrar la frase. En octubre de 2026 uno de ellos preguntó a un modelo interno si podía averiguar cómo se generaron las semillas sin darle la pista de la frase. En menos de media hora, Claude descubrió el origen de las semillas de NIST P-192, P-224, P-256, P-384 y P-521. Ninguna era resultado de un algoritmo de hash. Eran la salida de lrand48, el generador de números aleatorios de la biblioteca C, inicializado con una marca de tiempo Unix.

El algoritmo toma bytes del generador, inicializado con una marca de tiempo t, durante n iteraciones. Cada iteración extrae 20 bytes como semilla candidata: los primeros 20 bytes son el candidato 1, los siguientes 20 el candidato 2, y así sucesivamente. Para P-256 hicieron falta 1.842 iteraciones hasta dar con la semilla estandarizada.

Cómo lo encontró: tras fracasar las búsquedas de la frase, Claude cambió de enfoque y trató de anticipar cómo debía de funcionar el software que generó las curvas. Supuso que usaba un generador pseudoaleatorio de las bibliotecas C de los años noventa. Esos generadores son lo bastante débiles como para que su salida sea reconocible, y reconocerla permitiría saber cuál se usó y, quizá, recuperar su estado inicial.

Claude escribió un escáner que recorría cada semilla publicada bit a bit y comprobaba si fragmentos adyacentes eran salidas consecutivas de un generador de esa época. Cubrió 34 combinaciones de generador y porciones de salida. Entonces notó un patrón: en cuatro de las diez semillas, el bit superior valía 0 en las 20 palabras. Según el texto, eso ocurriría por azar con probabilidad 1/5.810. Era la firma de lrand48, un generador congruencial lineal que solo devuelve los 31 bits superiores de un estado de 48 bits.

Para recuperar el estado, Claude tomó la primera palabra, probó los 2^17 valores posibles de los 17 bits ocultos y comprobó que las cuatro palabras siguientes encajaban. Funcionó para las cuatro semillas en cuestión.

Las semillas de las curvas primas salían del mismo lrand48, pero conservaban menos bits de cada salida. Recuperar el estado de un generador congruencial lineal truncado es, según el texto, un problema de retículos clásico que se resuelve con el algoritmo de reducción de bases LLL. Como Claude no sabía qué bits del estado mostraban las semillas, ejecutó el solucionador sobre todas las ventanas posibles. Las cinco semillas primas del NIST y otras cinco del estándar ANSI X9.62 seguían el mismo patrón: lrand48() >> 23. Cada estado de 48 bits recuperado regenera los 160 bits de su semilla, algo que no ocurre por casualidad.

Como este generador funciona hacia atrás igual que hacia delante, Claude retrocedió el estado de cada semilla hasta la forma que produciría srand48, con los 16 bits bajos iguales a 0x330E. Llegar a esa forma ocurre una vez cada 65.536 pasos, así que por sí solo no prueba nada. Lo relevante es que, en las diez semillas primas, cada inicialización correspondía a una marca de tiempo Unix entre mayo de 1997 y abril de 1998.

Las cuatro inicializaciones de las curvas binarias se leían como febrero de 1984. Con las marcas de tiempo duplicadas, se corresponden con el 17 de abril de 1998, dos semanas después de la ejecución de P-224. Según el texto, es posible que el programa dividiera el reloj entre dos. El código de ejemplo reproduce las semillas de P-192, P-224, P-256, P-384, P-521, las curvas ANSI prime192v2, prime192v3 y prime239v1 a v3, y las binarias B-233, B-283, B-409 y B-571, con sus fechas y su número de iteraciones.

El artículo recoge también los pensamientos internos de Claude durante el proceso. El modelo se preguntó si estaba en un entorno simulado o de prueba y por qué algo tan evidente no se había descubierto en 25 años. Concluyó que la verificación por cálculo directo, con coincidencias de 160 bits en cada una de las diez semillas, descartaba la casualidad.

Los puntos base: cada curva tiene un punto base G, el punto fijo del que todas las claves públicas ECDSA son múltiplos. La semilla no lo determina, así que quedaba otra pregunta. Al comprobar las semillas, Claude también encontró el origen de algunos de esos puntos.

Los puntos base de seis curvas generadas en mayo de 1997 salen del generador aleatorio de FreeLIP, el paquete de aritmética de enteros largos de Arjen Lenstra. Las primeras versiones de la biblioteca NTL de Victor Shoup incluían el mismo código. Las seis curvas son P-192 y las cinco curvas de ejemplo de ANSI X9.62: prime192v2, prime192v3 y prime239v1 a v3.

La receta es sencilla: se inicializa el generador con un entero pequeño, se descartan siete salidas, se generan candidatos a coordenada x a partir de salidas de 26 bits reducidas módulo p y se repite hasta que x cae sobre la curva. Las semillas del generador son 20000 para P-192; 20420, 20507 y 20509 para prime239v1 a v3; y 20512 y 20517 para prime192v2 y v3. Según el texto, hasta ahora no se había explicado ningún punto base del NIST. El código incluido confirma que los seis coinciden con los publicados.

Preguntas abiertas: no todos los candidatos de 20 bytes generan una curva viable, y Anthropic observó que se omitieron algunas curvas potencialmente válidas. En P-256, la semilla publicada es el candidato 1.842, pero el candidato 876 de la misma ejecución también da una curva de orden primo y tamaño correcto, con parámetros elegidos igual. La ejecución de P-224 pasó por alto tres curvas así, y las dos ejecuciones de las curvas de ejemplo ANSI X9.62 otras siete. Se desconoce qué criterios se usaron, o si fue un artefacto involuntario.

Como el número de omisiones es pequeño, los autores no creen plausible que se eligieran curvas debilitadas, porque eso implicaría que las debilitadas son comunes y fáciles de encontrar. Reconocen que sigue siendo concebible que se buscara entre marcas de tiempo para obtener una propiedad concreta. Pero eso solo tendría sentido si luego se revelara la marca de tiempo como prueba de una generación inocua, y nada en los números indica cuántas ejecuciones hubo.

También quedan sin explicar la semilla de la curva binaria B-163, que no encaja con nada de lo probado, y los puntos base de P-224, P-256, P-384 y P-521, así como los de las curvas binarias del NIST.

Lectura de los autores: Anthropic sostiene que el resultado les da más confianza en que las curvas se eligieron sin puertas traseras ni debilidades intencionadas. Las semillas se generaron de forma muy simple, con un generador pseudoaleatorio común inicializado con el reloj, que ahora cualquiera puede reproducir. Eso deja mucho menos margen para una manipulación. Es una conclusión de los autores sobre su propio hallazgo, y conviene recordar que las preguntas abiertas siguen ahí.

Otros datos: los 36.864 dólares de la recompensa por encontrar las semillas se donarán al Internet Security Research Group. El trabajo lo firman John Wood, Henry de Valence, Ava Howell, Zack Voase, Lucy Sweet, Amir Omidi, Paul Crowley, Iain McGinniss, Nicholas Carlini y Steve Weis. El código se publica con dedicación al dominio público (CC0 1.0). Los autores rinden homenaje póstumo a Jerry Solinas y agradecen a Filippo Valsorda la organización de la recompensa de las semillas de curvas elípticas del NIST.

Por qué importa: al margen de la criptografía, el caso es un ejemplo de razonamiento autónomo de un modelo. Planteó una hipótesis sobre cómo se había escrito el software, diseñó un escáner estadístico, aplicó una técnica de retículos conocida y verificó el resultado con cálculos. Todo ello según el relato de Anthropic, sin verificación independiente en este texto, aunque el código reproducible permite que otros lo comprueben.

🔗 Relacionadas en Zendoric

Fuentes y referencias