Procédé de signature

ML-DSA-87 expliqué mathématiquement

Comment ML-DSA-87 (FIPS 204) signe un avis McGesund — de Module-LWE au rejection sampling, jusqu'à la vérification dans le navigateur.

Mise à jour : 2026-09-07

1. De quoi il s'agit

Lorsque quelqu'un dépose un avis sur McGesund, il se passe en arrière-plan davantage que le texte ne le laisse supposer. L'avis est signé numériquement au moment de son envoi. Chaque visiteur peut ensuite recalculer cette signature dans son propre navigateur — sans nous faire confiance et sans avoir à nous demander quoi que ce soit.

Pour les clients à partir de la formule Pro, cela se fait notamment avec ML-DSA-87. Cet article explique ce qui se passe alors sur le plan mathématique.

Un point important d'emblée :

ML-DSA n'est pas un chiffrement. Le texte de l'avis reste lisible publiquement — c'est bien le sens d'un avis. ML-DSA ne prouve pas la confidentialité, mais l'origine et l'intégrité.

ML-DSA est issu de CRYSTALS-Dilithium et est normalisé sous le nom FIPS 204. Le nombre 87 désigne le niveau de paramètres. Il en existe trois :

  • ML-DSA-44
  • ML-DSA-65
  • ML-DSA-87

ML-DSA-87 est le plus élevé et relève de la catégorie de sécurité NIST 5.


2. Qu'est-ce qui est signé exactement ?

Ce n'est pas le texte de l'avis lui-même qui entre dans la signature, mais un objet de données compact qui fixe le texte sans ambiguïté. Chez McGesund, il se présente pour l'essentiel ainsi :

{
  "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
}

Cet objet est notre message mm. Il lie ensemble six affirmations :

  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 dans son ensemble a été soumis (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) ; sans QR, le champ disparaît
  6. Quand la signature a été apposée (iat)

Si quelqu'un modifie plus tard un seul caractère du texte de l'avis, h ne correspond plus — et rh non plus. Qui ne touche en revanche qu'aux cœurs laisse h intact, mais brise rh. Dès que l'un de ces condensés change, la signature ne correspond plus. C'est précisément cette chaîne qui fait tout l'intérêt.


3. Ce que la signature doit garantir

Un visiteur qui lit l'avis doit pouvoir vérifier trois choses par lui-même :

  1. L'avis a bien été émis par McGesund.
  2. Le texte n'a pas été modifié depuis son envoi.
  3. Personne ne peut inventer un nouvel avis d'apparence valide.

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

  • une clé privée — elle se trouve exclusivement dans le service de signature
  • une clé publique — tout le monde peut l'avoir ; elle est adressée par l'identifiant de clé (kid) présent dans l'enveloppe

La signature se fait avec la clé privée. La vérification se fait avec la clé publique — et ce dans le navigateur du lecteur, pas sur notre serveur.


4. Pourquoi un procédé post-quantique ?

Beaucoup de procédés de signature courants aujourd'hui reposent sur la factorisation de grands nombres ou sur les logarithmes discrets. Un ordinateur quantique suffisamment puissant pourrait résoudre précisément ces problèmes bien plus rapidement, avec des algorithmes connus.

Pour un avis, ce n'est pas une question académique. Un avis doit encore être vérifiable dans dix ans. Qui signe aujourd'hui signe pour toute la durée de vie de l'entrée.

ML-DSA s'appuie donc sur une autre base :

Probleˋmes de reˊseaux euclidiens\boxed{\text{Problèmes de réseaux euclidiens}}

Plus précisément : Module-LWE et Module-SIS.


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

D'abord, simplement des points dans l'espace. Prenons deux vecteurs :

b1=(2,0),b2=(1,2).b_1=(2,0), \qquad b_2=(1,2).

Toutes les combinaisons à coefficients entiers

ab1+bb2,a,bZa\,b_1+b\,b_2, \qquad a,b\in\mathbb{Z}

forment le réseau. Par exemple :

