web-dev-qa-db-fra.com

Comment fonctionne le protocole de signal, utilisé par WhatsApp,?

Je veux comprendre le processus du protocole de signal. Je l'ai sur Google, mais je ne trouve aucun bon article ou tutoriel.

Je veux comprendre la définition de base et la fonctionnalité du protocole de signal, et ce serait formidable si un diagramme décrivant le processus était disponible.

19
Taha Kirmani

Jetez un oeil à ce livre blanc technique de WhatsApp, ils ont récemment migré vers le protocole de signal pour le cryptage e2e.

Types de clé publique

  • Identity Key Pair - Une paire de clés Curve25519 à long terme, générée au moment de l'installation.
  • Signed Pre Key - Une paire de clés Curve25519 à moyen terme, générée au moment de l'installation, signée par la clé d'identité et pivotée périodiquement.
  • One-Time Pre Keys - Une file d'attente de paires de clés Curve25519 à usage unique, générée au moment de l'installation et réapprovisionnée au besoin. Types de clés de session
  • Root Key - Une valeur de 32 octets qui est utilisée pour créer des clés de chaîne.
  • Chain Key - Une valeur de 32 octets qui est utilisée pour créer des clés de message.
  • Message Key - Une valeur de 80 octets utilisée pour crypter le contenu du message. 32 octets sont utilisés pour une clé AES-256, 32 octets pour une clé HMAC-SHA256 et 16 octets pour un IV.

Pour établir une session:

  1. Le client initiateur ("initiateur") demande au public Identity Key, Public Signed Pre Key Et un seul public One-Time Pre Key Pour le destinataire.
  2. Le serveur renvoie les valeurs de clé publique demandées. Un One-Time Pre Key N'est utilisé qu'une seule fois, il est donc supprimé du stockage du serveur après avoir été demandé. Si le dernier lot de One-Time Pre Keys Du destinataire a été consommé et que le destinataire ne les a pas réapprovisionnés, aucun One-Time Pre Key Ne sera retourné.
  3. L'initiateur enregistre le Identity Key Du destinataire sous Irecipient, le Signed Pre Key Sous Srecipient et le One-Time Pre Key Sous Orecipient.
  4. L'initiateur génère une paire de clés Curve25519 éphémère, Einitiator.
  5. L'initiateur charge son propre Identity Key En tant que Iinitiator.
  6. L'initiateur calcule un secret principal comme master_secret = ECDH(Iinitiator, Srecipient) || ECDH(Einitiator, Irecipient) || ECDH(Einitiator, Srecipient) || ECDH(Einitiator, Orecipient). S'il n'y a pas de One Time Pre Key, L'ECDH final est omis.
  7. L'initiateur utilise HKDF pour créer un Root Key Et Chain Keys À partir du master_secret.

Configuration de la session de réception

Après avoir créé une session de chiffrement de longue durée, l'initiateur peut immédiatement commencer à envoyer des messages au destinataire, même si le destinataire est hors ligne. Jusqu'à ce que le destinataire réponde, l'initiateur inclut les informations (dans l'en-tête de tous les messages envoyés) dont le destinataire a besoin pour créer une session correspondante. Cela inclut les Einitiator et Iinitiator de l'initiateur.

Lorsque le destinataire reçoit un message contenant des informations de configuration de session:

  1. Le destinataire calcule le master_secret Correspondant en utilisant ses propres clés privées et les clés publiques annoncées dans l'en-tête du message entrant.
  2. Le destinataire supprime le One-Time Pre Key Utilisé par l'initiateur.
  3. L'initiateur utilise HKDF pour dériver un Root Key Et Chain Keys Correspondant du master_secret.
17
joshperry