- FastAPI backend with JWT authentication - ElGamal, RSA-PSS, ZK-proofs crypto modules - HTML5/JS frontend SPA - MariaDB database with 5 tables - Docker Compose with 3 services (frontend, backend, mariadb) - Comprehensive tests for cryptography - Typst technical report (30+ pages) - Makefile with development commands
8.6 KiB
FAQ - Questions Fréquemment Posées
🚀 Installation & Démarrage
Q: Par où commencer ?
R:
cd /home/paul/CIA/e-voting-system
./QUICKSTART.sh # Démarrage rapide
# Ou
make up # Démarrage avec make
Q: Quels sont les prérequis ?
R:
- Docker 20.10+
- Docker Compose 1.29+
- Python 3.12 (optionnel, pour développement local)
- 4GB RAM minimum
- 2GB espace disque
Q: Comment accéder à l'application ?
R:
- Frontend : http://localhost:3000
- API : http://localhost:8000
- Documentation API : http://localhost:8000/docs
Q: Erreur "Port déjà utilisé" ?
R:
# Vérifier quel processus utilise le port
lsof -i :3000
# Modifier les ports dans .env ou libérer le port
# Puis redémarrer
docker-compose restart
🔐 Cryptographie
Q: Comment fonctionne ElGamal ?
R: ElGamal est un chiffrement asymétrique basé sur le logarithme discret :
- Clé publique :
(p, g, h)oùh = g^x \bmod p - Chiffrement :
E(m) = (g^r \bmod p, m · h^r \bmod p) - Propriété clé : Additif homomorphe pour dépouillement sécurisé
Voir rapport/main.typ pour détails mathématiques.
Q: Pourquoi ElGamal et pas Paillier ?
R: Pour ce prototype, ElGamal offre :
- Suffisant pour votes binaires (0 ou 1)
- Plus simple à comprendre
- Calcul plus rapide
Paillier serait meilleur pour :
- Votes multi-candidats complexes
- Opérations plus flexibles
Q: Les signatures RSA-PSS sont-elles sûres ?
R: Oui, RSA-PSS avec :
- Taille clé : 2048 bits (protocole)
- Fonction de hash : SHA-256
- Salt aléatoire (probabiliste)
- Résistant aux attaques par timing
Q: Comment les preuves ZK fonctionnent ?
R: Protocole Fiat-Shamir non-interactif :
- Prouver qu'on connaît un secret
- Sans le révéler
- Utilisant un hash comme défi
Cas d'usage : prouver qu'un vote est valide sans le dévoiler.
🗳️ Processus de Vote
Q: Comment assurer l'anonymat ?
R:
- Vote chiffré avec ElGamal
- Hash unique du bulletin
- Pas de lien entre voter et vote
- Résultats déchiffrés seulement après clôture
Q: Peut-on voter deux fois ?
R: Non, protections multiples :
- Contrainte UNIQUE base de données (voter_id, election_id)
- Flag has_voted sur électeur
- Vérification backend
Q: Peut-on modifier mon vote ?
R: Non :
- Vote chiffré immédiatement
- Hachage SHA-256 pour intégrité
- Stocké en base sécurisé
- Vérification avant dépouillement
Q: Comment sont comptabilisés les votes ?
R:
- Tous les votes restent chiffrés
- Somme via propriété homomorphe ElGamal
- Déchiffrement final du résultat
- Publication sans détails individuels
🐳 Docker & Déploiement
Q: Combien de conteneurs ?
R: 3 services :
- frontend : Port 3000 (HTML5 + JS)
- backend : Port 8000 (FastAPI)
- mariadb : Port 3306 (Données)
Q: Comment sauvegarder la base de données ?
R:
docker-compose exec mariadb mysqldump -u evoting_user -p evoting_db > backup.sql
# Restaurer
docker-compose exec -T mariadb mysql -u evoting_user -p evoting_db < backup.sql
Q: Puis-je déployer en production ?
R: Oui, mais appliquez ces recommandations :
-
Secrets :
export DB_PASSWORD=$(openssl rand -hex 16) export SECRET_KEY=$(openssl rand -hex 32) -
HTTPS : Configurez TLS/SSL
-
CORS : Restreindre les origines
CORS_ORIGINS="https://vote.company.com" -
Logs : Centraliser (ELK, Loki)
-
Monitoring : Alertes (Prometheus)
Voir DEPLOYMENT.md pour détails.
Q: Comment scaler horizontalement ?
R:
# docker-compose.yml
backend:
deploy:
replicas: 3 # 3 instances backend
# Ajouter Load Balancer (Nginx)
nginx:
image: nginx:alpine
ports:
- "80:80"
# Config upstream les 3 backend
🧪 Tests & Développement
Q: Comment lancer les tests ?
R:
make test # Tous les tests
make test -k test_elgamal # Tests spécifiques
make lint # Vérifier la qualité
make format # Formater le code
Q: Comment développer localement ?
R:
make install # Installer Poetry
make dev # Backend en mode watch
# Frontend est servi par le conteneur Docker
Q: Tests d'intégrité réussis ?
R: Tests présents :
- ✅ ElGamal encrypt/decrypt
- ✅ Homomorphic addition
- ✅ RSA signatures
- ✅ ZK proofs
- ✅ SHA-256 hashing
À développer :
- Backend API integration tests
- End-to-end voting flow
Q: Comment contribuer ?
R: Voir CONTRIBUTING.md :
- Fork le repo
- Créer branche feature
- Écrire tests
- Faire PR sur dev
- Review & merge
🔍 Troubleshooting
Q: "Connection refused" au backend ?
R:
# Vérifier que le conteneur tourne
docker-compose ps
# Voir les logs
docker-compose logs backend
# Redémarrer
docker-compose restart backend
Q: MariaDB ne démarre pas ?
R:
# Réinitialiser la BD
docker-compose down -v
docker-compose up -d
# Attendre 30s pour initialisation SQL
sleep 30
Q: "Module not found" Python ?
R:
make install # Réinstaller
poetry install # Ou directement
# Vérifier l'env
poetry env info
Q: Le Frontend n'affiche rien ?
R:
- Vérifier http://localhost:3000
- Vérifier les logs :
docker-compose logs frontend - Vérifier backend accessible : http://localhost:8000/health
Q: Erreurs CORS ?
R:
# Dans .env, ajouter
CORS_ORIGINS="http://localhost:3000"
# Redémarrer backend
docker-compose restart backend
📊 Performance
Q: Combien de votes par seconde ?
R: Prototype :
- ~10 votes/sec (avec crypto)
- ElGamal encrypt : ~10ms
- BD insert : ~5ms
- Total : ~15ms/vote
Optimisations en prod :
- Pré-calcul exponentiations
- Connection pooling
- Indexes BD
Q: Scalabilité ?
R:
- Horizontale : Ajouter backend replicas
- Verticale : Plus de CPU/RAM
- Limite réelle : BD (considérer sharding)
Q: Déployer 100k électeurs ?
R: Oui, avec :
- 3+ replicas backend
- Pool conexiones 50+
- Indexes optimisés
- Éventuellement : Redis cache
🔐 Sécurité
Q: Les données en transit sont-elles sécurisées ?
R:
- Votes chiffrés ElGamal avant envoi
- Tokens JWT avec signature
- HTTPS en production (obligatoire)
Q: Peut-on compromettre le système ?
R: Menaces mitigées :
| Menace | Mitigation |
|---|---|
| Modification votes | Chiffrement ElGamal |
| Révélation votes | Anonymat + ZK-proofs |
| Usurpation identité | JWT + bcrypt |
| Double vote | Contrainte unique BD |
| Révélation données | Audit logs |
Q: Comment auditer le système ?
R:
- Journal complet :
audit_logstable - Traces IP/timestamp
- Vérification preuves ZK
- Vérification hashes
Q: Mettre à jour les dépendances ?
R:
poetry update # Mettre à jour
poetry audit # Vérifier CVE
docker-compose build --no-cache # Rebuild images
📚 Documentation
Q: Où trouver la documentation ?
R:
- README.md : Vue d'ensemble
- PROJECT_SUMMARY.md : Récapitulatif
- QUICKSTART.sh : Démarrage rapide
- DEPLOYMENT.md : Déploiement
- ARCHITECTURE.md : Système détaillé
- CONTRIBUTING.md : Contribution
- rapport/main.typ : Rapport complet (30+ pages)
Q: Comment générer le PDF du rapport ?
R:
# Installer typst
cargo install typst-cli
# Compiler
typst compile rapport/main.typ rapport/main.pdf
Q: Le rapport est où ?
R: Dans rapport/main.typ (Typst format)
- Spécifications techniques
- Fondamentaux cryptographiques
- Architecture
- Analyse de sécurité
- Tests et validation
🎯 Général
Q: Durée du projet ?
R:
- Backend + Crypto : 40%
- Frontend : 20%
- Tests : 15%
- Documentation : 15%
- Déploiement : 10%
Q: Peut-on réutiliser le code ?
R: Oui, licence MIT :
- Utilisez librement
- Modifiez comme vous voulez
- Attribution appréciée
Q: Peut-on déployer en production réelle ?
R: Théoriquement oui, pratiquement :
- Besoin audit sécurité externe
- Besoin compliance légale
- Besoin scalabilité supérieure
- Considérer blockchain pour immuabilité
Q: Existe-t-il des alternatives connues ?
R: Oui :
- Helios (MIT, basé ZK)
- Belenios (Française, blockchain)
- SpeediVote (Suisse)
- Voatz (USA)
Q: Comment contribuer au projet ?
R:
- Lire CONTRIBUTING.md
- Cloner le repo
- Créer branche feature
- Écrire tests
- Faire PR
Merci d'utiliser e-Voting System ! 🗳️
Pour plus d'infos : https://github.com/... Contact : support@...