2b1+b2=(4,0)+(1,2)=(5,2).2b_1+b_2 = (4,0)+(1,2) = (5,2).
b₁ = (2,0)b₂ = (1,2)(5,2)0
Deux vecteurs, toutes les combinaisons à coefficients entiers qu'on en tire : un réseau. Le point marqué provient de deux fois b₁ et une fois b₂.

L'essentiel :

En petite dimension, les problèmes de réseaux sont faciles. En très grande dimension, certaines tâches deviennent extrêmement difficiles.


6. Des polynômes plutôt que des nombres isolés

ML-DSA ne calcule pas avec des vecteurs à deux dimensions, mais avec des polynômes et des vecteurs de polynômes.

Un polynôme comme

a(x)=1+2x+x3a(x)=1+2x+x^3

s'écrit sous forme de liste de coefficients :

a=(1,2,0,1).a=(1,2,0,1).

Les calculs se font dans un anneau :

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

Cela signifie deux choses :

  • Zq\mathbb{Z}_q : calcul modulo qq
  • xn=1x^n=-1 : une règle supplémentaire qui fixe la longueur des polynômes

Pour les trois niveaux de ML-DSA :

n=256,q=8380417.n=256, \qquad q=8380417.

Un polynôme compte donc 256 coefficients, considérés modulo 8 380 417. Ce qui change d'un niveau à l'autre, ce n'est ni nn ni qq, mais la taille des matrices — nous y reviendrons.

Au passage : en pratique, la multiplication de polynômes dans cet anneau passe par la NTT, la variante en théorie des nombres de la transformation de Fourier rapide. ML-DSA ne se passe donc nullement des idées de la FFT ; elles sont seulement logées dans l'arithmétique plutôt que dans le principe de signature.


7. L'astuce centrale : Module-LWE

L'idée de fond est Module Learning With Errors :

t=As1+s2(modq).\mathbf{t}=\mathbf{A}\mathbf{s}_1+\mathbf{s}_2 \pmod q.

Où :

  • A\mathbf{A} — matrice publique de polynômes, d'apparence aléatoire
  • s1,s2\mathbf{s}_1,\mathbf{s}_2 — petits vecteurs secrets
  • t\mathbf{t} — valeur publique

Un attaquant connaît A\mathbf{A} et t\mathbf{t}, mais pas s1,s2\mathbf{s}_1,\mathbf{s}_2. À ses yeux, l'équation ressemble à une équation aléatoire bruitée. Il ne doit pas pouvoir en extraire efficacement les petits secrets.


8. Un tout petit exemple chiffré

Nous prenons volontairement une variante ridiculement petite — des nombres ordinaires plutôt que des polynômes, la dimension 2 plutôt que 256, et

q=17.q=17.

Soit

A=(3572),s1=(11),s2=(10).A=\begin{pmatrix}3&5\\7&2\end{pmatrix}, \qquad \mathbf{s}_1=\begin{pmatrix}1\\-1\end{pmatrix}, \qquad \mathbf{s}_2=\begin{pmatrix}1\\0\end{pmatrix}.

Alors :

As1=(3572)=(25),A\mathbf{s}_1=\begin{pmatrix}3-5\\7-2\end{pmatrix}=\begin{pmatrix}-2\\5\end{pmatrix},
t=As1+s2=(25)+(10)=(15)    (165)(mod17).\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2=\begin{pmatrix}-2\\5\end{pmatrix}+\begin{pmatrix}1\\0\end{pmatrix}=\begin{pmatrix}-1\\5\end{pmatrix} \;\equiv\; \boxed{\begin{pmatrix}16\\5\end{pmatrix}} \pmod{17}.

À ce format miniature, on pourrait essayer toutes les possibilités. Avec ML-DSA-87, A\mathbf{A} est une matrice 8×78\times 7 de polynômes comptant chacun 256 coefficients — soit plus de 14 000 inconnues dans la structure du réseau.


9. La paire de clés du service de signature

La clé privée contient entre autres les petits vecteurs s1,s2\mathbf{s}_1,\mathbf{s}_2. Pour ML-DSA-87, leurs coefficients proviennent de l'intervalle

[η,η]avecη=2,[-\eta,\eta] \quad\text{avec}\quad \eta=2,

