Procedimientos de firma

FALCON explicado matemáticamente

Cómo se firma una valoración de McGesund con FN-DSA (FALCON) — y por qué un solo carácter modificado rompe la firma.

Actualizado: 2026-09-07

1. De qué trata esto

Una valoración en McGesund no es un campo de texto de una base de datos en el que haya que creer sin más. Al enviarla se firma digitalmente, y cualquier visitante puede recalcular esa firma más tarde en su propio navegador.

Para una parte de esas firmas utilizamos FALCON — más concretamente FN-DSA-512 y FN-DSA-1024. Este artículo explica qué ocurre matemáticamente en el proceso.

Una precisión previa:

FALCON no es un cifrado. El texto de la valoración está justamente para leerse. FALCON no demuestra confidencialidad, sino origen e integridad.


2. Qué se firma exactamente

No se firma el texto corrido, sino un objeto de datos compacto que fija el texto de forma inequívoca:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<ID de la empresa>",
  "c":   "<ID de la valoración>",
  "h":   "<SHA-256 del texto de la valoración>",
  "rh":  "<SHA-256 del registro de envío completo>",
  "rv":  1,
  "qh":  "<SHA-256 del envelope QR, solo en valoraciones por QR>",
  "iat": 1757203200
}

Ese es nuestro mensaje mm. Vincula entre sí:

  1. a qué empresa pertenece la valoración (f),
  2. de qué valoración se trata (c),
  3. qué texto había detrás — como valor hash (h),
  4. qué registro se envió en su conjunto (rh): texto, corazones, estado de geolocalización y datos del motivo, serializados de forma canónica y con hash, en la versión de esquema rv,
  5. de qué código QR procede la valoración (qh) — en una valoración sin QR el campo no aparece,
  6. cuándo se firmó (iat).

Un solo carácter modificado en el texto de la valoración rompe esta cadena. Ese es exactamente el propósito — y desde rh lo mismo vale para un corazón desplazado a posteriori o un estado de geolocalización alterado.


3. El problema de fondo

Un lector que llega a un perfil de empresa se plantea dos preguntas:

  1. ¿Procede esta valoración realmente del sistema de McGesund?
  2. ¿Se ha modificado posteriormente?

Para eso existe un par de claves:

  • una clave privada — permanece en el servicio de firma
  • una clave pública — puede tenerla cualquiera

Se firma con la privada y se verifica con la pública. Y además en el dispositivo del lector, no en nuestro servidor.


4. ¿Por qué FALCON?

Muchos procedimientos de firma actuales se basan en problemas que son difíciles para los ordenadores clásicos, pero que podrían volverse mucho más fáciles para ordenadores cuánticos suficientemente grandes.

En una valoración eso es más relevante que en un mensaje efímero: una valoración debe seguir siendo verificable dentro de cinco o diez años. Quien firma hoy, firma para toda la vida útil de la entrada.

Por eso FALCON se basa en la criptografía de retículos:

Se construye un retículo matemáticamente fácil de describir en el que una determinada tarea de búsqueda es extremadamente difícil.


5. ¿Qué es un retículo matemático?

Dos vectores:

v1=(2,0),v2=(1,2).v_1=(2,0), \qquad v_2=(1,2).

Todas las combinaciones enteras

av1+bv2,a,bZa\,v_1+b\,v_2, \qquad a,b\in\mathbb{Z}

dan lugar a un retículo de puntos. Por ejemplo:

2v1+3v2=(4,0)+(3,6)=(7,6).2v_1+3v_2=(4,0)+(3,6)=(7,6).
v₁ = (2,0)v₂ = (1,2)(7,6)0
Dos vectores generan un retículo. Cada punto es una combinación entera de ambos — el punto marcado surge de dos veces v₁ y tres veces v₂.

Lo decisivo es:

El retículo en sí es fácil de describir. Encontrar en él determinadas propiedades es muy difícil.


6. El secreto son los vectores cortos

La tarea difícil clásica dice:

minvL,  v0v.\min_{v\in L,\;v\neq0}\|v\|.

Ese es el Shortest Vector Problem. En dos dimensiones se puede resolver probando. FALCON trabaja en dimensión 512 o 1024 — allí no hay nada que hacer.

base largacasi paralelosvector más corto
El mismo retículo, dos descripciones. Los vectores grises también lo generan, pero son largos y casi paralelos — una base mala. El vector corto es lo que resulta difícil de encontrar.

Ahora bien, FALCON no necesita el vector más corto en términos absolutos, sino algo emparentado: encontrar, para un punto objetivo dado, un punto del retículo cercano. Eso también es difícil sin la información adicional adecuada.

punto objetivo de la valoraciónpunto cercano del retículomuy lejos
El punto objetivo derivado de la valoración (círculo hueco) no está en el retículo. Se busca un punto del retículo muy próximo a él — el camino discontinuo hacia un punto lejano también es una solución de la primera condición, pero no una solución corta.

7. Polinomios en lugar de números

FALCON utiliza un retículo NTRU y calcula con polinomios. Es decir, en lugar de con números sueltos, con listas de coeficientes:

f=(1,0,1,0,0,1)f(x)=1+x2+x5.f=(1,0,1,0,0,1) \quad\longleftrightarrow\quad f(x)=1+x^2+x^5.

Se calcula en el anillo

Rq=Zq[x]/(xn+1).R_q=\mathbb{Z}_q[x]/(x^n+1).

Eso significa:

  • Zq\mathbb{Z}_q: calcular módulo qq. Con q=7q=7, por ejemplo, 10310\equiv3, porque 107=310-7=3.
  • xn=1x^n=-1: mantiene los polinomios en una longitud fija.

En concreto, FALCON utiliza:

q=12289,n=512  o  1024.q=12289, \qquad n=512 \;\text{o}\; 1024.

8. El truco central

La clave privada consta de cuatro polinomios pequeños

f,  g,  F,  Gf,\;g,\;F,\;G

con la ecuación NTRU

fGgF=q.fG-gF=q.

Los cuatro forman en conjunto una base secreta y bien comportada del retículo — una descripción del retículo mediante vectores cortos.

La clave pública es, en esencia, un único polinomio:

h=gf(modq).h=\frac{g}{f}\pmod q.

De hh resulta el mismo retículo, pero en una base poco manejable formada por vectores largos:

L={(s1,s2)  :  s1+s2h0(modq)}.L=\{(s_1,s_2)\;:\;s_1+s_2\,h\equiv0 \pmod q\}.

Ahí está todo el núcleo de FALCON. Ambas bases describen el mismo retículo. Solo que una sirve para calcular y la otra no.

Puede imaginarse como un plano de una ciudad: público es el mapa completo. Secreto es el conocimiento de los atajos.


9. La valoración se convierte en un punto

Antes de firmar, el objeto payload pasa por una función hash. FALCON emplea para ello Hash-to-Point: del mensaje no sale un valor numérico, sino directamente un punto en el anillo.

Además, el servicio de firma extrae un salt aleatorio rr (320 bits) y lo incluye en el hash:

c=HashToPoint(rm).c=\mathrm{HashToPoint}(r \,\|\, m).

El salt no es un adorno. Sin él, la misma valoración daría siempre la misma firma, y a partir de muchas firmas se podría reconstruir la base secreta. Por eso viaja también dentro de la firma.


10. Qué es una firma válida

Se busca un par

(s1,s2)(s_1,s_2)

con dos propiedades:

s1+s2hc(modq)y(s1,s2)  pequen˜a.s_1+s_2\,h\equiv c \pmod q \qquad\text{y}\qquad \|(s_1,s_2)\|\;\text{pequeña}.

La primera condición por sí sola es trivial de cumplir — basta con poner s2=0s_2=0 y s1=cs_1=c. Es la segunda condición la que hace difícil la tarea.

La brevedad es la firma.\boxed{\text{La brevedad es la firma.}}

