Procédé de signature

FALCON expliqué mathématiquement

Comment un avis McGesund est signé avec FN-DSA (FALCON) — et pourquoi un seul caractère modifié brise la signature.

Mise à jour : 2026-09-07

1. De quoi il s'agit

Un avis publié sur McGesund n'est pas un simple champ de texte dans une base de données qu'il faudrait croire sur parole. Il est signé numériquement au moment de son envoi, et chaque visiteur peut ensuite recalculer cette signature dans son propre navigateur.

Pour une partie de ces signatures, nous utilisons FALCON — plus précisément FN-DSA-512 et FN-DSA-1024. Cet article explique ce qui se passe alors sur le plan mathématique.

Un point important d'emblée :

FALCON n'est pas un chiffrement. Le texte de l'avis est justement fait pour être lu. FALCON ne prouve pas la confidentialité, mais l'origine et l'intégrité.


2. Ce qui est signé exactement

Ce n'est pas le texte courant qui est signé, mais un objet de données compact qui fixe le texte sans ambiguïté :

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<ID de l'entreprise>",
  "c":   "<ID de l'avis>",
  "h":   "<SHA-256 du texte de l'avis>",
  "rh":  "<SHA-256 de l'ensemble du jeu de données soumis>",
  "rv":  1,
  "qh":  "<SHA-256 de l'enveloppe QR, uniquement pour les avis par QR>",
  "iat": 1757203200
}

C'est notre message mm. Il lie ensemble :

  1. à quelle entreprise l'avis se rapporte (f),
  2. de quel avis il s'agit (c),
  3. quel texte se trouvait derrière — sous forme de condensé (h),
  4. quel jeu de données a été soumis dans son ensemble (rh) : texte, cœurs, statut géographique et indications de motif, sérialisés de façon canonique puis hachés, dans la version de schéma rv,
  5. de quel QR code provient l'avis (qh) — pour un avis sans QR, le champ disparaît,
  6. quand la signature a été apposée (iat).

Un seul caractère modifié dans le texte de l'avis brise cette chaîne. C'est précisément le but — et depuis rh, il en va de même pour un cœur déplacé après coup ou un statut géographique modifié.


3. Le problème de fond

Un lecteur qui arrive sur le profil d'une entreprise se pose deux questions :

  1. Cet avis provient-il réellement du système McGesund ?
  2. A-t-il été modifié après coup ?

Pour cela, il existe une paire de clés :

  • une clé privée — elle reste dans le service de signature
  • une clé publique — tout le monde peut l'avoir

La signature se fait avec la clé privée, la vérification avec la clé publique. Et ce sur l'appareil du lecteur, pas sur notre serveur.


4. Pourquoi FALCON ?

Beaucoup de procédés de signature actuels reposent sur des problèmes difficiles pour les ordinateurs classiques, mais qui pourraient devenir nettement plus faciles pour des ordinateurs quantiques suffisamment grands.

Pour un avis, cela compte davantage que pour un message éphémère : un avis doit encore être vérifiable dans cinq ou dix ans. Qui signe aujourd'hui signe pour toute la durée de vie de l'entrée.

FALCON repose donc sur la cryptographie fondée sur les réseaux euclidiens :

On construit un réseau facile à décrire mathématiquement, dans lequel une certaine tâche de recherche est extrêmement difficile.


5. Qu'est-ce qu'un réseau euclidien ?

Deux vecteurs :

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

Toutes les combinaisons à coefficients entiers

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

forment un réseau de points. Par exemple :

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
Deux vecteurs engendrent un réseau. Chaque point est une combinaison à coefficients entiers des deux — celui qui est marqué provient de deux fois v₁ et trois fois v₂.

L'essentiel est ceci :

Le réseau lui-même est facile à décrire. Y trouver certaines propriétés est très difficile.


6. Le secret, ce sont les vecteurs courts

La tâche difficile classique s'énonce ainsi :

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

C'est le Shortest Vector Problem, le problème du vecteur le plus court. En dimension deux, on peut le résoudre par essais successifs. FALCON travaille en dimension 512 ou 1024 — là, c'est sans espoir.

base longuepresque parallèlesvecteur le plus court
Le même réseau, deux descriptions. Les vecteurs gris l'engendrent également, mais ils sont longs et presque parallèles — une mauvaise base. Le vecteur court, lui, est ce qui est difficile à trouver.