donc de {2,1,0,1,2}\{-2,-1,0,1,2\}. Cette petitesse n'est pas un détail, c'est le cœur du sujet : c'est uniquement parce que les secrets sont petits qu'un problème de réseau difficile apparaît.

La clé publique est, de façon simplifiée,

(ρ,t1).(\rho,\mathbf{t}_1).

ρ\rho est une graine à partir de laquelle A\mathbf{A} se reconstruit de façon déterministe — la matrice n'a donc pas besoin d'être transmise. t1\mathbf{t}_1 correspond aux bits de poids fort de t\mathbf{t} ; les d=13d=13 bits de poids faible sont omis, ce qui réduit nettement la clé. Cette omission explique plus loin l'existence des fameux hints.

L'asymétrie recherchée apparaît ainsi :

veˊrifier publiquement    signer secreˋtement\boxed{\text{vérifier publiquement}\;\neq\;\text{signer secrètement}}

10. L'avis devient un nombre

Le service de signature commence par hacher l'objet payload de la section 2 :

μ=H(m).\mu=H(m).

Dans notre exemple jouet, nous prenons un mini-condensé artificiel. Dans le système réel, μ\mu fait 512 bits et lie en outre la clé publique — ce qui empêche de réinterpréter une signature comme portant sur une autre clé.


11. L'engagement (commitment)

Le service de signature tire un petit vecteur aléatoire y\mathbf{y}. Dans notre exemple :

y=(21).\mathbf{y}=\begin{pmatrix}2\\-1\end{pmatrix}.

Il en découle une valeur intermédiaire, l'engagement :

w=Ay=(32+5(1)72+2(1))=(112).\mathbf{w}=A\mathbf{y} =\begin{pmatrix}3\cdot2+5\cdot(-1)\\7\cdot2+2\cdot(-1)\end{pmatrix} =\begin{pmatrix}1\\12\end{pmatrix}.

Ce n'est pas encore une signature.


12. L'avis devient un challenge

Message et engagement sont hachés ensemble :

c=H(μ,w).c=H(\mu,\mathbf{w}).

Pour ML-DSA-87, cc est un polynôme comportant exactement τ=60\tau=60 coefficients valant {1,+1}\{-1,+1\}, les 196 autres étant nuls. Cette structure est voulue : elle maintient cs1c\cdot\mathbf{s}_1 petit.

Dans notre exemple jouet, nous posons simplement

c=2.c=2.

13. La signature proprement dite

z=y+cs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1.

Avec nos valeurs :

cs1=2(11)=(22),c\,\mathbf{s}_1=2\begin{pmatrix}1\\-1\end{pmatrix}=\begin{pmatrix}2\\-2\end{pmatrix},
z=(21)+(22)=(43)\mathbf{z}=\begin{pmatrix}2\\-1\end{pmatrix}+\begin{pmatrix}2\\-2\end{pmatrix} =\boxed{\begin{pmatrix}4\\-3\end{pmatrix}}

14. L'étape que l'on néglige facilement : le rejection sampling

C'est ici que se situe le point qui distingue ML-DSA d'une construction naïve — et il n'est pas optionnel.

z=y+cs1\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 contient le secret s1\mathbf{s}_1. Si l'on publiait tout simplement z\mathbf{z} à chaque fois, s1\mathbf{s}_1 pourrait être retrouvé statistiquement à partir d'un nombre suffisant de signatures. Pour une plateforme d'avis produisant énormément de signatures par jour, ce n'est pas un risque théorique.

C'est pourquoi le service de signature vérifie avant publication si z\mathbf{z} en révèle trop et, le cas échéant, rejette la signature — le processus recommence alors depuis le début avec un nouveau y\mathbf{y} aléatoire. C'est ce qu'on appelle Fiat-Shamir with Aborts.

La condition s'écrit pour l'essentiel :

z<γ1β.\|\mathbf{z}\|_\infty < \gamma_1-\beta.
Engagement w = AyChallenge c = H(μ, w)Réponse z = y + c · s₁‖z‖∞ < γ₁ − β ?ouila signature est émisenon — nouveau y
Trois étapes et une boucle. Si z est trop grand, on ne le corrige pas — tout le passage est rejeté et l'on recommence avec un y aléatoire tout neuf. C'est pourquoi signer est ici un procédé itératif.

