Le vote électronique sécurisé et transparent est possible
Imaginons...
Imaginons un lointain pays limitrophe (par facilité nous l’appellerons Cefran). En Cefran, on a décidé de permettre à ses électeurs résidents à l'étranger de voter via un site internet. A la grosse louche, ça fait 700.000 personnes concernées. En patrie Cefranaise, on est moderne, on flirte avec les nouvelles technologies, tiens on est tellement branché qu'on ferait bien une application iPhone la prochaine fois.
Cependant, pas possible de déployer un système pareil soit même (on sait pas faire un "hello world" en python, alors pensez un système de vote électronique). Heureusement, leurs potes de chez Csytl (société fictive bien entendu) viennent leur tirer une belle épine du pied : ils se proposent "généreusement" de faire ça. Csytl est une société très connue dans le milieu, tellement qu'elle peut se permettre de faire n'importe quoi et quand même décrocher des contrats avec les états (lobyquoi ?). Le résultat est esthétiquement pas trop mal mais d'un point de vue sécurité une horreur: https non obligatoire, des injections sql, du chiffrement mal fait, vieille version de java requise, un applet mal torché et surtout aucune transparence. Le résultat du vote se trouve aux mains d'un société privée.
En voyant ça, vous pensez bien que les habitants imaginaires de Cefran ont clashé en masse le système de vote, en particulier un nouveau parti politique désirant se battre pour la liberté des citoyens (si ça c'est pas une preuve qu'on est en pleine fiction je sais pas ce qu'il vous faut). Au final, on en est arrivé au point où les gens ne pensent pas qu'il est possible d'avoir un bon système de vote par internet (j'avais essayé une fois d'en discuter sur StatusNet, ce fut laborieux).

Améliorons...
Après cette trop longue introduction inutile, n'écoutant que mon cœur et mon courage, je veux défendre la veuve, l’orphelin et le vote électronique. Le vote électronique moi ça me botte, je trouve ça super intéressant, la technologie qui sert la démocratie, c'est beau. Non ? Soit. Bref j'affirme que, si, c'est possible de faire un système de vote valable pour peu qu'on ne s'y prenne pas comme un blaireau...
Pratiquement, pour améliorer la sécurité, il y a plusieurs mesures "de base" à appliquer : HTTPS obligatoire, audit de code bien à l'avance, authentification forte (via une carte d'identité électronique par exemple), ne pas impliquer de société privées comme seules responsables de certaines étapes critiques... L'exemple ci-dessus est un beau cas d'école de ce qu'il ne faut pas faire. Cependant si ces points sont plutôt sur la forme, le fond est très important aussi: on veut dépasser le stade d'une base mysql avec un compteur pour chaque candidat.
La confiance
D'abord partons d'un point sur lequel on est tous d'accord: on ne peut pas faire confiance au serveur distant. Le votant veut avoir la certitude de ce que fait la machine avec son vote. Si je clique sur le bouton pour voter pour X, je veux être sûr que mon vote ne sera pas comptabilisé pour Y. Pour cela, on peut obliger les gens à utiliser des systèmes ouverts, à montrer le code source de leurs programmes. Mais après qu'est-ce qui va me garantir que c'est bien le logiciel qu'ils utilisent ? La solution est de ne pas leur faire confiance et de faire le boulot soit même. Le vote doit être chiffré coté client dans un ballot et envoyé au serveur qui n'aura plus qu'à l'ajouter à la pile des autres ballot. Comment faire ça ? En javascript par exemple (oui on est capable de faire de la crypto en javascript). Si on pousse un cran plus loin, on pourrait avoir un système utilisant des clients externes. Vous n'avez pas confiance en le site officiel ? Utilisez l’application qu'aura développé votre parti ou le programme open source maintenu par la communauté. Le seul job du site officiel sera de vous authentifier et de comptabiliser votre bulletin.
La transparence ? Si tous les bulletins sont bien chiffrés, il n'y a aucun problème à donner un accès libre à tous ces bulletins. Aucune confiance dans le serveur, toutes les données sont publiques. Vous pouvez vérifier sur une pool publique sur base d'un hash de votre ballot qu'il est bien comptabilisé. Des bonnes tailles de clef garantissent le secret pour une centaine d'année, ça devrait suffire. Si ça ce n'est pas la transparence ultime ? N'importe qui, à n'importe quel moment, peut accéder à tous les votes, vérifier son bulletin et s'assurer ainsi que personne n'a été altéré n'a été ajouter, supprimer ou remplacer des bulletins.
Zero Knowledge Proof
Comment séparer le votant et son intention de vote ? C'est là que ça devient tricky. Il existe un concept en crypto qui s'appelle la "Zero Knowledge Proof" (ZKP ou "preuve à divulgation nulle de connaissance" pour les francophiles). C'est un très beau principe qui est, par exemple, implémenté dans OAuth, l'api de connexion pour les Twitter, StatusNet, Facebook & co. Le but est de prouver à un tiers que l'on connaît un secret sans révéler ce secret. Plutôt que de donner la clef du cadenas, on montre qu'on est capable de l'ouvrir. En appliquant ce principe, on est capable de créer un ballot et prouver qu'il appartient bien à un votant valide sans dire qui il est (le secret) ou pour prouver que le déchiffrement a été fait correctement sans révéler les clefs de déchiffrement. La zéro knownledge c'est bon, mangez en !

