Aller au contenu
Condorcet.vote Alpha
← Documentation technique

Preuve de vote

Démontrer qu'un bulletin publié est le sien, sans révéler sa clé secrète, mais en révélant son vote : l'opération D de cryptoVote et l'enveloppe cvproof/1 qui la transporte.

Cette page spécifie la preuve de vote des outils publics : ce qu'elle établit, qui peut la produire, le déroulé par nonce, l'enveloppe échangée champ par champ et sa vérification. Elle est volontairement explicite sur ses conséquences : une preuve remise est une divulgation de vote, vérifiable par tous et sans retour possible.

Protocole v1

Ce qu'elle établit

Cette image de clé est la mienne.

Un bulletin publié porte une image de clé à portée d'élection, jamais une identité. La preuve relie cette image de clé à une clé publique, donc au détenteur de la clé secrète correspondante.

  • Une preuve de Chaum–Pedersen. Preuve non interactive d'égalité de logarithmes discrets : le prouveur connaît un même scalaire x tel que la clé publique vaut P = x·G et l'image de clé I = x·B, où B est la base à portée d'élection. Rien d'autre n'est révélé sur x.
  • La clé secrète reste secrète. La preuve ne contient pas la clé secrète et ne permet pas de la reconstruire ; la remettre ne cède pas la clé.
  • Liée à une élection et à un nonce. L'UUID de l'élection fixe la base B et le nonce est intégré au défi : une preuve ne vaut que pour cette élection et pour ce nonce.
  • Elle révèle le vote. Rapprochée du registre, la preuve signifie : le détenteur de cette clé a déposé ce bulletin publié, dont le classement est en clair. Prouver la possession d'une image de clé, c'est divulguer, de façon prouvable, comment on a voté.
Énoncé prouvé · opération D
∃ x :  P = x·G  et  I = x·B
B = H_p(domain ‖ len(election_id) ‖ election_id ‖ P)

Ristretto255, Blake2b-512. B est la base dont le bulletin tire son image de clé : la même clé secrète donne une image de clé différente dans chaque élection.

L'image de clé dans le bulletin signé
Qui la produit

Le détenteur de la clé, et lui seul.

Produire une preuve exige la clé secrète du votant. Personne ne peut donc prouver le bulletin d'un votant à sa place, ni contre sa volonté.

  • À sa seule initiative. La preuve est un acte volontaire du votant, après le vote. Aucune étape de l'élection ne la déclenche ni ne la requiert.
  • Hors du contrôle de l'organisateur. C'est une propriété de la cryptographie, pas un réglage de la plateforme : aucun interrupteur ne l'active ou ne l'interdit, et l'organisateur ne peut ni l'empêcher ni la produire.
  • La clé vient du reçu. La clé secrète sk_… et l'image de clé ki_… du bulletin figurent dans le reçu de vote .condorcet_receipt, que l'outil sait lire directement. Ce reçu n'est remis qu'une fois et n'est jamais réémis.
  • Rien ne transite par la plateforme. La plateforme ne lit, n'écrit ni ne stocke jamais l'enveloppe : elle circule entre le votant et le demandeur, par le canal de leur choix.
Cas d'usage

Le vote par mandat.

Le besoin qui motive l'opération D : un votant, ou un mandataire ayant voté pour le compte d'un tiers, démontre après coup comment un bulletin a été exprimé.

Le reçu de vote, champ par champ
Déroulé

Un défi, une preuve, une vérification.

Trois rôles, trois appels cryptoVote. Le nonce est généré par celui qui demande la preuve, jamais par le votant.

  1. 1 Demandeur Génère un nonce aléatoire frais (generate_nonce_wasm, qui rend nonce_…) et le transmet au votant, hors de la plateforme. Un nonce neuf pour chaque demande.
  2. 2 Votant Saisit sa clé secrète sk_…, l'UUID de l'élection, l'image de clé ki_… de son bulletin (ou charge son reçu) et le nonce reçu. L'outil calcule prove_ownership_wasm(secret, election, nonce), qui rend own_…, dérive la clé publique pk_… et assemble l'enveloppe cvproof/1.
  3. 3 Votant Lit l'avertissement (la preuve révèle son vote à qui la reçoit, et celui-ci peut en convaincre d'autres), puis remet l'enveloppe, volontairement. Sa clé secrète n'a pas quitté son navigateur.
  4. 4 Demandeur, ou quiconque Vérifie la preuve (verify_ownership_wasm), puis recherche l'image de clé dans le registre publié de l'élection pour lire le bulletin correspondant.

Fraîcheur, pas non-transférabilité.

Le nonce est intégré au défi de la preuve : elle ne peut être ni précalculée ni rejouée sous un autre nonce, ce qui garantit au demandeur qu'elle a été produite pour sa demande. Mais elle reste vérifiable publiquement : quiconque détient le couple (nonce, preuve) peut en convaincre n'importe qui d'autre. Ce n'est pas une preuve à vérifieur désigné, et rien n'en réserve la portée au seul demandeur.

Enveloppe

cvproof/1, six champs.

Un unique objet JSON UTF-8, seul format d'échange que les outils produisent ou acceptent. Il ne concerne que le votant et le demandeur : aucun analyseur côté serveur, aucun stockage.

