Technique › FCMP++

SA+L : autorisation de dépense et key image

Le protocole de Schnorr généralisé qui remplace la « signature » dans FCMP++

En bref

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 :

Y_j = Σ_k w_k · X_{j,k}    for each equation j

Le protocole est le même que pour une seule clé :

  1. choisir des α_k aléatoires et publier A_j = Σ α_k·X_{j,k} pour chaque équation ;
  2. défi c = Hs(tout ce qui est publié) ;
  3. réponses s_k = α_k + c·w_k ;
  4. vérification : Σ s_k·X_{j,k} = A_j + c·Y_j pour chaque j.

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 :

Õ = x·G + (y + r_o)·T
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·T dans 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.

Pour les curieux

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.