J’ai réfléchi plus précisément à un protocole de communication sécurisé. Il est possible d’utiliser le Double Ratchet de Signal, qui limite grandement les dégâts en cas de fuite d’une clé symétrique.
C'est quoi Double Ratchet et Diffie-Hellman (DH)
DH permet, en deux messages seulement (dont il faut assurer l’authenticité et l’intégrité, mais qui peuvent rester publics), d’établir entre Alice et Bob un secret partagé qui peut servir à chiffrer des communications en symétrique (plus rapide que l’asymétrique).
Le problème est que si Ève trouve le secret partagé (par exemple en installant un virus dans le téléphone de Bob), alors elle peut lire toute la communication. Le double ratchet est un protocole utilisé par Signal qui, dans chaque message, insère une étape de DH pour renouveler les clés en permanence. Ainsi une clé divulguée ne permet de lire que quelques messages.
- Si j’envoie un message à un compte pour la première fois :
- Je suis obligé d’initier un DH (le message contient un nombre public Diffie-Hellman).
- Je peux choisir ou non de le chiffrer en asymétrique. (si oui, je suis obligé de signer le clair)
- Le message vaut demande de contact.
- Si je reçois un tel message, alors dans ma réponse :
- Je finalise le DH. On a alors un secret partagé qui servira aux échanges chiffrés symétriques.
- Je peux accepter la demande de contact en initialisant en local mon ratchet.
- Je peux refuser la demande de contact en ne conservant pas les données secrètes nécessaires au maintien de l’échange chiffré.
- Je peux choisir (ou non) de chiffrer ma réponse en symétrique, grâce au secret DH. Je ne suis pas obligé de signer le clair.
Une fois la demande de contact acceptée, les échanges chiffrés se font d’abord avec le secret DH pour les premiers messages pour initialiser les ratchets, puis complètement via les ratchets.
[edit]Déchiffrer plusieurs messages qui ont été envoyés à la suite sans qu’on ait répondu entre temps, demande plus d’espace de stockage et de puissance de calcul. Il faut donc limiter le nombre de messages envoyables sans réponse. Quand la limite (définie par le récepteur selon la capacité de sa machine) est près d’être atteinte, le récepteur se voit demander “voulez-vous autoriser Machin à continuer à vous spammer”, et si oui on envoie un accusé de réception qui fait avancer le ratchet pour remettre à zéro le compteur.[/edit]
Intérêts :
- Un message public n’est plus un cas particulier, mais la première étape du protocole, et peut servir à initier une communication.
- Si je reçois un message problématique, je peux le dénoncer publiquement, et y répondre secrètement sans engagement. Seul le premier contact est obligatoirement engageant.
- Si je reçois un message d’un ami, je peux lui répondre secrètement et lui de même.
Difficultés :
- Stocker les clés et les états des ratchets, soit en local, soit chiffré en ligne.
- UI qui permet de bien comprendre les différents choix.
Un tel protocole peut être transporté aussi bien par la blockchain que par les datapods ou Cesium+, a priori sans modification côté serveur.
J’essaie de faire une spec, une implémentation et une démo.