Pour ML-DSA-87, on a γ1=219\gamma_1=2^{19} et β=τη=602=120\beta=\tau\cdot\eta=60\cdot2=120. S'y ajoute une seconde borne portant sur les bits de poids faible. En pratique, plusieurs passages sont normaux — signer est donc un procédé itératif, pas une étape unique.

Pour la vérification, un point est important : c'est exactement cette borne que le navigateur contrôle plus tard. Une signature aux coefficients trop grands est rejetée, même si l'équation est vérifiée.


15. Pourquoi le navigateur peut vérifier tout cela

Le navigateur du lecteur connaît :

  • l'avis, et donc mm
  • la clé publique (ρ,t1)(\rho,\mathbf{t}_1)
  • la signature (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h})

Il ne connaît pas s1\mathbf{s}_1. La relation qui lui permet malgré tout d'avancer :

z=y+cs1Az=Ay+cAs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 \quad\Longrightarrow\quad A\mathbf{z}=A\mathbf{y}+c\,A\mathbf{s}_1.

Et comme

t=As1+s2\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2

est vérifié, le terme inconnu As1A\mathbf{s}_1 peut être remplacé par la valeur publique :

Azct=Aycs2.A\mathbf{z}-c\,\mathbf{t}=A\mathbf{y}-c\,\mathbf{s}_2.

C'est l'équation centrale — et elle dit quelque chose d'important : le navigateur ne reconstruit pas exactement AyA\mathbf{y}, mais seulement à un petit terme cs2c\,\mathbf{s}_2 près.


16. Le mini-exemple jusqu'au bout

Nous avions :

A=(3572),t=(15),c=2,z=(43).A=\begin{pmatrix}3&5\\7&2\end{pmatrix},\quad \mathbf{t}=\begin{pmatrix}-1\\5\end{pmatrix},\quad c=2,\quad \mathbf{z}=\begin{pmatrix}4\\-3\end{pmatrix}.

Vérifions :

Az=(1215286)=(322),ct=2(15)=(210),A\mathbf{z}=\begin{pmatrix}12-15\\28-6\end{pmatrix}=\begin{pmatrix}-3\\22\end{pmatrix}, \qquad c\,\mathbf{t}=2\begin{pmatrix}-1\\5\end{pmatrix}=\begin{pmatrix}-2\\10\end{pmatrix},
Azct=(112).A\mathbf{z}-c\,\mathbf{t}=\begin{pmatrix}-1\\12\end{pmatrix}.

L'engagement initial était

w=(112).\mathbf{w}=\begin{pmatrix}1\\12\end{pmatrix}.

La différence vaut

(112)(112)=(20)=cs2.\begin{pmatrix}-1\\12\end{pmatrix}-\begin{pmatrix}1\\12\end{pmatrix} =\begin{pmatrix}-2\\0\end{pmatrix} =-c\,\mathbf{s}_2.

Soit exactement le petit terme d'erreur annoncé. Le vérificateur ne reçoit pas w\mathbf{w}, mais quelque chose qui se trouve à proximité de w\mathbf{w}.

C'est précisément pourquoi ML-DSA ne compare pas les valeurs elles-mêmes, mais leurs bits de poids fort. Et c'est précisément pourquoi la signature contient en plus un vecteur de hints h\mathbf{h} : il indique de façon compacte à quels endroits l'arrondi a basculé au-delà d'une limite sous l'effet du petit terme d'erreur. Pour ML-DSA-87, au plus ω=75\omega=75 de ces indications sont autorisées. Elles ne révèlent pas le secret — elles ne font que réparer l'arrondi.

Pour finir, le navigateur recalcule le challenge. S'il concorde,

cnouveau=c,c_{\text{nouveau}}=c,

et si toutes les normes respectent les bornes, la signature est valide.


17. Que se passe-t-il si quelqu'un modifie l'avis ?