version chaîne littérale
Exactement cvproof/1 ; toute autre valeur est rejetée.
election UUID
L'UUID de l'élection, la valeur même passée aux appels WASM. Accepté en casse mixte, ramené en minuscules, sa forme canonique.
public_key pk_<64 hexa>_<8 hexa>
La clé publique P, dérivée de la clé secrète par l'outil du votant.
key_image ki_<64 hexa>_<8 hexa>
L'image de clé I à portée d'élection : celle du bulletin publié dont la possession est prouvée.
nonce nonce_<64 hexa>_<8 hexa>
Le nonce émis par le demandeur, recopié tel quel.
proof own_<128 hexa>_<8 hexa>
La sortie de prove_ownership_wasm (64 octets), recopiée telle quelle.
Exemple · cvproof/1
{
    "version": "cvproof/1",
    "election": "1f0c9b6e-4d2a-4c8e-9b7a-3e5f6a7b8c9d",
    "public_key": "pk_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef_a1b2c3d4",
    "key_image": "ki_fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210_0badc0de",
    "nonce": "nonce_00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff_5eed5eed",
    "proof": "own_0f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a6978_c0ffee00"
}

Valeurs illustratives : formes et longueurs exactes, mais motifs et sommes de contrôle fictifs. Cette enveloppe ne se vérifie pas.

  • Chaînes préfixées canoniques. public_key, key_image, nonce et proof sont les chaînes <tag>_<hexa>_<contrôle> émises par cryptoVote : hexa minuscule d'octets entiers, somme de contrôle de 4 octets (8 hexa). Elles sont transportées telles quelles et repassées sans transformation à verify_ownership_wasm ; l'hexa nu est rejeté.
  • L'ordre des champs est indifférent. C'est un objet JSON : le lecteur lit par clé. L'outil écrit les champs dans l'ordre du tableau ci-dessus.
  • Clés inconnues ignorées. Un lecteur DOIT ignorer les clés qu'il ne connaît pas, pour rester compatible avec les versions futures ; l'outil les abandonne à la relecture.
  • Le format avant la cryptographie. version et les préfixes sont validés avant tout appel cryptographique. La somme de contrôle protège des fautes de frappe, jamais de la falsification : l'authenticité ne repose que sur la preuve.
Vérification

Valide, puis rattachée au registre.

La procédure pour qui reçoit une enveloppe. Une preuve valide, seule, dit : cette clé publique possède cette image de clé. Seul le rapprochement avec le registre en fait : ce votant a déposé ce bulletin publié.

  1. 1 Lire l'entrée comme un objet JSON ; rejeter un JSON invalide ou tout autre type (tableau, valeur simple, null).
  2. 2 Exiger version égal à cvproof/1.
  3. 3 Exiger un UUID dans election et le ramener en minuscules.
  4. 4 Exiger public_key en pk_, key_image en ki_, nonce en nonce_ et proof en own_, chacun sous sa forme canonique et à sa longueur exacte ; ignorer les clés inconnues.
  5. 5 Comparer nonce à celui que vous avez émis : la fraîcheur n'est acquise que si c'est le vôtre.
  6. 6 Appeler verify_ownership_wasm(public_key, key_image, election, nonce, proof) et ne poursuivre que sur true.
  7. 7 Rechercher key_image parmi les bulletins de l'élection et lire le bulletin trouvé : son classement est le vote prouvé.

Issue de la recherche dans le registre

published
Le bulletin est publié dans la chaîne de l'élection ; l'outil affiche son contenu.
pending
Un bulletin correspondant a été reçu mais attend sa publication dans un lot : son contenu n'est pas encore lisible, la vérification est à refaire après la clôture.
not_found
Aucun bulletin de cette élection ne porte cette image de clé : la preuve, même valide, ne se rattache à aucun vote, et l'outil le signale.
Limites

Ce qu'elle n'apporte pas.

La preuve standardise un reçu qui était déjà prouvable. Ce n'est pas une fonction de confidentialité, et ses effets sont définitifs.

  • Aucune résistance à la coercition. Le votant détient déjà sa clé secrète et son image de clé : un reçu prouvable existait avant l'opération D, qui ne fait que le standardiser. Elle n'ajoute ni ne retire de résistance à la coercition, conformément au choix assumé des reçus vérifiables plutôt que de l'absence de reçu (receipt-freeness).
  • Aucun destinataire réservé. La preuve est transférable : le demandeur peut la montrer à des tiers, qui la vérifieront aussi bien que lui. Elle ne peut pas être « pour lui seul ».
  • Aucun retour en arrière. Une enveloppe remise ne se reprend pas : qui la détient peut la vérifier et la montrer, sans limite de durée.
  • Aucune identité civile. La preuve établit la possession d'une clé secrète, pas l'identité d'une personne : l'enveloppe ne contient ni identifiant de votant ni nom. Le lien entre la clé et une personne relève du contexte de l'échange.
Outil public

Tout se passe dans le navigateur.

Les outils publics de preuve de vote implémentent cette spécification : générer un nonce, prouver son vote, vérifier une preuve. Sans compte ni réglage, ils sont toujours disponibles ; en pratique, la vérification suppose une élection close dont le registre est publié, même si la cryptographie ne dépend pas du cycle de vie de l'élection.

  • Calcul local. Le nonce, la preuve et la vérification sont calculés dans le navigateur par @condorcet.vote/crypto-vote, sans aller-retour avec un serveur.
  • La clé secrète ne quitte pas le navigateur. Elle est saisie et utilisée localement, jamais envoyée à un serveur. Rien n'est conservé au-delà de la page : ni clé, ni nonce, ni preuve.
  • Une seule requête, sur des valeurs publiques. Le rapprochement avec le registre interroge un endpoint de recherche du même hôte avec l'UUID de l'élection et l'image de clé, deux valeurs publiques. Ni la preuve, ni le nonce, ni aucun secret ne lui sont envoyés.
  • La posture de la page de vote. Page autonome, sans Livewire, sous la politique CSP la plus stricte (ressources du seul domaine) ; le module WASM est contrôlé par son empreinte d'intégrité au chargement.
Ouvrir les outils de preuve de vote