Parmi toutes les applications annexes que permet le réseau Bitcoin, le vote électronique est sans doute la plus intéressante et, paradoxalement, la moins développée. Pourtant, plus que tout autre système, Bitcoin et son registre public peuvent fournir des solutions pour éviter la fraude et les contestations tout en garantissant l’anonymat du vote.
Pierre Noizat, co-fondateur de Paymium (Bitcoin-Central), auteur de Bitcoin, monnaie libre, a étudié la question en détail et vient de publier une méthode sur e-ducat.fr :
« Avant l’invention de bitcoin, les solutions de votes électroniques n’étaient pas satisfaisantes car elles n’étaient pas facilement auditables et pas assez transparentes, ni pour les candidats ni pour les électeurs. De plus elles nécessitaient une mise en place parfois coûteuse. Avec la blockchain Bitcoin, n’importe quelle communauté peut organiser gratuitement un vote électronique sécurisé. Je pense à des associations ou des entreprises qui pourraient envisager cette technologie pour les votes aux AG. Voici comment ça pourrait se dérouler pour une association :
1) Connaître la liste des candidats :
Chaque candidat (C) fournit une clé publique KeyC à l’électeur et publie partout une adresse associée à son nom du genre 1Dupont… pour le candidat Dupont
2) Contrôler la liste électorale :
Chaque électeur (B) reçoit aussi de l’association (A) une clé publique KeyA qui est listée sur le site. La liste électorale est contrôlable indépendamment par toutes les parties car chacun peut vérifier qu’il est sur liste et que le nombre de clés publiques est égal au nombre de membres dans l’association. Les clés publiques doivent être quelconques, c’est à dire ne pas se trouver sur la courbe elliptique bitcoin pour éviter que les organisateurs (l’association) puissent produire une signature valide. Cette précaution est aussi vérifiable indépendamment.
3) Préparer son bulletin de vote
Avant le jour du vote, avec ces clés publiques, l’électeur crée une adresse multi-signature 2-sur-3 et envoie vers elle une micro-transaction 0,001 BTC (environ le prix d’un timbre-poste) sur cette adresse pour préparer son bulletin de vote qui s’inscrit dans la blockchain. L’output (destination) de sa micro-transaction a cet aspect :
OP_HASH160 Hash OP_EQUAL
où Hash est l’empreinte numérique calculée par le wallet bitcoin à partir du script SerializedScript suivant:
OP_0 OP_2 KeyA KeyB KeyC OP_3 OP_CHECKMULTISIG
Cette transaction est conforme à BIP-16. Les “Bitcoin Improvement Proposals” (BIP) sont l’équivalent des RFC pour le web : ce sont des documents techniques qui spécifient une amélioration du protocole que chacun peut implémenter. L’électeur saisit l’adresse sur le site de l’association sans avoir à s’identifier : le site la valide en vérifiant qu’elle a reçu une transaction de 0,001 BTC. Le montant de la micro-transaction permet de prévenir une attaque de déni de service : les bulletins de vote ont un coût négligeables pour l’électeur mais prohibitif pour le spam. Les montants des micro-transactions peuvent d’ailleurs être renvoyés par les candidats aux électeurs nécessiteux ou être comptabilisés comme des cotisations à l’association.
4) Mettre son bulletin dans l’urne
Le jour du vote, le candidat Dupont crée une signature SignatureC qui dépense l’output de la micro-transaction multi-signature (0,001 BTC) vers une adresse V qu’il contrôle et publie SignatureC et V sur le site en regard de l’adresse “multi-signature 2-sur-3″ enregistrée. Avec SignatureC et V, l’électeur peut maintenant confirmer son vote (mettre le bulletin dans l’urne) en créant sa signature SignatureB de la même transaction et en publiant sur le réseau bitcoin la transaction valide combinant sa signature avec celle du candidat, sans avoir à s’identifier (bulletin secret). La transaction à destination de l’adresse V comprend l’input suivant:
SignatureB SignatureC SerializedScript
A ce stade, seul le candidat et l’électeur savent que V appartient à Dupont de sorte que les résultats du vote ne sont pas encore connus. En effet, les candidats ne peuvent pas savoir à qui est destinée l’adresse multi-signature préparée par l’électeur de sorte que chaque candidat doit fournir une adresse différente à chaque électeur. Si l’adresse fournie par Dupont était la même pour tous les électeurs, les résultats du vote seraient connus avant l’étape du dépouillement avec le risque d’influencer les suffrages non encore exprimés. Notons au passage que ce système exploite un avantage d’une signature numérique par rapport à une signature manuelle : une signature numérique ne permet d’identifier son auteur qu’avec son consentement, lorsqu’il révèle lui-même son identité.
5) Dépouillement des résultats de l’élection
Après les votes, pour le dépouillement, le candidat Dupont transfère simplement les bitcoins de l’adresse V vers l’adresse 1Dupont… Désormais tout le monde sait que l’adresse V appartient à Dupont et peut compter les votes en faveur de chaque candidat via la blockchain. Chaque adresse mutli-signature enregistrée (représentant un électeur) qui peut être reliée à l’adresse 1Dupont… par une transaction est un vote en faveur de Dupont. Les votes sont parfaitement vérifiables par les candidats et les électeurs, indépendamment de toute organisation, avec des logiciels open source et une base de données publique et sécurisée, la blockchain. »
Suite aux nombreuses questions qui lui ont été posées, Pierre Noizat a également publié ce complément :
« Quel avantage par rapport à un vote traditionnel ?
Evidemment, la mise en place du vote est simplifiée: gain de temps pour les électeurs et les organisateurs, notamment la location des lieux de vote et la mobilisation des équipes pour les garder. Le dépouillement est immédiat: le juge arbitre est la chaîne de blocs. Elle ne peut pas être compromise en pratique et elle peut être explorée par des outils open source, gratuits et indépendants. Exemples d’explorateurs de la chaîne de blocs Bitcoin: blockchain.info, blockr.io et chain.com.
Qu’est ce qui empêche quelqu’un de voter plusieurs fois depuis plusieurs adresses ?
Chacun des N électeurs est identifié par une clé publique KeyA différente, fournie par l’organisateur.
L’organisateur publie la racine de l’arbre de Merkle comprenant toute ces clés. Il fournit aussi à l’électeur le chemin reliant sa clé KeyA à la racine de sorte que chacun peut vérifier la liste électorale.
L’électeur prépare une adresse multi-signature qui est l’équivalent d’un bulletin de vote dans une enveloppe scellée.
Lorsque N adresses multi-signature, chacune représentant un bulletin secret, ont été enregistrées auprès des organisateurs, ils stoppent l’enregistrement et publient la liste des adresses. A ce moment-là, si un électeur se plaint que son adresse n’est pas dans la liste ou qu’il n’a pas pu enregistrer une adresse, c’est qu’il y a un tricheur qui a enregistré plusieurs adresses.
Bien sûr, la vérification proposée via la blockchain ne permet pas de déterminer qui a voté quoi mais simplement les deux points suivants:
1. combien de vote a reçu chaque candidat.
2. chaque vote correspond à une adresse enregistrée (impossible de l’associer à un électeur : seul l’électeur sait qu’elle lui appartient).
Chaque électeur peut vérifier que son adresse figure bien dans la liste des adresses enregistrées.
On peut vérifier qu’il n’y a pas plus d’adresses que d’électeurs.
Le candidat Dupont sait quand même, avec un simple “getbalance” combien il a de votes en temps réel ?
La recommandation doit être de n’envoyer son vote que le jour du scrutin et pas avant.
Le candidat peut en effet savoir en temps réel où il en est et essayer d’influencer les indécis.
A cet égard, sur ce point particulier, la situation ne serait pas pire qu’avec le vote traditionnel où des sondages sont faits le jour du vote mais ne peuvent être publiés qu’après la clôture. En réalité, il y a des fuites et les partis les plus puissants connaissent les résultats avant le dépouillement.
En synthèse, le schéma de vote électronique proposé n’est pas parfait mais il est simplement plus performant que le vote traditionnel sur à peu près tous les critères et il est gratuit !
KeyB est une clé publique détenue par le votant et connue de lui seul. C’est bien ça ?
C’est ça. Cependant, en cas de contrôle suite à une contestation, la commission de contrôle peut demander à l’électeur sa clé KeyB.
KeyC est publiée par le candidat et connue de tous pour permettre le vote. Exact ?
Non le candidat fournit à chaque électeur une clé KeyC différente. S’il y a N électeurs, le candidat doit donc générer N clés KeyC et publier la racine d’un arbre de Merkle constitué de toutes ces clés. La commission de contrôle peut demander au candidat la liste (anonyme) de ces clés et vérifier que la liste fournie après coup correspond bien à la racine de Merkle publiée précédemment par le candidat avec son adresse 1Dupont…
A l’étape 3, comment l’association fait elle pour vérifier que l’adresse proposée est valide ? Dans ma compréhension de BIP16, le hash fourni n’est pas réversible et il n’est donc pas possible pour l’association de vérifier qu’il contient KeyA. Qu’ai-je raté ?
L’étape 3 correspond, dans un vote traditionnel, à la préparation de l’enveloppe scellée contentant le bulletin secret. Elle peut se dérouler pendant toute la campagne électorale jusqu’au jour du vote, quand le bulletin est définitivement placé dans l’urne (étape 4).
C’est vrai, l’électeur peut fournir une adresse Bitcoin quelconque: ça signifie un vote blanc car l’input de la transaction à destination de l’adresse V doit être de la forme
SignatureB SignatureC SerializedScript
où SerializedScript =
OP_0 OP_2 KeyA KeyB KeyC OP_3 OP_CHECKMULTISIG
Tout le monde peut vérifier que l’input contient une clé KeyA de la liste électorale.
Si l’adresse fournie par l’électeur était quelconque, il n’y aucune chance qu’un tel input marche avec l’adresse en question.
A l’étape 4, l’idée est que les candidats ne connaissent pas les transactions qui les concernent et essaient donc de signer toutes les outputs reçues, seules celles les concernant pouvant être validées au final. C’est bien ça ?
C’est exactement ça.
A l’étape 4, concernant l’impossibilité de connaitre les votes avant le dépouillement :
Dans ma compréhension, Bip16 nécessite de révéler les clés publiques (et donc KeyC) au moment de consommer une addresse multisig . Même sans tenir compte de BIP16, le fait de pouvoir retrouver la clé publique à partir d’une signature ecdsa me parait poser problème pour cacher les transactions signées avec succès par KeyC et donc le nombre de votes reçus par le candidat.
C’est vrai : à l’étape 4, le candidat Dupont (et l’électeur) qui sont les seuls à savoir à qui appartient Key C (cf ma réponse à votre deuxième question) savent qu’un vote a été effectué en faveur de Dupont. Le candidat sait où il en est en temps réel, contrairement à l’électeur, qui, lui, ne connait pas les clés KeyC des autres électeurs. C’est un peu comme les sondages “sorties des urnes” mais en plus exact. Comme pour ces sondages, il doit y avoir un embargo sur cette information jusqu’à la fin de la période de vote qui doit être réduite à une journée au plus.
A l’étape 5, une fois les votes révélés (fonds transférés vers l’adresse du candidat), une analyse de la blockchain ne risque-t-elle pas de révéler la chaine des transactions amonts et donc l’association KeyB (votant) / KeyC (candidat) et potentiellement l’identité du votant s’il n’a pas pris de mesures particulières pour anonymiser sa possession de KeyB ?
C’est vrai aussi : il faut peut-être prévoir la possibilité pour chaque électeur de faire passer préalablement ses bitcoins par un “mixer” de la communauté des électeurs ».
L’Association Bitcoin-France pourrait peut-être utiliser cette méthode pour le renouvellement de son conseil d’administration et des membres de son bureau lors de la prochaine assemblée générale ? Une telle démonstration serait en tout cas une excellente publicité pour Bitcoin ! Quoi qu’il en soit, bravo à Pierre Noizat pour sa réflexion et ses efforts de pédagogie. Nous invitons tous les lecteurs de bitcoin.fr à visiter son blog e-ducat.fr.
Ajout de janvier 2016 :