Le protocole Signal
X3DH : l'établissement initial
Avant que le moindre message ne circule, deux personnes doivent établir un premier secret partagé. Signal réalise cette étape avec un protocole nommé X3DH, conçu pour un monde où l'on est rarement en ligne au même moment.
Le défi : le destinataire est hors ligne
Sur une messagerie mobile, quand Alice écrit à Bob, ce dernier a souvent son téléphone éteint ou hors réseau. On ne peut donc pas compter sur un dialogue en direct entre les deux appareils pour se mettre d'accord.
L'astuce : Bob publie à l'avance, sur un serveur, un lot de clés publiques. Alice les récupère quand elle veut et peut établir le secret toute seule, sans que Bob soit connecté.
Les clés en jeu
X3DH signifie Extended Triple Diffie-Hellman : Diffie-Hellman triple étendu. Il combine plusieurs clés publiques :
- IK — la clé d'identité, permanente, propre à chaque personne (elle authentifie qui l'on est) ;
- SPK — une pré-clé signée (signed prekey), renouvelée périodiquement, signée par la clé d'identité pour prouver son origine ;
- OPK — une pré-clé à usage unique (one-time prekey), consommée pour une seule session ;
- EK — une clé éphémère qu'Alice génère spécialement pour cet échange.
Bob publie à l'avance IK_B, SPK_B et un stock d'OPK_B sur le serveur. Alice apporte IK_A et EK_A.
Combiner plusieurs Diffie-Hellman
Un échange Diffie-Hellman (DH) permet à deux clés (une privée d'un côté, une publique de l'autre) de produire un secret commun. X3DH en calcule plusieurs et les concatène, puis passe le tout dans une KDF :
DH1 = DH( IK_A , SPK_B ) <- lie l'identité d'Alice à la pré-clé de Bob
DH2 = DH( EK_A , IK_B ) <- lie l'éphémère d'Alice à l'identité de Bob
DH3 = DH( EK_A , SPK_B ) <- éphémère d'Alice x pré-clé signée de Bob
DH4 = DH( EK_A , OPK_B ) <- éphémère x pré-clé à usage unique (si dispo)
secret_partagé = KDF( DH1 || DH2 || DH3 || DH4 )
Pourquoi cette combinaison
Chaque DH apporte une garantie précise, et c'est leur cumul qui fait la force du protocole :
| DH | Ce qu'il apporte |
|---|---|
| DH1 | authentifie Bob (sa pré-clé signée) auprès d'Alice |
| DH2 | authentifie Alice (son identité) auprès de Bob |
| DH3, DH4 | apportent de l'aléa frais -> forward secrecy dès le départ |
Le résultat : un secret partagé qui authentifie les deux identités et démarre déjà avec de la confidentialité persistante, le tout sans que Bob soit en ligne. Ce secret servira ensuite de graine (la première clé de chaîne) au double cliquet.
En résumé
- X3DH établit le premier secret partagé d'une conversation Signal.
- Il combine plusieurs Diffie-Hellman entre clés d'identité, éphémères et pré-clés publiées sur un serveur.
- Les pré-clés permettent d'établir la session même si le destinataire est hors ligne.
- Le protocole authentifie les deux identités et fournit déjà de la forward secrecy.