FALCON n'a toutefois pas besoin du plus court vecteur en soi, mais de quelque chose d'apparenté : trouver, pour un point cible donné, un point du réseau qui en soit proche. Là encore, c'est difficile sans la bonne information complémentaire.

point cible issu de l'avispoint de réseau prochetrès éloigné
Le point cible issu de l'avis (cercle creux) n'appartient pas au réseau. On cherche un point du réseau tout près de lui — le chemin en pointillés vers un point lointain est lui aussi une solution de la première condition, mais il n'est justement pas court.

7. Des polynômes plutôt que des nombres

FALCON utilise un réseau NTRU et calcule avec des polynômes. Donc avec des listes de coefficients plutôt qu'avec des nombres isolés :

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.

Les calculs se font dans l'anneau

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

Cela signifie :

  • Zq\mathbb{Z}_q : calcul modulo qq. Pour q=7q=7 par exemple, 10310\equiv3, car 107=310-7=3.
  • xn=1x^n=-1 : maintient les polynômes à une longueur fixe.

FALCON utilise concrètement :

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

8. L'astuce centrale

La clé privée est constituée de quatre petits polynômes

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

vérifiant l'équation NTRU

fGgF=q.fG-gF=q.

Ces quatre-là forment ensemble une base secrète et bien conditionnée du réseau — une description du réseau à partir de vecteurs courts.

La clé publique est pour l'essentiel un unique polynôme :

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

De hh découle le même réseau, mais dans une base peu maniable faite de vecteurs longs :

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

C'est là tout le cœur de FALCON. Les deux bases décrivent le même réseau. Simplement, l'une est utilisable pour calculer et l'autre non.

On peut se le représenter comme un plan de ville : la carte complète est publique. Ce qui est secret, c'est la connaissance des raccourcis.


9. L'avis devient un point

Avant la signature, l'objet payload passe par une fonction de hachage. FALCON emploie pour cela Hash-to-Point : du message on ne tire pas une valeur numérique, mais directement un point de l'anneau.

Le service de signature tire en outre un sel aléatoire rr (320 bits) et le hache avec le reste :

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

Le sel n'est pas un accessoire. Sans lui, un même avis donnerait toujours la même signature, et de nombreuses signatures permettraient de reconstruire la base secrète. Il voyage donc avec la signature.


10. Ce qu'est une signature valide

On cherche un couple

(s1,s2)(s_1,s_2)

possédant deux propriétés :

s1+s2hc(modq)et(s1,s2)  petit.s_1+s_2\,h\equiv c \pmod q \qquad\text{et}\qquad \|(s_1,s_2)\|\;\text{petit}.

La première condition seule est triviale à satisfaire — il suffit de poser s2=0s_2=0 et s1=cs_1=c. C'est la seconde condition qui rend la tâche difficile.

La brieˋveteˊ est la signature.\boxed{\text{La brièveté est la signature.}}

11. Un mini-exemple entièrement calculé

Nous réduisons tout à une taille de jouet : des polynômes à un seul coefficient, donc des nombres ordinaires, et

q=97.q=97.

La clé secrète. Deux petits nombres :

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

La clé publique. On a 3165(mod97)3^{-1}\equiv65 \pmod{97}, car 365=195=297+13\cdot65=195=2\cdot97+1. Donc :

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

Le réseau. L={(s1,s2):s1+34s20(mod97)}L=\{(s_1,s_2): s_1+34\,s_2\equiv0 \pmod{97}\}.

La base publique découle directement de hh :

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

Les deux appartiennent à LL — et les deux sont longs.

La base secrète n'est connue que du service de signature :

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

car 5+343=970-5+34\cdot3=97\equiv0 et 9+34(14)=485=5970-9+34\cdot(-14)=-485=-5\cdot97\equiv0. Le déterminant vaut

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

l'équation NTRU est donc satisfaite. Les deux vecteurs sont courts.


Étape 1 : hacher l'avis

Supposons que l'objet payload de l'avis donne

c=71.c=71.

Étape 2 : une première solution, mauvaise

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

vérifie 71+340=71c71+34\cdot0=71\equiv c. Mais la longueur vaut 7171 — bien trop long.

Étape 3 : raccourcir grâce à la base secrète

Le service de signature exprime le point cible dans sa base courte :

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

Cela conduit à a10,25a\approx-10{,}25 et b2,20b\approx-2{,}20. Arrondis à a=10a=-10 et b=2b=-2, on obtient le point du réseau

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

