Crypto Vote
Ce billet présuppose que vous soyez à l'aise avec les concepts de cryptographie asymétrique et de blokchain, si ce n'est pas le cas, je vous invite à lire les deux billets précédents :
Cryptographie asymétrique La Blockchain
Depuis l'avènement du numérique, le système de vote traditionnel est régulièrement remis en question. En effet malgré son indubitable efficacité, le système des bulletins papiers a un coût : des bureaux de vote doivent être ouverts, des gens mobilisés, des montagnes de papier imprimées. Il a aussi des faiblesses de sécurité : le bourrage d'urne, les manipulations au décomptage, l'impossibilité d'effectuer un recomptage sûr.
Pour pallier à ces problèmes, certains États ont tenté de nouveaux systèmes dits "numériques" qui se basent principalement sur des ordinateurs "de confiance", sous forme de bornes, supposées sécurisées et accessibles depuis des bureaux de vote. Historiquement, la plupart de ces tentatives sont basées sur des protocoles opaques, dont la sécurité n'est garantie que par la parole du fabricant.
En plus d'être un risque supplémentaire pour la fraude massive, de telles implémentations ne résolvent par le problème des coûts logistiques à chaque élections : il faut des gens pour surveiller les machines, pour les maintenir, et pour ouvrir les bureaux de vote. (D'ailleurs, une partie de ce personnel ne peut plus se composer de bénévoles, ce qui pousse à se poser des questions sur le gain financier réel de tels dispositifs.)
Maintenant que nous avons vu quels étaient les défauts du scrutin papier et pourquoi le vote électronique souvent proposé n'était pas mieux, penchons-nous sur le système proposé ici.
Cahier des charges d'un vote
Chaque électeur doit pouvoir voter une et une seule fois
Le décompte doit être possible pour obtenir le résultat du vote
Le vote de chaque électeur doit être obfusqué suffisamment pour qu'il ne puisse être inquiété de représailles.
(Optionnel) Le dépouillement ne être possible qu'après la fin des votes.
Charges supplémentaires pour un "crypto-vote"
Chaque individu doit pouvoir vérifier le résultat des élections, le jour même comme dix ans plus tard
Chaque électeur doit pouvoir vérifier que son vote fait bien partie du total
Remarque et hypothèses
La méthode détaillée ci-dessous ne décrit pas chaque détail de l'implémentation. Elle propose parfois des solutions mais n'exclut pas des alternatives diverses, plus adaptées à d’autres applications.
A titre d'exemple, on va ici supposer que chaque électeur possède un ordinateur sécurisé et une connexion Internet. Un tel modèle est idéaliste dans un vote à l'échelle d'un pays, (mais pas pour un vote d'entreprise) mais gardez en tête qu'il peut être possible avec des moyens techniques appropriés de s'en approcher.
Après ce long prélude, rentrons dans le vif du sujet. Pour cela nous allons procéder de l'implémentation basique à la plus complète.
L'implémentation simple sans anonymat
Nous voulons utiliser l'inviolabilité de la blockchain pour stocker et publier le vote des électeurs.
Pour mettre en place un vote, l'organisme organisateur doit établir une liste publique de l'ensemble des électeurs et de leurs clés publiques. Pour cela il peut simplement publier dans une blockchain (signant de son autorité) l'ajout ou la suppression d'un électeur, ou le changement de sa clé publique.
Il suffit ainsi par exemple de se rendre en mairie pour effectuer une de ces opérations, ou pour obtenir plus d'informations sur un électeur existant (afin d'éviter l'existence d'électeurs fantômes)
Lorsque l'organisme veut organiser un vote, il en publie les détails (signés) dans la blockchain.
Alors, lorsque le scrutin est ouvert, chaque électeur peut effectuer un vote, le signer avec sa clé privée et le publier. Si l'électeur est valide et qu'il n'a pas encore voté, son vote est accepté dans la blockchain.
À la fermeture du vote (publiée par l'organisme à l'heure prévue), tout le monde peut faire les comptes et le résultat est sans appel.
Jusque là, on a beaucoup écrit pour ne pas dire grand chose de nouveau : cette implémentation, quoique efficace, ne remplit pas du tout le cahier des charges que l'on s'était donné.
Première approche d'obfuscation
Maintenant que l'on a décrit la "trame de base" du crypto-vote, intéressons-nous aux méthodes possibles pour permettre l'anonymat de l'électeur.
Il est a priori impossible d'avoir un système où l'anonymat est total, tout en donnant la possibilité de prouver que quelqu'un a voté et de d'être sûr que son vote fait partit d'un total. (Si vous trouvez un moyen, envoyez-moi un message !)
Par contre il est possible d'offrir un anonymat partiel : l'idée est de mélanger le vote de plusieurs électeurs. (Après tout, c'est ce que fait une urne !)
Imaginons que 50 électeurs forment un groupe choisi aléatoirement. Au sein de ce groupe, tout le monde partage son vote publiquement.
Une fois que tout le monde est à même de faire un total, chacun construit un message contenant ce total, le signe, prouvant qu'il a vérifié que son vote est bien dedans, puis l'envoie aux 49 autres. Au final, le groupe finit par construire un message contenant le total des 50 voix accompagné de 50 signatures. Ce message peut alors être publié. Si aucun des 50 membres n'a déjà voté, alors ce "dépouillage" est inclu dans la blockchain. Sinon, les électeurs doivent recommencer jusqu'à ce que leur vote soit pris en compte (Il serait possible de détecter ce genre d'individus malfaisants plus tôt pour économiser des calculs, mais comme ce genre d'attaque ne casse pas la sécurité, nous ne l'aborderons pas ici.)
Remarque : Il est bien évident que chaque votant ne va pas s’amuser à faire ça à la main, il a pour ça un logiciel libre de confiance effectuant ses actions automatiquement !
Avec cette méthode, seuls 49 autres personnes au monde ont connaissance de votre vote. (On va voir qu’on peut faire mieux) Pour se protéger de ces inconnus, chaque communication au sein du groupe d'effectue ainsi :
Alice veut envoyer son vote à Bob : Alice chiffre son vote avec la clé publique de Bob, puis seulement signe ce message. Ainsi, Bob peut vérifier que le message provient d’Alice, et l'ouvrir. Seulement, Bob ne peut pas faire fuiter le vote avec la signature d’Alice (pour prouver ses dires) sans publier aussi sa clé privée, information sensible et attaché à l’identité de Bob.
Dans cette méthode, on peut se demander pourquoi 50 ? Ce nombre est clairement arbitraire, mais permet d'avoir un nombre réduit de transactions (environ 50 par personne) tout en garantissant suffisamment de diversité pour obfusquer le vote de chacun. (En effet, si les 50 personnes votent toutes pareil, alors leurs votes ne sont plus anonymes, comme si un bureau de vote obtenait par hasard 100% de vote pour un candidat)
Problème : Il est possible d'imaginer une société secrète constituée de 2% des électeurs. Si chacun de ces membres envoyaient secrètement les votes des 49 autres à la société secrète, elle serait en mesure de casser l'anonymat de presque tous les électeurs.
Diviser pour mieux régner
La solution à ce problème est de réduire la taille des groupes à 2 !
C'est quoi cette histoire ?
Évidemment on ne va pas s'arrêter là, on va imbriquer le processus évoqué plus haut comme des poupées russes.
Un groupe de deux se forme, ils obtiennent un total de leur deux voix comme indiqué précédemment. Ils choisissent alors un autre groupe de deux et leur envoient ce total. L'autre groupe fait de même. Il est alors possible pour chacun de calculer le total des 4, de le signer et de l'envoyer aux autres. Ainsi, le groupe de 4 a construit le total des 4 voix vérifié par tous. Ils n'ont plus qu'à trouver un autre groupe de 4 et recommencer la procédure !
Lorsqu'ils ont atteint une certaine taille, par exemple 1024, les participants ne cherchent pas d'autres groupe mais publient alors le total avec les 1024 signatures dans la blockchain.
De cette manière, une seule personne au monde connaît votre vote, deux si vous avez votez comme votre binôme, 4 ou 8 si les probabilités ont une dent contre vous. (De cette manière aucune société secrète n'aura votre vote).
Pour finir le cahier des charges, ajoutons qu'il est possible (de manière assez partielle) d'empêcher le dépouillement public avant la fin du suffrage.
Pour cela il suffit que les 1024 personnes ne publient pas directement le total mais : le total juxtaposé à une "graine" (=un grand nombre aléatoire), le tout haché par une fonction à sens unique. Les 1024 signent ce hash, et c'est ce hash qui est inclu dans la blockchain.
Lorsque le scrutin est fermé, tout le monde publie le total et la graine associé à son bloc. (Chaque individu est en mesure de le faire, individuellement des 1023 autres), permettant au reste du monde de vérifier que ce total + graine correspond bien au hash publié précédemment.
La dernière implémentation proposée répond ainsi à l'ensemble du cahier des charges que l'on s'était posé. Il permet en théorie de garantir l'intégrité d'un vote, le tout pour une infrastructure quasi inexistante.
Limites
Comme d'habitude, il est important de s'intéresser aux faiblesses du système que l'on propose.
Premièrement, notre protocole se base sur la cryptographie asymétrique et sur la blockchain, il a donc les éventuelles faiblesses associées. Mais comme nous l'avons discuté, ces faiblesses sont quasi-inexistantes.
Dans le cas de notre implémentation, on introduit deux nouveaux vecteurs d'attaque :
1. La clé privée de l'organisme devient une donnée très sensible, toutefois on peut construire un "édifice de clés" avec plusieurs clés certifiées et une hiérarchie entre elles permettant de gérer d'éventuelles fuites.
Un "tricheur" appartenant à cet organisme pourrait abuser de son pouvoir pour créer des comptes fantômes lui permettant de voter plusieurs fois, il est donc nécessaire qu'il y ai sur la liste des votant une transparence suffisante pour éviter de genre d'attaque.
2. Enfin, en supprimant l'environnement contrôlé qu'est l'isoloir, on permet à des individus d'en contraindre d'autres à "voter devant eux", créant un possible marché parallèle des voix. Cette possibilité est un vrai problème pour une implémentation à grande échelle, trois solutions me semblent alors envisageables :
1. Restaurer l'environnement contrôlé en permettant par exemple de voter avec son smartphone uniquement depuis un lieu sécurisé.
2. Donner la mission aux forces de l'ordre de traquer ce genre de pratiques en les rendant illégales.
3. Trouver un moyen technique élégant permettant de garantir que seul la personne qui vote est en mesure de comprendre pour qui elle a voté.