Supposons que quelqu'un disposant d'un accès à la base de données — y compris quelqu'un chez nous — modifie le texte de l'avis ou l'un des cœurs. Alors au moins l'un des deux condensés du payload change (h pour le texte, rh pour n'importe quel champ du jeu de données) :

H(m)H(m).H(m)\neq H(m').

Le challenge change donc :

cc.c\neq c'.

Or la signature existante a été produite pour l'ancien challenge. Le navigateur refait le calcul et constate :

cnouveaucsignatureSignature invalidec_{\text{nouveau}}\neq c_{\text{signature}} \quad\Longrightarrow\quad \boxed{\text{Signature invalide}}

La phrase décisive tient en ceci : nous pouvons supprimer un avis, mais nous ne pouvons pas le modifier sans que cela se remarque. Chez McGesund, la même vérification tourne en outre chaque nuit côté serveur sur l'ensemble du parc — un avis qui ne passe pas cette vérification n'entre plus dans la moyenne de l'entreprise.


18. Pourquoi personne ne peut inventer une signature ?

Un attaquant connaît A\mathbf{A} et t\mathbf{t}, mais pas s1,s2\mathbf{s}_1,\mathbf{s}_2. Pour construire une signature valide, il devrait trouver un triplet (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) qui

  • satisfait l'équation de vérification et
  • respecte les bornes sur les normes et
  • correspond au challenge qui découle lui-même exactement de ces valeurs.

Cela revient au fond à un problème de réseau difficile — concrètement à Module-SIS : trouver des solutions courtes d'une équation homogène modulo qq. La condition de petitesse n'est pas un accessoire, elle constitue la difficulté même. Sans elle, une solution serait triviale.

donneˊes publiques    probleˋme de reˊseau difficile\boxed{\text{données publiques}\;\rightarrow\;\text{problème de réseau difficile}}

19. Pourquoi « module » ?

Le mot décrit la structure intermédiaire entre les vecteurs simples et les réseaux généraux. Plutôt que de calculer avec des nombres isolés, ML-DSA travaille avec des vecteurs de polynômes :

a=(a1(x),a2(x),,ak(x)),\mathbf{a}=(a_1(x),a_2(x),\ldots,a_k(x)),

et avec des matrices formées de ceux-ci :

A=(a1,1(x)a1,2(x)a2,1(x)a2,2(x)).\mathbf{A}= \begin{pmatrix} a_{1,1}(x)&a_{1,2}(x)&\cdots\\ a_{2,1}(x)&a_{2,2}(x)&\cdots\\ \vdots&\vdots&\ddots \end{pmatrix}.

L'avantage : on obtient la grande dimension d'un réseau tout en conservant une représentation compacte et efficacement calculable. La sécurité se règle finement par la taille de la matrice, sans changer d'anneau.


20. Pourquoi précisément 87 ?

Les trois niveaux ne diffèrent pas par l'anneau, mais par les dimensions :

ParamètreML-DSA-44ML-DSA-65ML-DSA-87
Taille de matrice (k,)(k,\ell)4×44\times46×56\times58×78\times7
Plage du secret η\eta242
Poids du challenge τ\tau394960
Clé publique1 312 o1 952 o2 592 o
Signature2 420 o3 309 o4 627 o
Catégorie NIST235

À noter : ML-DSA-87 n'est pas simplement « ML-DSA-65 en plus grand ». La plage du secret η\eta repasse de 4 à 2 ; ici, la sécurité vient de la matrice plus grande, non de coefficients plus grands. Il s'agit d'un choix de paramètres autonome et normalisé.

structure matheˊmatique plus grandemarge de seˊcuriteˊ plus eˊleveˊe\boxed{\text{structure mathématique plus grande}\rightarrow\text{marge de sécurité plus élevée}}

Le prix à payer : 4 627 octets par signature — par sceau stocké puis livré au navigateur au moment de la vérification. C'est pourquoi, chez McGesund, FALCON est proposé à côté de ML-DSA-87, avec ses 1 280 octets.


21. Fiat-Shamir : pourquoi cela fonctionne sans interlocuteur

Une preuve interactive se déroulerait ainsi :

  1. Le service de signature envoie un engagement.
  2. Le vérificateur envoie un challenge aléatoire.
  3. Le service de signature répond.
  4. Le vérificateur refait le calcul.

Pour un avis, ce dialogue n'existe pas — le lecteur arrive des mois plus tard. La solution est la transformation de Fiat-Shamir : le challenge n'est pas tiré au sort, il est haché à partir des données elles-mêmes :

c=H(cleˊ publique,  message,  engagement).c=H(\text{clé publique},\;\text{message},\;\text{engagement}).

Un dialogue devient ainsi un document. Le service de signature ne peut pas choisir son challenge, car il lui faudrait pour cela contrôler la fonction de hachage.


22. Le déroulement complet

SERVICE DE SIGNATURE (MCGESUND)NAVIGATEUR DU VISITEURclé privée s₁, s₂Payload m = {entreprise, avis, h, rh, iat}condensé μvecteur aléatoire yEngagement w = AyChallenge c = H(μ, w)z = y + c · s₁Signature (c, z, hints) + kidavis + signature + clé publiqueAz − c·t → bits de poids fort + hintsrecalculer le challengechallenge recalculé = challenge fourni ?valideinvaliderejeter si z est trop grand(rejection sampling)
Tout le parcours d'un avis. Le retour en pointillés représente le rejection sampling — il est emprunté autant de fois qu'il le faut pour que z soit assez petit pour ne rien révéler de la clé secrète.

23. Ce que McGesund en fait concrètement

Trois niveaux s'imbriquent :

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

Les sceaux post-quantiques. S'y ajoutent, en option, 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. Si l'une des deux familles mathématiques — les réseaux NTRU pour FALCON, les réseaux modulaires pour ML-DSA — 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. Cela permet de démontrer 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 vérifié dans le navigateur du lecteur, via un module WASM. Nous fournissons les données ; le calcul se fait sur l'appareil du visiteur. Si nous quittions le réseau demain, un avis une fois téléchargé resterait vérifiable.


24. ML-DSA et FALCON côte à côte

PropriétéFALCON (FN-DSA)ML-DSA
Typesignature numériquesignature numérique
Famille de réseauxNTRUModule-LWE / Module-SIS
AnneauZq[x]/(xn+1)\mathbb{Z}_q[x]/(x^n+1), q=12289q=12289Zq[x]/(x256+1)\mathbb{Z}_q[x]/(x^{256}+1), q=8380417q=8380417
Mécanisme centralvecteur court par échantillonnage gaussienchallenge-réponse avec abandons
FFT / NTTFFT en virgule flottante, critique pour la sécuritéNTT, arithmétique uniquement
Taille de signature (niveau le plus élevé)1 280 o4 627 o
Implémentationexigeante (virgule flottante)relativement directe
Normalisationprévue comme FIPS 206 (FN-DSA), pas encore finaliséeFIPS 204, finalisée

En résumé : ML-DSA est plus facile à implémenter et à vérifier correctement, FALCON fournit des signatures nettement plus compactes. Aucun des deux ne figure dans le QR code — là ne se trouve que l'enveloppe Ed25519. La taille de signature compte donc pour le stockage et la livraison, la robustesse pour l'implémentation. C'est pourquoi nous proposons les deux.


25. Une phrase à retenir

ML-DSA produit, aˋ partir d’un court vecteur secret, une reˊponse aˋ unchallenge hacheˊ depuis l’avis lui-meˆme — veˊrifiablepar quiconque dispose de la cleˊ publique.\boxed{ \begin{array}{c} \text{ML-DSA produit, à partir d'un court vecteur secret, une réponse à un}\\ \text{challenge haché depuis l'avis lui-même — vérifiable}\\ \text{par quiconque dispose de la clé publique.} \end{array}}

Qui possède le vecteur secret signe en quelques millisecondes. Qui ne le possède pas devrait résoudre un problème de réseau en plus de 14 000 dimensions — même avec un ordinateur quantique.

Pour le lecteur d'un avis, cela signifie simplement ceci : il n'a pas besoin de nous croire. Il peut recalculer.