Messageries : Signal et WhatsApp

Une roue à cliquet dont le loquet bloque le retour, avec des bulles de texte qui avancent dent après dent.

Tu envoies un message à ton meilleur ami. Quelques centièmes plus tard il est sur son écran, et en chemin il est passé par au moins cinq ordinateurs que tu n'as jamais vus. Pourtant, Signal et WhatsApp affirment tous les deux qu'aucun de ces cinq ne l'a lu — eux-mêmes non plus. C'est une grosse promesse, et elle est tenable. Ce chapitre montre avec quelles pièces, et où la promesse s'arrête.

Les mots dont tu as besoin

Chiffrement de bout en bout
Chiffré depuis ton appareil jusqu'à celui de l'autre, et déchiffré nulle part entre les deux. Le serveur ne voit que du texte chiffré. Souvent abrégé en E2EE, de l'anglais end-to-end encryption.
Chiffrement de transport
Chiffré seulement sur la ligne. Le serveur déchiffre, regarde, et rechiffre pour le tronçon suivant. C'est ce que fait le cadenas dans ton navigateur, et c'est tout autre chose.
Protocole Signal
La recette que Signal a inventée et que WhatsApp utilise aussi. Ce n'est pas une appli mais un accord sur quel calcul se fait quand.
Clé de réserve (prekey)
Une moitié d'échange de clés que tu déposes d'avance chez le serveur, pour que quelqu'un puisse te joindre pendant que tu dors.
Ratchet
Mot anglais pour cliquet : la roue dentée d'une clé à cliquet, qui ne peut tourner que dans un sens. Ici : la clé avance d'une dent à chaque message et ne peut jamais revenir en arrière.
Métadonnées
Tout ce qui entoure le message : qui, à qui, quand, combien de fois, quelle taille. Pas le contenu, mais l'enveloppe.

Chiffré n'est pas la même chose que de bout en bout

Presque chaque appli dit qu'elle chiffre, et presque chaque appli dit vrai. La question est jusqu'où. Avec un chiffrement de transport ordinaire, ton message part chiffré vers le serveur, y est déchiffré, reste lisible sur un disque, et repart chiffré vers ton ami. Celui qui possède ce serveur lit tout : l'entreprise, un employé qui va trop loin, un cambrioleur, un juge avec un mandat.

Avec le chiffrement de bout en bout, le serveur n'a pas la clé. Non pas parce que l'entreprise promet de ne pas regarder, mais parce qu'il n'y a rien à regarder. Cette différence n'est ni juridique ni éthique, elle est mathématique, et elle tient même si l'entreprise change de propriétaire.

Chiffrement de transportChiffrement de bout en bout
Qui a la clé ?toi, le serveur, l'autretoi et l'autre
Qu'y a-t-il sur le serveur ?ton message, lisibledu texte chiffré
Que peut donner le serveur à la police ?le contenule texte chiffré, et il ne vaut rien

Comment joindre quelqu'un qui dort ?

chapitre 5 se terminait par une limite : Diffie–Hellman demande deux parties qui participent en même temps. Tu envoies quelque chose, elle renvoie quelque chose, et seulement alors tu as un secret partagé. Mais ton ami dort à trois heures du matin, et ton message doit quand même être là quand il se réveille.

La solution s'appelle X3DH, pour Extended Triple Diffie–Hellman. L'idée : tu fais ta moitié de l'échange d'avance, et tu la laisses chez le serveur.

  1. Quand tu installes l'appli, ton appareil crée un petit tas de moitiés de clés : une fixe (ton identité) et une réserve d'exemplaires jetables. Les moitiés publiques vont au serveur, les secrètes restent sur ton appareil.
  2. Si je veux t'envoyer quelque chose pendant que tu es hors ligne, je vais chercher un de ces petits tas. Je n'ai pas besoin de plus.
  3. Je fais l'échange tout seul : mon secret contre tes moitiés publiques. Il en sort un secret partagé. Je chiffre mon message et je l'envoie.
  4. Quand tu te réveilles, tu fais le même calcul à l'envers avec tes moitiés secrètes. Même secret, message lisible. Nous n'avons pas été en ligne ensemble une seule seconde.

Ce ne sont pas de nouvelles mathématiques : c'est trois ou quatre fois le même Diffie–Hellman de ce chapitre-là, sur une courbe elliptique, et les résultats sont collés bout à bout et passés dans une fonction de hachage (chapitre 2). Ce qui en sort est simplement une clé AES, et à partir de là tu es de retour dans chapitre 4.

Signal est passé ici à PQXDH en 2023. C'est la même construction, mais le secret partagé est maintenant calculé de deux manières à la fois : avec la courbe classique X25519 et avec CRYSTALS-Kyber, une méthode dont on pense qu'un ordinateur quantique n'en vient pas à bout non plus. Qui veut le secret doit casser les deux. Signal l'a annoncé le 19 septembre 2023.