Une fois le vote clôturé, on a une phase d'audit publique. Chacun peut voir que son bulletin est toujours là et n'a pas été altéré. Les checksums sont également vérifiées pour détecter toute tentative de manipulation. Maintenant, le déchiffrement : on ne veut absolument pas donner le secret du déchiffrement à une seule personne. On va donc séparer la responsabilité en plusieurs personnes, les trustees. Les trustees sont des gens qui n'ont pas d’intérêt à tricher ensembles (des gens de partis opposés par exemple). Ainsi même si n-1 veulent tricher, pas moyen de déchiffrer le tout. Il existe ensuite plusieurs façon de faire selon le système choisi et le type de vote. On peut par exemple faire cela en deux phases (donc 2 groupes de trustees et 2 ensembles de clefs pour plus de sécurité). La première phase va être de rassembler tous les votes en une somme, le shuffling. Cette phase est essentielle pour la confidentialité car est le moment où l'on détache le choix de vote de la personne. Il est mathématiquement impossible de relier les votes aux gens après ça. La deuxième phase est le déchiffrement. Sur base du résultat du shuffling, on va "ouvrir l'urne" et compter le nombre de vote. Une fois fait, on détruit au moins une clef de trustee pour empêcher toute attaque sur la pool de vote. Tout cela doit se faire dans les conditions de sécurité optimales. Par exemple sur une machine virtuelle complètement offline supprimée après opération et tout le tsoin tsoin.
Les virus
Un des problèmes en terme de confiance en le vote électronique est le cas de machine corrompue. Si on considère que ma machine est infectée jusqu'à la moelle, je ne peux avoir aucune confiance en ce que je vois à l'écran. On peut trouver des méthodes qui diminuent le risque en cas d'infection (multitude d'applications, vérifications à plusieurs niveaux, authentification externe...) mais ne garantissent jamais une sécurité parfaite. La meilleur méthode dans ce cas est d'utiliser un nouveau canal. Il s'agit par exemple de codes unique transmis par courriers papiers. Sur mon papier il sera indiqué que: pour voter A, entrez le code 123 et pour voter B, entrez le code 321. L'ordinateur corrompu n'a aucun moyen de savoir quel code correspond à quoi. Ce qui est très étonnant est que pour les élections en France, l'on possédait ce canal (les accès sont transmis par courrier), Scytl possédait la technologie (utilisée en Norvège) mais ne l'a pas utilisé.
Helios
C'est bien beau tout ça, mais l'idéal serait de dépasser le stade de théorie. Ça tombe bien, je vous présente Helios Voting. Un beau logiciel open source (GPL). Pour la petite histoire, le système a été utilisés aux élections du recteur et des représentants étudiants dans mon université (avec vote papier toujours possible). J'ai d'ailleurs participé à la réalisation de ce dernier (la partie la plus importante : l'interface graphique et les animations jQuery). Le système a été testé par des milliers d'étudiants (à la 3eme reprise en 2012) et conçu par des profs et spécialistes en crypto. Détail amusant pendant les élections étudiantes: aucun bulletin de vote électronique n'a été invalidé, plusieurs papiers ont du être comptés comme nuls car mal remplis.
Hélios a été conçu pour être simple d'utilisation. Le vote se fait donc uniquement sur le site de l'élection et le bulletin est chiffré en javascript. En comparaison au système français, l'on ne garantit donc qu'une protection légèrement supplémentaire du coté client (les plus grosses bourdes sont évitées mais quand même pas de protection contre les machines corrompues) mais par contre on fait beaucoup mieux du coté de la vérifiabilité et surtout on ne demande plus une confiance aveugle en un système fermé. (oui oui le système utilisé pour nos élections étudiantes était donc meilleur que le système Français).
Remotegrity
Remotegrity est un système de vote qui a été utilisé par exemple à Takoma Park dans l'état du Maryland pour les élections municipales de 2011. Ce système utilisait le canal papier pour transmettre des codes, le tout étant totalement vérifiable. Pour comprendre plus le fonctionnement de ce système, je vous conseille de regarder la vidéo ci-dessous (anglais) ou de lire la FAQ.
Acceptons...
Un des soucis que les gens rencontrent avec les votes électroniques est le fait que n'importe qui ne peut pas comprendre le fonctionnement du système de vote. C'est évident, je ne suis pas rentré dans les détails (parce que je ne les maîtrise pas) et je suis sûr que la partie de la population qui comprend les concepts décrits ci-dessus est très faible. L'on affirme ainsi que si madame Michu ne comprend pas, ce n'est pas démocratique. Alors là je ne suis pas d'accord. Comme le dit si bien PostBlue (il va attraper le gros cou maintenant qu'on le cite):
C'est une mécompréhension du système de vote démocratique, à mon sens, de croire que la multiplicité de la vérification rend ce système moins-faillible. C'est estimer, de façon complètement naïve, que plus il y a de monde en charge, moins cela est détournable. La vérification par un expert peut être tout aussi publique qu'une vérification par 8 débiles bas de plafond qui n'ont aucune idée de ce qu'ils font.
Si une chiée d'experts reconnus en sécurité et cryptographie disent que oui ce système est sûr, je trouve normal qu'il soit adopté. En comparaison, on pourrait dire que, lorsque je suis malade, j'ai le choix entre prendre des remèdes de grand-mère (je comprend, c'est simple) ou d'aller voir un médecin à qui je ferai confiance pour appliquer des méthodes que je ne comprend pas mais que je sais sont reconnues par d'autres médecins comme efficaces. On passe notre vie à déléguer la compréhension à des gens plus spécialisés que nous dans le domaine et c'est une bonne chose. D'ailleurs on le fait déjà en politique, les gens que nous élisons ont généralement des bonnes connaissances du droit et du domaine dont ils sont responsables (en principe). Ce n'est pas parce que moi tout seul je ne comprend plus l’entièreté du processus de vote qu'il n'est plus démocratique. Je suis très fan de KISS mais il ne faut pas rejeter un système efficace parce qu'il est compliqué.
Tout le monde comprend le processus de vote papier et pourtant on peut chier à la pelle des exemples de votes falsifiés ou dont la sécurité n'est pas garantie. Si théoriquement, je peux suivre toute la vie de l'urne et il existe plein de modes de vérification, on ne peut pas garantir que les milliers d'urnes utilisées ont été, en permanence, surveillées efficacement pendant les transports et autres. On se base sur la fiabilité de l'humain, c'est très naïf. Je peux recompter des billets ? Oui, je peux recompter un gros tas de papier mais je recompte quoi ? Est-ce que j'ai la preuve que je compte des papiers originaux, qu'il n'y a pas eu échanges ? Je ne dis pas que le vote papier est mauvais et est toujours trafiqué. Juste qu'il ne faut pas penser que c'est un système infaillible. L'important est d'avoir un esprit critique sur ce qu'on me dit.
Le problème n'est pas que les gens ne comprennent pas mais que les gens ne font pas confiance dans les nouvelles technologies, ils ont peur que si ça se passe sur une machine, on peut tout bidouiller ou qu'un hacker (vous savez ces gens dans les films qui n'utilisent jamais la souris) prennent contrôle du système et fassent tout exploser. Cela ne peut se régler que par une éducation informatique claire. C'est très important de ne pas négliger cet aspect si on veut éviter un rejet par la population.

Pour conclure, aucun de ces systèmes n'est parfait. On ne garantit par exemple pas le fait que la personne qui a voté sur le pc est bien la personne qui le devrait (on diminue un peu ce problème en donnant la possibilité de revoter dans Helios par exemple). L'utilisation d'un deuxième canal dépend également de la fiabilité de ce canal (la Poste ici, ça s'annonce fort). Le vote électronique peut donc être techniquement meilleur que le vote papier mais il restera des aspects qui ne peuvent être corrigés. La question est quelles sont les aspects que doivent garantir notre vote ? La transparence ? L'absence de fraude ? La sécurité du votant ? La fiabilité du résultat ? La confiance que peut avoir l'électeur dans le vote (pas uniquement du point de vue technique) ? En ayant ça en tête il faut réfléchir si les aspects qu'on gagnent et perdent sont cohérents pour l'importance de notre élection.
J'espère vous avoir convaincu qu'était possible de faire un vote électronique sécurisé, démocratique et au moins aussi sécurisé que le vote papier.
PS: merci à Olivier Pereira et Richard Mathot pour leurs temps passés à m'expliquer le fonctionnement d'Helios et les principes de crypto utilisés.