Contrôle : 68+34(2)=6868=068+34\cdot(-2)=68-68=0, il appartient donc bien à LL. On soustrait :

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

Longueur :

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

Voilà la signature.

Étape 4 : le même procédé avec la base publique

Qui ne connaît que h=34h=34 dispose de la base {(97,0),(34,1)}\{(97,0),(-34,1)\}. Le même calcul d'arrondi y donne le point de réseau (97,0)(97,0), et donc

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

C'est également une solution valide de l'équation — mais sept fois plus longue. Si la borne d'acceptation est fixée en dessous de 26, elle ne vaut rien.

Meˆme algorithme, meˆme reˊseau, meˆme point cible.Seule la base diffeˋre — et donc le reˊsultat.\boxed{ \begin{array}{c} \text{Même algorithme, même réseau, même point cible.}\\ \text{Seule la base diffère — et donc le résultat.} \end{array}}

C'est la trappe de FALCON en une ligne.

Étape 5 : le navigateur vérifie

Le navigateur reçoit l'avis, le sel et s2=2s_2=2. Il recalcule le condensé, obtient c=71c=71, reconstruit

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

et vérifie la longueur :

(3,2)=13    βSignature valide\|(3,2)\|=\sqrt{13}\;\leq\;\beta \quad\Longrightarrow\quad \boxed{\text{Signature valide}}

Étape 6 : quelqu'un modifie le texte de l'avis

Si le texte est modifié après coup, le condensé du contenu change, et avec lui le point — disons

c=40.c'=40.

L'ancienne signature reste (3,2)(3,2), mais

3+342=7140Signature invalide3+34\cdot2=71\neq40 \quad\Longrightarrow\quad \boxed{\text{Signature invalide}}

Nous pouvons supprimer un avis. Nous ne pouvons pas le modifier sans que cela se voie.

Précision de transparence sur l'exemple

En dimension deux, un attaquant peut simplement essayer les solutions courtes une à une — pour c=40c'=40, par exemple (6,1)(6,1). Cet exemple n'est pas sûr ; il ne montre que le mécanisme. Avec FALCON-1024, le vecteur compte 2048 coefficients, et là, les essais successifs ne mènent nulle part.


12. Pourquoi ne pas simplement arrondir ?

Le procédé de l'étape 3 s'appelle l'arrondi de Babai. Pour un exemple pédagogique, il suffit — pour un véritable procédé de signature, non.

La raison : les signatures arrondies ne sont pas réparties uniformément. Leur forme dépend de la géométrie de la base secrète. À partir d'un nombre suffisant de signatures, cette géométrie se laisserait reconstruire — et avec elle la clé privée. C'est exactement là-dessus que des procédés de signature antérieurs fondés sur les réseaux ont échoué.

FALCON tire donc les vecteurs courts selon une loi gaussienne discrète sur le réseau :

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

Les valeurs proches du point cible sont plus probables, mais laquelle est retenue exactement reste aléatoire. Le résultat est une distribution qui ne révèle rien de la base utilisée — mathématiquement : elle est indistinguable d'une distribution ne dépendant que du réseau lui-même.

Cet échantillonneur est la partie la plus exigeante de FALCON. Il procède récursivement sur une structure arborescente et travaille avec des nombres à virgule flottante — ce qui rend l'implémentation délicate et explique avant tout que FALCON soit plus difficile à mettre en œuvre correctement que ML-DSA.


13. Ce qui est réellement transmis

La signature est constituée de

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

Seulement s2s_2 — pas le couple. Le vérificateur calcule s1s_1 lui-même :

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

Comme les coefficients de s2s_2 sont petits et dispersés autour de zéro, ils se compressent fortement. C'est la raison des signatures remarquablement compactes de FALCON :

clé publiquesignature
FALCON-512897 o~666 o
FALCON-10241 793 o~1 280 o

À titre de comparaison : ML-DSA-87 demande 4 627 octets. Chez McGesund, aucune de ces signatures ne se trouve toutefois dans le QR code lui-même — l'autocollant ne porte que l'enveloppe Ed25519 ; les sceaux post-quantiques sont stockés auprès du jeu de données et chargés au moment de la vérification. Ici, la taille ne décide donc pas de l'imprimabilité, mais du stockage et de la transmission : un sceau FALCON occupe environ un quart d'un sceau ML-DSA.