La clé change à chaque message

Un seul secret partagé pour toute votre amitié serait une mauvaise idée. Qui y accède une fois lit tout : les messages d'aujourd'hui et ceux d'il y a trois ans. C'est pourquoi le protocole Signal jette la clé après chaque message et en calcule une nouvelle. Ce mécanisme s'appelle le double ratchet, le double cliquet.

Deux roues dentées tournent l'une dans l'autre. La première est une chaîne de fonctions de hachage : à partir de la clé de ce message tu calcules celle du suivant, et ce calcul ne peut aller que dans un sens — exactement la propriété de chapitre 2. La deuxième roue est un Diffie–Hellman tout frais : chaque fois qu'une réponse arrive, vous envoyez tous les deux une nouvelle moitié publique et la chaîne recommence depuis le début.

Conséquence 1 : qui pirate ton téléphone aujourd'hui ne peut pas lire hier

Imagine que quelqu'un mette la main sur ton appareil et en extraie la clé qui s'y trouve en ce moment. Avec cette clé, il peut déchiffrer le message suivant. Pas le précédent, et encore moins celui de la semaine dernière : ces clés n'existent plus, et remonter de la clé d'aujourd'hui à celle d'alors, c'est précisément inverser la fonction de hachage. Ça s'appelle la forward secrecy, la confidentialité persistante. C'est le même principe qu'une clé à cliquet : tu peux compter les dents vers l'avant, pas vers l'arrière.

Conséquence 2 : il reperd la clé après quelques messages

Maintenant l'autre côté. Quelqu'un a volé ta clé et lit par-dessus ton épaule. Tant que tu ne fais qu'émettre, ça reste ainsi — il fait simplement avancer la chaîne de hachage avec toi. Mais dès que ton ami répond, une moitié Diffie–Hellman toute fraîche arrive avec la réponse, et elle contient un nouveau nombre secret que l'espion n'a jamais vu. À partir de ce moment-là, sa chaîne ne colle plus et il est dehors. Ça s'appelle la post-compromise security, ou l'auto-guérison : la conversation se soigne toute seule, sans que personne doive s'apercevoir de quoi que ce soit ni faire quoi que ce soit.

C'est là la différence avec la carte-clé de chapitre 8.1. Là, tu as une seule clé qui reste, et qui la récupère l'a pour toujours. Pratique pour comprendre ce qui se passe, inutilisable pour une conversation qui dure des années.

Parles-tu bien à ton ami ?

Ici revient le trou de chapitre 5. Toutes ces mathématiques font que seuls toi et le propriétaire de ces moitiés de clés publiques peuvent lire. Elles ne disent pas que ce propriétaire est ton ami. Celui qui possède le serveur pourrait te donner ses propres moitiés de clés à la place de celles de ton ami, mener une conversation séparée avec toi et avec lui, et tout transmettre. Un man-in-the-middle, et vous ne vous apercevez de rien.

C'est pourquoi tu peux le vérifier toi-même. À partir de ta clé publique et de celle de ton ami, les applis calculent ensemble un seul nombre, et ce nombre, tu peux le comparer. S'il correspond des deux côtés, il n'y a personne entre vous. Ça prend dix secondes et presque personne ne le fait.

SignalWhatsApp
Comment ça s'appelle ?numéro de sécurité (safety number)code de sécurité (security code)
Où le trouves-tu ?ouvre la conversation, touche le nom en haut, choisis Afficher le numéro de sécuritéouvre la conversation, touche le nom en haut, choisis Chiffrement
Que vois-tu ?un QR-code et 60 chiffres en 12 groupes de cinqun QR-code et 60 chiffres
Comment compares-tu ?si vous êtes l'un à côté de l'autre : l'un scanne le QR-code de l'autre. Si vous n'êtes pas côte à côte : lis les chiffres à voix haute au téléphonepareil
Ensuitetu peux mettre le contact sur Vérifié ; une coche apparaît dans l'en-tête de la conversationune coche verte quand le scan réussit

Ne compare jamais via l'appli elle-même. Si quelqu'un est au milieu, il adapte tout simplement les chiffres. Fais-le côte à côte avec le QR-code, ou au téléphone, là où tu reconnais la voix.

Ton numéro de sécurité saute soudain sur un autre nombre ? Le plus souvent ça veut dire que ton ami a un nouveau téléphone ou a réinstallé l'appli — nouvelles clés, nouveau numéro. Mais c'est exactement le même signal que donnerait un man-in-the-middle. Demande-le-lui, par un autre canal que ce chat.

Ce que le fabricant de l'appli voit encore

Pas le contenu. L'enveloppe oui, et c'est plus que tu ne crois. Qui avec qui, à quelle heure, combien de fois, combien de temps a duré une conversation, depuis quelle adresse IP, avec quel appareil. Tu n'as besoin de lire aucun message pour savoir que quelqu'un a téléphoné une demi-heure à 02:14 avec un médecin de garde, et trois fois le lendemain avec sa meilleure amie. Le contenu est secret ; l'histoire ne l'est pas.

