SA+L : autorisation de dépense et key image
Le protocole de Schnorr généralisé qui remplace la « signature » dans FCMP++
SA+L (Spend Authorization + Linkability, autorisation de dépense + liabilité) est une petite preuve sur Ed25519 pour chaque entrée. Elle montre : « je connais x et y pour la clé rerandomisée Õ, et la key image publiée L est égale à x·I pour la même sortie ». Techniquement, c’est un protocole de Schnorr généralisé (GSP) — plusieurs équations de Schnorr liées par des secrets communs.
Schnorr généralisé en une minute
Le Schnorr classique prouve la connaissance d’un seul x dans une seule équation P = x·G. La version généralisée prouve la connaissance d’un vecteur de secrets (w₁, …, wₖ) satisfaisant plusieurs équations linéaires sur des points :
Le protocole est le même que pour une seule clé :
- choisir des
α_kaléatoires et publierA_j = Σ α_k·X_{j,k}pour chaque équation ; - défi
c = Hs(tout ce qui est publié); - réponses
s_k = α_k + c·w_k; - vérification :
Σ s_k·X_{j,k} = A_j + c·Y_jpour chaquej.
Le détail clé : la même réponse s_k est utilisée dans toutes les équations où w_k apparaît. Le vérificateur apprend donc non seulement « il connaît certains secrets » mais « il connaît les mêmes secrets pour toutes les équations ». C’est ainsi que l’autorisation de dépense et la key image sont liées.
Quelles équations SA+L prouve
Publics : Õ, Ĩ, R, L et les générateurs G, T, U, V. Secrets de celui qui dépense : x, y (clé de la sortie) et r_o, r_i, r_r_i (la « peinture » de rerandomisation). En simplifiant, SA+L prouve le système :
R = r_i·V + r_r_i·T
L = x·Ĩ − (x·r_i)·U la dernière donne L = x·(Ĩ − r_i·U) = x·I ; le produit x·r_i est introduit comme un secret distinct, et le lien avec R empêche de le falsifier
Les équations exactes de la spécification diffèrent un peu (elles traitent avec soin les produits de secrets nécessaires et la manière d’éviter les fuites), mais l’idée est exactement celle-ci : une seule preuve dans laquelle x à la fois « ouvre » Õ et « produit » L.
Pourquoi pas simplement une signature
Dans RingCT, CLSAG faisait trois choses à la fois : cacher l’entrée dans un anneau, prouver l’autorisation de dépense et lier la key image. Dans FCMP++, la preuve d’appartenance prend en charge la première tâche. Il en reste deux — résolues par un protocole bien plus simple. Cela apporte :
- une petite taille — quelques points et scalaires par entrée ;
- une séparation des rôles — l’appareil qui détient la clé (un portefeuille matériel) peut calculer SA+L, tandis qu’un ordinateur sans la clé construit la lourde preuve d’appartenance ;
- la forward secrecy — grâce à
y·Tdans la clé (voir la vue d’ensemble) ; - des bases pour le multisig — la structure linéaire du GSP se répartit bien entre plusieurs signataires (schémas de type FROST).
Ce qui est signé
Le défi c inclut un hachage de toute la transaction (préfixe, sorties, engagements), comme dans CLSAG. SA+L joue donc aussi le rôle de signature : modifiez un seul octet de la transaction après signature et la preuve n’est plus valide.
Les définitions formelles se trouvent dans l’article FCMP++ de Luke Parker et dans l’implémentation en Rust (le projet monero-oxide). Le protocole et l’implémentation ont fait l’objet d’audits externes ; les liens vers les rapports sont rassemblés dans les discussions du Monero Research Lab sur GitHub.