Système de Vote électronique
Le premier projet de la fédération doit être utile directement à celle-ci. Le système de vote est indispensable pour permettre à l’association de fonctionner sans avoir à organiser des rencontres régulièrement. Ce système doit être le plus sûr possible et doit pouvoir être hébergé chez chacun des participants.
Benoit Peccate & François Barre
- N le nombre de personnes devant coopérer pour falsifier un vote
- M le nombre de personnes devant coopérer pour savoir qui vote quoi
- L le nombre de personnes devant coopérer pour annuler un vote
Les personnes considérées doivent être à chaque fois un administrateur d'une
base différente des bases de données du vote. L, M, N définissent la
sécurité (ou plutôt la confiance accordée) du système de vote. Le système
présenté ci-dessous explique comment mettre ceci en pratique, il permet
de mettre en évidence ces parametres et de les modifier.
!!! Nous cherchons des systèmes avec L, M et N infinis !!!
Un système de vote électronique doit être en mesure de fournir les
garanties suivantes :
- Anonymat du vote. Aucune relation ne peut être établie entre l'identité
d'un votant et le contenu de son bulletin.
- Unicité du vote. Un inscrit ne peut voter qu'une et une seule fois.
- Garantie de l'identité du votant.
- Contenu de l'urne non modifiable.
Le système de vote est hébergé sur des machines dont les adinistrateurs sont
partie prenante dans le vote. Nous n'avons pas trouvé mieux que M = 2
et L = un nombre entre 1 et N.
- 1 serveur sert d'anonymiseur et sert à délivrer des droits de vote
- N + L serveurs distincts du premier servent à voter. Tous les serveurs
doivent avoir des administrateurs distincts. Nous supposons ici que
les différents serveurs sont bien sécurisés et que seuls les administrateurs
peuvent y lire des données privées.
Le serveur de droit connaît le nom de chaque votant ainsi qu'un système
sécurisé pour qu'ils s'authentifient (mail avec cryptage gpg, passerelle
https ...)
Avant chaque vote, chacun doit avoir donné d'avance au serveur de droit
au moins une clé publique à usage unique pour permettre un vote sans
délai, cette clé devra être recréée après chaque vote.
Après chaque vote, le serveur de droit avertit par mail tout le monde et leur demande
de recréer leur identifiant à usage unique. Cet identifiant est constitué
d'une clé publique et d'une clé privée. La clé publique est communiquée
à ce serveur par le système d'authentification connu.
Notons qu'il est possible de stocker d'avance plusieurs clés à usage
unique sur ce serveur pour éviter d'avoir à en recréer à chaque vote.
Au début de chaque vote, ce serveur peut diffuser la proposition soumise
au vote. Il diffuse aussi (publiquement) la liste des clés publiques
uniques aux serveurs de vote.
Ces serveurs disposent de la liste des clés publiques grâce au serveur
de droit de vote. Ils connaissent le nombre de votants grâce à une
modification manuelle de la part de l'administrateur. Toute personne
désirant voter doit utiliser un clé de cette liste pour s'authentifier.
La liste des clés publiques ainsi que le nombre de votants est disponible
publiquement sur ces serveurs.
Pour valider un vote, une personne doit voter en utilisant un moyen
(mail, interface https ... ) une fois sur chaque serveur de vote.
Les serveurs doivent alors vérifier qu'il a voté la même chose sur
chacun des serveurs ou annuler le vote en cas d'erreur ou de temps
limite écoulé.
Le cas d'erreur peut soit être pris en compte avec un protocole direct
où le client attend la fin du traitement par l'ensemble des serveurs,
soit par un mail global à l'ensemble des utilisateurs avec la clé
publique de la personne pour laquelle le vote a échoué.
Le serveur stocke simplement sur une table les résultats et sur une
autre la liste des ayant voté.
Le serveur de droit de vote sert d'anonymiseur pour que les serveurs
de vote ne puissent pas savoir d'où provient le message (et donc identifier
qui a voté quoi). Cet anonymiseur est soit un proxy (pour une méthode
https) soit un relai mail qui supprime les en-têtes.
Le client commence par vérifier la liste des serveurs de vote disponible
sur le serveur de droit. Il vérifie que cette liste est identique
à celles que fournissent les serveurs de vote donnés. Cette vérification
doit être faite au moment de la déclaration de l'ouverture du vote
et non au moment du vote en lui-meme pour éviter d'être identifié
par le serveur de vote comme étant la prochaine personne a voter.
Le client vote par une méthode choisie en se connectant au serveur
de vote par l'intermédiaire de l'anonymiseur. Il répète cette opération
autant de fois qu'il y a de serveurs de vote.
Selon la méthode choisie, le client doit soit attendre la réponse
de chacun des serveurs, soit demander à l'utilisateur de vérifier
qu'il n'a pas reçu d'email d'erreur.
Pour ne pas avoir à voter N fois, ceci peut etre automatisé :
- pour le mail simplement avec les CC
- pour la méthode https avec un petit script relativemnt simple
Le résultat du vote s'obtient par diffusion des bases de chaque serveur
de vote vers chaque autre serveur de vote. Ici, il faut choisir les
cas d'annulation :
- On annule dès qu'une base est différente d'une autre (L=1)
- On annule si L bases sont différentes des bases majoritaires
- On n'annule pas et on choisit la solution majoritaire
Le système est valide car :
- Le vote est anonyme car les serveurs de vote ne connaissent que les
clé publiques des votants et rien n'y est associé.
- L'IP associée à cette clé est inconnue grâce au service de l'anonymiseur.
- Le vote ne peut être ni annulé ni refait car chaque serveur contient la
liste des ayant voté et interdit tout revote.
- Le vote ne peut pas etre modifié car il n'existe pas de relation dans
la base entre le votant et son vote.
- N administrateurs de serveur de vote peuvent falsifier le vote en
modifiant leur base de vote de concert.
- L'administrateur du serveur de droits ne peut falsifier ce vote car le serveur de droit n'intervient pas dans la partie vote.
- L'administrateur de l'anonymiseur ne peut falsifier le vote car les protocoles
choisis sont des protocoles de cryptage à clé publique.
- 2 administrateurs de vote peuvent coopérer pour savoir qui a voté quoi
si le premier est l'administrateur du serveur de droit (ou de l'anonymiseur)
et le deuxième un administrateur d'une base de vote. Il suffit d'enregistrer
l'état de la base entre chaque vote puis de faire correspondre une
clé anonyme à un votant.
- Il est impossible de savoir qui a voté quoi pour des administrateurs
quelconques car les clés sont anonymes et les seuls à pouvoir faire
le lien avec une adresse IP ou un nom sont les administrateurs du
serveur de droit et de l'anonymiseur.
- Selon la méthode de comptage choisie, Les administrateurs d'une base
de vote peuvent faire annuler un vote en falsifiant leur base de vote.
- L'administrateur du serveur de droits ne peut faire annuler un vote,
car rien ne lui permet de falsifier une base de vote.
- L'administrateur de l'anonymiseur peut tenter de faire annuler un
vote en empêchant un votant de voter ou en ne redirigeant pas les
requêtes vers tous les serveurs de vote. Ceci est évité par l'utilisateur
qui doit vérifier (par la méthode de feedback proposée) que son vote
a été validé. C'est a dire que les serveurs de vote ont tous reçu
son vote et l'ont validé comme identique.
- Seuls les personnes inscrites peuvent voter car le serveur de vote
les connaît et leur donne un droit de vote. Les serveurs de vote n'acceptent
que le nombre de clés prédéfinies et communiquées par le serveur de
droit. L'administrateur de droit ne peut ni modifier (le client vérifie
la présence de sa clé), ni supprimer (idem), ni ajouter (les serveurs
comptent les clés) des clés de vote.
Dans tous les cas :
- Un script de génération de couple clé publique/clé privée pour le
client
Cas du mail :
- 1 bot pour gérer les droits de vote
- 1 bot pour les serveurs de vote (qui doit être capable de se synchroniser
avec d'autres bots et envoyer des mails au groupe de votants)
- 1 relai qui supprime les en-têtes.
- Chacun une clé gpg (ainsi que pour les bots)
Cas du web :
- 1 page pour gérer les droits de vote
- 1 page pour gérer le vote (et sa synchronisation)
- 1 interface client pour gérer le fait qu'on envoie les commandes à
N serveurs de vote.
Notons que dans tous les cas il est possible de créer une application java
qui rendrait tout cela plus automatique/user-frendly.
Je préfère le système utilisant la méthode web pour 3 raisons :
- il est possible de faire une application client facilement
- il n’est pas obligatoire de s’identifier en utilisant gpg
- le traitement des erreurs est synchrone.