Aller au contenu
Aymezia
fren
Tous les projets

ZiaCrypte

En développement

Sé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