11. Un miniejemplo calculado por completo

Reducimos todo a tamaño de juguete: polinomios con un solo coeficiente, es decir, números corrientes, y

q=97.q=97.

La clave secreta. Dos números pequeños:

f=3,g=5.f=3, \qquad g=5.

La clave pública. Se tiene 3165(mod97)3^{-1}\equiv65 \pmod{97}, porque 365=195=297+13\cdot65=195=2\cdot97+1. Así pues:

h=gf1=565=32534(mod97).h=g\cdot f^{-1}=5\cdot65=325\equiv \boxed{34} \pmod{97}.

El retículo. L={(s1,s2):s1+34s20(mod97)}L=\{(s_1,s_2): s_1+34\,s_2\equiv0 \pmod{97}\}.

La base pública resulta directamente de hh:

(97,0)y(34,1).(97,0) \quad\text{y}\quad (-34,1).

Ambos están en LL — y ambos son largos.

La base secreta solo la conoce el servicio de firma:

(g,f)=(5,3)y(G,F)=(9,14),(-g,f)=(-5,3) \quad\text{y}\quad (-G,F)=(-9,-14),

porque 5+343=970-5+34\cdot3=97\equiv0 y 9+34(14)=485=5970-9+34\cdot(-14)=-485=-5\cdot97\equiv0. El determinante es

(5)(14)(3)(9)=70+27=97=q,(-5)(-14)-(3)(-9)=70+27=97=q,

de modo que la ecuación NTRU se cumple. Ambos vectores son cortos.


Paso 1: Calcular el hash de la valoración

Supongamos que el objeto payload de la valoración da

c=71.c=71.

Paso 2: Una primera solución, mala

(s1,s2)=(71,0)(s_1,s_2)=(71,0)

cumple 71+340=71c71+34\cdot0=71\equiv c. Pero la longitud es 7171 — demasiado larga con diferencia.

Paso 3: Acortar con la base secreta

El servicio de firma expresa el punto objetivo en su base corta:

(71,0)=a(5,3)+b(9,14).(71,0)=a\,(-5,3)+b\,(-9,-14).

Eso lleva a a10,25a\approx-10{,}25 y b2,20b\approx-2{,}20. Redondeando a a=10a=-10 y b=2b=-2 resulta el punto del retículo

10(5,3)2(9,14)=(50,30)+(18,28)=(68,2).-10\,(-5,3)-2\,(-9,-14)=(50,-30)+(18,28)=(68,-2).

Comprobación: 68+34(2)=6868=068+34\cdot(-2)=68-68=0, es decir, efectivamente está en LL. Restamos:

(71,0)(68,2)=(3,2)(71,0)-(68,-2)=\boxed{(3,2)}

Longitud:

(3,2)=9+4=133,61.\|(3,2)\|=\sqrt{9+4}=\sqrt{13}\approx3{,}61.

Esa es la firma.

Paso 4: El mismo procedimiento con la base pública

Quien solo conoce h=34h=34 dispone de la base {(97,0),(34,1)}\{(97,0),(-34,1)\}. El mismo cálculo de redondeo da allí el punto del retículo (97,0)(97,0) y, con él,

(71,0)(97,0)=(26,0),(26,0)=26.(71,0)-(97,0)=(-26,0), \qquad \|(-26,0)\|=26.

También es una solución válida de la ecuación — pero siete veces más larga. Si la cota de aceptación se fija por debajo de 26, esa solución no vale nada.

Mismo algoritmo, mismo retıˊculo, mismo punto objetivo.Solo cambia la base — y con ella el resultado.\boxed{ \begin{array}{c} \text{Mismo algoritmo, mismo retículo, mismo punto objetivo.}\\ \text{Solo cambia la base — y con ella el resultado.} \end{array}}

Esa es la trampa de FALCON en una línea.

Paso 5: El navegador verifica

El navegador recibe la valoración, el salt y s2=2s_2=2. Recalcula el hash, obtiene c=71c=71, reconstruye

