Dai un'occhiata a questo white paper tecnico di WhatsApp, recentemente si sono trasferiti al Signal Protocollo per la crittografia e2e.
Tipi di chiave pubblica
-
Identity Key Pair
- Una coppia di chiavi Curve25519 a lungo termine,
generato al momento dell'installazione.
-
Signed Pre Key
- Una coppia di chiavi a medio termine Curve25519,
generato al momento dell'installazione, firmato dall'Identity Key e ruotato
a scadenze periodiche.
-
One-Time Pre Keys
- Una coppia di coppie di chiavi Curve25519 per una
tempo di utilizzo, generato al momento dell'installazione e reintegrato secondo necessità.
Tipi di chiave di sessione
-
Root Key
- Un valore di 32 byte utilizzato per creare Chiavi di catena.
-
Chain Key
- Un valore di 32 byte utilizzato per creare un messaggio
Keys.
-
Message Key
- Un valore di 80 byte utilizzato per crittografare il messaggio
contenuto. 32 byte vengono utilizzati per una chiave AES-256, 32 byte per a
Chiave HMAC-SHA256 e 16 byte per IV.
Per stabilire una sessione:
- Il client di avvio ("iniziatore") richiede al pubblico
Identity Key
,
pubblico Signed Pre Key
e pubblico unico One-Time Pre Key
per il destinatario.
- Il server restituisce i valori della chiave pubblica richiesti. Un
One-Time
Pre Key
viene usato una sola volta, quindi viene rimosso dalla memoria del server
dopo essere stato richiesto. Se l'ultimo batch di One-Time
Pre Keys
del destinatario è stato consumato e il destinatario non è stato reintegrato
loro, non verrà restituito One-Time Pre Key
.
- L'iniziatore salva
Identity Key
del destinatario come Irecipient
, il
Signed Pre Key
come Srecipient
e One-Time Pre Key
come
Orecipient
.
- L'iniziatore genera una coppia di chiavi Curve25519 effimera,
Einitiator
.
- L'iniziatore carica il proprio
Identity Key
come Iinitiator
.
- L'iniziatore calcola un segreto principale come
master_secret =
ECDH(Iinitiator, Srecipient) || ECDH(Einitiator, Irecipient) ||
ECDH(Einitiator, Srecipient) || ECDH(Einitiator, Orecipient)
.
Se non c'è One Time Pre Key
, l'ECDH finale viene omesso.
- L'iniziatore utilizza HKDF per creare un
Root Key
e Chain Keys
da master_secret
.
Impostazione della sessione di ricezione
Dopo aver creato una sessione di crittografia di lunga durata, l'iniziatore può immediatamente
inizia a inviare messaggi al destinatario, anche se il destinatario è offline.
Fino a quando il destinatario risponde, l'iniziatore include le informazioni (nel file
intestazione di tutti i messaggi inviati) che il destinatario richiede per creare un corrispondente
sessione. Questo include Einitiator
dell'iniziatore e Iinitiator
.
Quando il destinatario riceve un messaggio che include la configurazione della sessione
Informazioni:
- Il destinatario calcola il
master_secret
corrispondente utilizzando
le proprie chiavi private e le chiavi pubbliche pubblicizzate nell'intestazione di
il messaggio in arrivo.
- Il destinatario cancella il
One-Time Pre Key
utilizzato dall'iniziatore.
- L'iniziatore usa HKDF per ottenere un
Root Key
corrispondente e
Chain Keys
da master_secret
.