Sur ce point, Signal et WhatsApp diffèrent vraiment, et la différence n'est pas dans le chiffrement — c'est le même protocole chez les deux. Elle est dans ce que l'entreprise conserve.

SignalWhatsApp
Qu'ont-ils déjà donné à un juge ? la date de création du compte et la date de la dernière connexion. Ils n'ont pas plus. nom, date de début du service, dernière connexion, adresse IP, type d'appareil, adresse e-mail, ton texte « infos », photo de profil, groupes et contacts — d'après leurs propres directives pour les autorités.
Qui parle avec qui ? Signal le cache avec le sealed sender : l'expéditeur est lui aussi dans l'enveloppe chiffrée, le serveur ne voit que le destinataire. le serveur voit quel numéro écrit à quel numéro, quand et combien de temps.
Ton carnet d'adresses Signal ne garde sur le serveur ni liste de contacts, ni noms de groupes, ni noms de profil ; ils sont chiffrés. fait partie des données que l'entreprise possède.

Signal est une ASBL qui vit de dons, WhatsApp appartient à une entreprise qui vit de la publicité. Ça explique la différence mieux que n'importe quel argument technique : conserver des métadonnées coûte de l'argent et ne rapporte que si on en fait quelque chose.

La porte dérobée que tu ouvres toi-même : la sauvegarde

Tu peux tout faire bien et le donner quand même. Si tu mets tes discussions dans une sauvegarde cloud ordinaire, elles y sont lisibles. Non pas parce que le chiffrement a échoué, mais parce que tu as toi-même posé à côté une copie qui n'en relève pas. Qui accède à ce cloud a tout ton historique de conversations, et le plus beau cliquet du monde n'y change rien.

WhatsApp appelle la sauvegarde chiffrée, dans sa propre annonce, une couche supplémentaire et facultative que tu actives toi-même. Tu la trouves dans Paramètres › Discussions › Sauvegarde des discussions › Sauvegarde chiffrée de bout en bout. Tu choisis toi-même avec quoi tu la fermes : une clé d'accès (passkey, ton empreinte digitale ou ton visage), un mot de passe, ou une clé de 64 caractères que tu recopies et conserves. Va voir sur ton propre appareil — c'est le seul réglage de ce chapitre que tu peux changer aujourd'hui.

Si tu choisis le mot de passe, la vraie clé va se coucher dans un coffre sécurisé chez WhatsApp, qui ne la libère que si le mot de passe est correct et qui compte le nombre de tentatives. Si tu choisis les 64 caractères, la clé n'existe que sur papier chez toi. La deuxième option est plus sûre et plus impitoyable : si tu la perds, ta sauvegarde est perdue, et personne ne peut la récupérer. Ce n'est pas un mauvais service, c'est ce que le mot de bout en bout signifie.

Signal ne fait par défaut rien avec le cloud. Si tu veux quand même une sauvegarde, tu reçois une clé de récupération de 64 caractères qui est créée sur ton propre appareil et ne part jamais vers le serveur — même principe, même responsabilité.

Et la fuite la plus simple de toutes : l'écran de l'autre. Une capture d'écran, quelqu'un qui regarde par-dessus ton épaule dans le bus, ou un téléphone qui traîne sur la table sans code. Aucun protocole ne protège contre un message qui est tout simplement lu par quelqu'un qui a le droit d'être là. Ce que ça veut dire concrètement pour ton appareil lui-même se trouve dans chapitre 7.6.

Voici les maths : prouver qu'une conversation tient debout

Le ratchet est une longue chaîne : k1 = H(k0), k2 = H(k1), et ainsi de suite, avec H une fonction de hachage. Que la chaîne ne puisse aller que dans un sens n'est pas un choix de conception de Signal mais une propriété de H. Toutes les promesses ci-dessus — forward secrecy, auto-guérison — sont des conséquences que tu déduis de cette seule propriété.

De telles déductions sont trop compliquées pour qu'on s'y fie à la main, car un protocole compte des dizaines de messages qui peuvent arriver dans n'importe quel ordre, disparaître ou être répétés. C'est pourquoi il existe une discipline qui prouve les protocoles au lieu de les tester : tu écris le protocole comme un objet mathématique, tu écris ce qu'un attaquant a le droit de faire, et tu déduis qu'il ne gagne pas. Pour le protocole Signal, Katriel Cohn-Gordon, Cas Cremers, Benjamin Dowling, Luke Garratt et Douglas Stebila l'ont fait en 2017, dans un article intitulé A Formal Security Analysis of the Signal Messaging Protocol.

Ce domaine s'appelle la vérification formelle, et il se situe à la frontière de la logique et de l'informatique. C'est le seul domaine de la sécurité où tu n'as pas besoin d'espérer : tu as une preuve, ou tu n'en as pas.