ZiaCrypte
En développementSécurité · Messagerie chiffrée de bout en bout
Signal comme référence, mais reconstruit brique par brique pour comprendre chaque décision — et pour séparer strictement ce qui chiffre, ce qui affiche et ce qui transporte.
- Stack
- Dart
- étoiles
- 0
- Push
- il y a 19 jours
- Topics
- 0
Impact
Un moteur cryptographique C++20 partagé par cinq plateformes, où aucune ligne de Dart ou de JavaScript ne touche jamais une clé privée. L'accord de clés post-quantique est implémenté et testé dans le moteur, avec un repli classique délibéré tant que le serveur ne relaie pas la clé d'encapsulation.
Points clés
- Serveur à connaissance nulle : il stocke et transmet du chiffré, ne détient jamais de clé privée, et sa file de livraison expire à 30 jours au lieu de conserver un historique
- Aucune cryptographie maison : libsodium et liboqs fournissent les primitives, seule la machine à états du protocole est écrite ici — comme l'ont fait Signal et Matrix
- Les secrets ne vivent qu'en C++, derrière une frontière FFI que ni Dart ni JavaScript ne franchissent
- Les métadonnées sont traitées comme du contenu : photos de profil, noms de groupes, statuts et jetons de livraison passent dans le canal chiffré, pas dans une colonne de base
- Messages rembourrés par paliers de 160 octets : un accusé de lecture, une distribution de clé de groupe et une réponse courte deviennent indiscernables par la taille
- Une seule base de code pour cinq plateformes : Android, iOS, Windows, macOS et Linux
Architecture
┌─────────────────────────────┐ ┌──────────────────────────┐
│ App Flutter (Dart) │ │ Backend (Node.js/TS) │
│ interface · navigation │ │ comptes · présence │
│ aucune cryptographie │ │ relais de blobs chiffrés│
└──────────────┬──────────────┘ └────────────┬─────────────┘
│ dart:ffi │ WSS / HTTPS
┌──────────────┴──────────────┐ │
│ Moteur crypto (C++) │ │
│ libsodium · liboqs · X3DH │◄─── blobs ──────────┘
│ Double Ratchet · key store │ chiffrés uniquement
└─────────────────────────────┘Ce que chaque module ne fait jamais
- crypto-engine (C++)clés, PQXDH, Double Ratchet, sender keys, sealed sender, stockage sécurisé
- app (Flutter)interface, navigation, réseau, préférences locales. Jamais de cryptographie.
- server (Node.js)comptes, authentification, relais de blobs, présence, notifications. Ne déchiffre rien.
Accord de clés hybride
PQXDH combine les échanges Diffie-Hellman classiques et une encapsulation ML-KEM-768 : le secret partagé dérive des deux. La composante post-quantique s'ajoute aux échanges, elle ne les remplace jamais.
Casser ML-KEM laisse donc la sécurité d'aujourd'hui intacte, et casser X25519 laisse la protection post-quantique debout. La clé d'encapsulation est signée par la clé d'identité, et l'étiquette du KDF diffère entre mode hybride et mode classique : une tentative de rétrogradation forcée produit des secrets divergents au lieu de réussir en silence.
Le Double Ratchet apporte la confidentialité persistante et la sécurité post-compromission, avec un cache borné de clés sautées pour les livraisons désordonnées et un rejet des rejeux.
Sur l'appareil
- État de session, identité et historique local chiffrés au repos, sous une clé maîtresse par appareil gardée par le trousseau du système
- Secret Service, Keychain, DPAPI ou Android Keystorece dernier via JNI, faute d'API C côté NDK
- Tampons de secrets protégés, verrouillés en mémoire et systématiquement effacés
- Verrouillage applicatif optionnel, blocage des captures d'écran sur Android, sauvegarde exportable chiffrée par phrase de passe
Face au serveur
- Épinglage d'identité avec numéros de sécurité : une substitution de clé est signalée, et une alerte non résolue retire le badge « vérifié » au lieu de rassurer sur la mauvaise clé
- Présence sur consentement, visible seulement des personnes avec qui une conversation existe déjàet aucun horodatage de dernière connexion, délibérément
- Paquets de mise à jour signés, vérifiés par l'application contre une clé publique intégrée au binaire
Ce qui est vérifié
- Suite de conformité, tests de persistance, de migration et de sauvegarde, plus des fuzzers
- Presets sanitizers (ASan, UBSan) et libFuzzer sur le moteur
- Les tests exercent le vrai trousseau système, pas un bouchon : la session keyring est requise
- Compilations croisées reproductibles vers Windows et Android, liées statiquementla version Windows se vérifie depuis Linux sous Wine
- Tests d'intégration bout en bout avec deux vrais clients contre un serveur dédié
Où ça en est
L'accord de clés post-quantique est implémenté et testé dans le moteur, mais pas encore actif sur le réseau : le serveur ne relaie pas la clé d'encapsulation, les sessions négocient donc encore du X3DH classique. Ce repli est volontaire et testé — c'est lui qui garde les clients déjà installés fonctionnels pendant la migration. Restent la transparence des clés et les appels chiffrés.
Stack
- C++20
- Flutter
- Node.js
- libsodium
- liboqs
- ML-KEM-768
- Double Ratchet
- PostgreSQL
Mis à jour le 2026-07-30