Retour aux projets
Programmation · 2025

Routage en Oignon

Développement d'une architecture distribuée en Python simulant le routage en oignon (type Tor), intégrant un chiffrement RSA asymétrique manuel et des interfaces graphiques (PyQt6) pour garantir l'anonymat des échanges.

2025
Cameron FLORENCE
Programmation
Routage en Oignon
Idée de départ

L'objectif de ce projet était de concevoir un système client-serveur distribué permettant à plusieurs utilisateurs d'échanger des messages de manière totalement anonyme.

Pour ce faire, j'ai recréé les principes fondamentaux d'un réseau de type "Tor". Le système repose sur des routeurs virtuels interconnectés qui font transiter les données, et un serveur central (Master) chargé de superviser l'annuaire des nœuds et de distribuer les clés cryptographiques. Le but était de comprendre et d'implémenter concrètement les mécanismes de chiffrement par couches successives (routage en oignon) garantissant la confidentialité du parcours de la donnée.

Technologies utilisées
PythonPython
PyQt6
MariaDBMariaDB
RSA
Répartition des rôles
Développeur
Chef de projet et développeur unique. Prise en charge intégrale de l'architecture, du développement des sockets (Master, Routeurs, Clients), de l'implémentation de l'algorithme RSA, du design des interfaces PyQt6, de la base de données MariaDB, et de la rédaction de la documentation.
  • Cameron
Déroulement du projet
1
Architecture & BDD — Mise en place du protocole de communication par Sockets TCP/IP et création du serveur "Master" relié à une base de données MariaDB pour stocker l'annuaire des routeurs.
2
Développement des nœuds (Routeurs) — Création des scripts routeurs capables de générer leurs clés, de s'enregistrer sur le Master, et de décoder/relayer les paquets.
3
Cryptographie RSA (Maison) — Programmation mathématique de l'algorithme asymétrique RSA et mise en place d'un système de découpage par blocs (fragmentation) pour chiffrer des messages volumineux.
4
Logique Client (Routage en Oignon) — Développement du client qui télécharge la liste des routeurs, choisit un chemin aléatoire et chiffre le message en couches successives.
5
Interfaces & Supervision — Création des interfaces graphiques (PyQt6) pour les clients et le Master, et ajout d'un service de "Ping" en arrière-plan pour surveiller l'état (en ligne/hors ligne) des routeurs.

Vidéo démonstration
Contraintes et solutions

La contrainte majeure concernait la limitation mathématique de l'algorithme RSA : il est impossible de chiffrer un message dont la taille dépasse celle du module de la clé. Or, le chiffrement en oignon ajoute énormément de données à chaque couche. Pour contourner cela, j'ai dû concevoir un système de "chunking" (fragmentation) : le message est découpé en petits blocs chiffrés individuellement puis concaténés avec un séparateur.

De plus, lors de l'envoi de ces paquets fragmentés et volumineux à travers le réseau, le protocole TCP coupait parfois les flux (problème de buffer). J'ai résolu ce problème en implémentant une boucle de réception asynchrone sur les sockets, garantissant la reconstruction parfaite de l'intégralité des données avant de lancer le déchiffrement.

Résultats
Architecture distribuée Master/Routeurs/Clients pleinement fonctionnelle.
Routage en oignon opérationnel (les messages transitent et sont déchiffrés par couches successives).
Cryptographie RSA développée "from scratch" fonctionnelle (clés de 256 bits).
Interfaces utilisateur (PyQt6) ergonomiques pour la supervision et l'envoi de messages.
Leçons tirées du projet

Ce projet en autonomie totale m'a permis de maîtriser l'architecture d'un code de bout en bout. J'ai considérablement renforcé mes compétences en programmation réseau bas niveau (gestion des sockets TCP, buffers, multi-threading).

Surtout, coder un algorithme de cryptographie (RSA) sans faire appel à des bibliothèques toutes faites m'a fait prendre conscience de la complexité mathématique et des défis d'optimisation (taille des clés, temps de calcul, fragmentation) qui se cachent derrière la sécurisation des données sur Internet.