s1=cs2h=7168=3,s_1=c-s_2\,h=71-68=3,

y comprueba la longitud:

(3,2)=13    βFirma vaˊlida\|(3,2)\|=\sqrt{13}\;\leq\;\beta \quad\Longrightarrow\quad \boxed{\text{Firma válida}}

Paso 6: Alguien modifica el texto de la valoración

Si el texto se modifica a posteriori, cambia el hash del contenido y con él el punto, digamos que a

c=40.c'=40.

La firma antigua sigue siendo (3,2)(3,2), pero

3+342=7140Firma no vaˊlida3+34\cdot2=71\neq40 \quad\Longrightarrow\quad \boxed{\text{Firma no válida}}

Podemos borrar una valoración. Lo que no podemos es modificarla sin que se note.

Nota de honestidad sobre el ejemplo

En dos dimensiones un atacante puede encontrar soluciones cortas simplemente probando — para c=40c'=40, por ejemplo, (6,1)(6,1). El ejemplo no es seguro; solo muestra el mecanismo. En FALCON-1024 el vector tiene 2048 coeficientes, y allí probar no lleva a ninguna parte.


12. ¿Por qué no basta con redondear?

El procedimiento del paso 3 se llama redondeo de Babai. Para un ejemplo didáctico basta — para un procedimiento de firma real, no.

La razón: las firmas redondeadas no se distribuyen de manera uniforme. Su forma depende de la geometría de la base secreta. A partir de un número suficiente de firmas se podría reconstruir esa geometría — y con ella la clave privada. Precisamente en eso fracasaron procedimientos de firma basados en retículos anteriores.

Por eso FALCON extrae los vectores cortos de una distribución gaussiana discreta sobre el retículo:

P(x)exc2/(2σ2).P(x)\propto e^{-\|x-c\|^2/(2\sigma^2)}.

Los valores próximos al punto objetivo son más probables, pero cuál se elige exactamente es aleatorio. El resultado es una distribución que no revela nada sobre la base utilizada — matemáticamente: no se distingue de una distribución que dependa únicamente del retículo mismo.

Ese muestreador es la parte más exigente de FALCON. Funciona de forma recursiva sobre una estructura de árbol y trabaja con números en coma flotante — lo que hace delicada la implementación y es la razón principal de que FALCON sea más difícil de implementar correctamente que ML-DSA.


13. Qué se transmite realmente

La firma consta de

σ=(r,  s2).\sigma=(r,\;s_2).

Solo s2s_2 — no el par. s1s_1 lo calcula el propio verificador:

s1=cs2h(modq).s_1=c-s_2\,h \pmod q.

Como los coeficientes de s2s_2 son pequeños y se dispersan en torno a cero, se pueden comprimir mucho. Esa es la razón de las firmas llamativamente compactas de FALCON:

clave públicafirma
FALCON-512897 B~666 B
FALCON-10241.793 B~1.280 B

Para comparar: ML-DSA-87 necesita 4.627 bytes. En McGesund, sin embargo, ninguna de estas firmas va dentro del propio código QR — el adhesivo lleva solo el envelope Ed25519; los sellos post-cuánticos están junto al registro y se cargan al verificar. El tamaño no decide aquí, por tanto, sobre la imprimibilidad, sino sobre almacenamiento y transmisión: un sello FALCON ocupa aproximadamente una cuarta parte de un sello ML-DSA.


14. Por qué FALCON verifica rápido

La multiplicación de polinomios ingenua cuesta

O(n2).O(n^2).

Con la transformada rápida de Fourier eso baja aproximadamente a

O(nlogn).O(n\log n).

Con n=1024n=1024 esa es la diferencia entre un millón y unas diez mil operaciones. Por eso la verificación se ejecuta en milisegundos en el navegador de un visitante — y por eso la F está en el nombre:

FAst Fourier Lattice-based COmpact signatures over NTRU.


15. El proceso en imagen