14. Pourquoi FALCON vérifie vite

La multiplication de polynômes coûte, en version naïve,

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

Avec la transformation de Fourier rapide, cela descend à environ

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

Pour n=1024n=1024, c'est la différence entre un million et environ dix mille opérations. C'est pourquoi la vérification s'exécute en quelques millisecondes dans le navigateur d'un visiteur — et c'est aussi pourquoi le F figure dans le nom :

FAst Fourier Lattice-based COmpact signatures over NTRU.


15. Le déroulement en image

SERVICE DE SIGNATURE (MCGESUND)NAVIGATEUR DU VISITEURclé privée (f, g, F, G — base courte)Payload m = {entreprise, avis, h, rh, iat}sel r + HashToPoint(r ‖ m) = céchantillonnage gaussien : vecteur court (s₁, s₂)Signature σ = (r, s₂) + kidavis + σ + clé publique hrecalculer c, s₁ = c − s₂·h‖(s₁, s₂)‖ ≤ β ?valideinvalide
Du payload jusqu'à la coche dans le navigateur. Tout ce qui se trouve au-dessus de la ligne de séparation se produit une seule fois lors de l'envoi, tout ce qui est en dessous à nouveau chez chaque visiteur — sur son appareil, avec la clé publique.

16. Pourquoi un attaquant échoue

Il connaît hh et donc l'ensemble du réseau. Il connaît aussi le point cible cc dès que l'avis est public. Ce qui lui manque, c'est la base courte.

Pour falsifier un avis, il devrait trouver, pour un cc choisi par lui-même, un vecteur court — à partir de la seule description publique. C'est la tâche qu'a illustrée l'étape 4 de l'exemple : sans les bons vecteurs, le même calcul aboutit à une solution beaucoup trop longue.

En dimension 1024, les meilleures méthodes connues — classiques comme quantiques — en sont très loin.

Signer : rapideVeˊrifier : rapideFalsifier : difficile\boxed{\text{Signer : rapide}\quad \text{Vérifier : rapide}\quad \text{Falsifier : difficile}}

17. Ce que McGesund en fait concrètement

L'enveloppe. Chaque avis signé porte une signature Ed25519. C'est la variante obligatoire — classique, très petite, vérifiable nativement dans tous les navigateurs.

Les sceaux post-quantiques. À côté viennent une ou deux signatures résistantes au quantique. Lesquelles, cela dépend de la formule tarifaire :

Formuleniveaux de signature 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, les deux en parallèle

La variante parallèle est délibérément redondante. FALCON repose sur les réseaux NTRU, ML-DSA sur les réseaux modulaires. Si l'une des deux familles s'avérait plus faible qu'on ne le suppose aujourd'hui, l'autre continuerait de porter.

L'ancrage temporel. L'empreinte de la clé de signature est ancrée dans un bloc Bitcoin via OpenTimestamps. Il est ainsi démontré non seulement que la signature est authentique, mais aussi qu'elle existait déjà à un instant donné — sans que quiconque ait à croire notre horodatage.

Tout cela est calculé dans le navigateur du lecteur, via un module WASM. Nous fournissons les données ; la vérification s'exécute sur l'appareil du visiteur. Si nous quittions le réseau demain, un avis une fois chargé resterait vérifiable.

Pour situer les noms : FALCON est actuellement en cours de normalisation sous le nom FN-DSA ; le projet est prévu comme FIPS 206, mais n'est pas encore finalisé. C'est pourquoi les niveaux s'appellent FN-DSA-512 et FN-DSA-1024 dans le code de McGesund, même si l'usage courant continue de parler de FALCON.


18. L'intuition essentielle

La clé publique est la description complète d'un labyrinthe. Chacun peut la consulter.

La signature est la preuve : « J'ai trouvé un chemin très court pour exactement cet avis. »

La clé privée est la connaissance des raccourcis.

Le lecteur n'a pas besoin de connaître les raccourcis. Il se contente de mesurer si le chemin présenté est effectivement court et s'il correspond effectivement à cet avis. Il peut faire les deux sans nous.

FALCON transforme un avis en un point d’un reˊseauet la signature en un court chemin vers ce point.\boxed{ \begin{array}{c} \text{FALCON transforme un avis en un point d'un réseau}\\ \text{et la signature en un court chemin vers ce point.} \end{array}}

Qui modifie le texte déplace le point — et l'ancien chemin ne mène plus nulle part.