SERVICIO DE FIRMA (MCGESUND)NAVEGADOR DEL VISITANTEclave privada (f, g, F, G — base corta)payload m = {empresa, valoración, h, rh, iat}salt r + HashToPoint(r ‖ m) = cmuestreo gaussiano: vector corto (s₁, s₂)firma σ = (r, s₂) + kidvaloración + σ + clave pública hrecalcular c, s₁ = c − s₂·h‖(s₁, s₂)‖ ≤ β ?válidano válida
Del payload a la marca de verificación en el navegador. Todo lo que está por encima de la línea divisoria ocurre una sola vez, al enviar; todo lo que está por debajo, de nuevo en cada visitante — en su dispositivo, con la clave pública.

16. Por qué fracasa un atacante

Conoce hh y con ello todo el retículo. Conoce también el punto objetivo cc en cuanto la valoración es pública. Lo que le falta es la base corta.

Para falsificar una valoración tendría que encontrar, para un cc elegido por él mismo, un vector corto — únicamente a partir de la descripción pública. Esa es la tarea que ha ilustrado el paso 4 del ejemplo: sin los vectores buenos, el mismo cálculo acaba en una solución demasiado larga.

En dimensión 1024, los mejores procedimientos conocidos — tanto clásicos como cuánticos — están muy lejos de conseguirlo.

Firmar: raˊpidoVerificar: raˊpidoFalsificar: difıˊcil\boxed{\text{Firmar: rápido}\quad \text{Verificar: rápido}\quad \text{Falsificar: difícil}}

17. Qué hace McGesund concretamente con esto

El envelope. Cada valoración firmada lleva una firma Ed25519. Esa es la variante obligatoria — clásica, muy pequeña, verificable de forma nativa en cualquier navegador.

Los sellos post-cuánticos. Junto a ella se colocan una o dos firmas resistentes a la computación cuántica. Cuáles, depende de la tarifa:

Tarifaniveles de firma disponibles
BasisEd25519, FN-DSA-512
KlassikEd25519, FN-DSA-512, FN-DSA-1024
ProEd25519, FN-DSA-1024, ML-DSA-87
PremiumEd25519, FN-DSA-1024, ML-DSA-87, ambas en paralelo

La variante en paralelo es deliberadamente redundante. FALCON se apoya en retículos NTRU y ML-DSA en retículos de módulos. Si una de las dos familias resultara ser más débil de lo que hoy se supone, la otra sigue sosteniendo.

El ancla temporal. La huella de la clave de firma se ancla mediante OpenTimestamps en un bloque de Bitcoin. Con ello no solo queda acreditado que la firma es auténtica, sino también que ya existía en un momento determinado — sin que nadie tenga que creerse nuestra marca de tiempo.

Todo eso se calcula en el navegador del lector, mediante un módulo WASM. Nosotros entregamos los datos; la verificación se ejecuta en el dispositivo del visitante. Si mañana desapareciéramos de la red, una valoración ya cargada seguiría siendo verificable.

Sobre los nombres: FALCON se está estandarizando actualmente como FN-DSA; el borrador está previsto como FIPS 206, pero aún no está cerrado. Por eso los niveles se llaman FN-DSA-512 y FN-DSA-1024 en el código de McGesund, aunque en el uso corriente se siga hablando de FALCON.


18. La intuición más importante

La clave pública es la descripción completa de un laberinto. Cualquiera puede mirarla.

La firma es la prueba: «He encontrado un camino muy corto para exactamente esta valoración».

La clave privada es el conocimiento de los atajos.

El lector no necesita conocer los atajos. Solo comprueba si el camino presentado es realmente corto y si pertenece realmente a esta valoración. Ambas cosas puede hacerlas sin nosotros.

FALCON convierte una valoracioˊn en un punto de un retıˊculoy la firma en un camino corto hasta ese punto.\boxed{ \begin{array}{c} \text{FALCON convierte una valoración en un punto de un retículo}\\ \text{y la firma en un camino corto hasta ese punto.} \end{array}}

Quien modifica el texto desplaza el punto — y el camino antiguo lleva al vacío.