Echa un vistazo a este informe técnico de WhatsApp, recientemente se mudaron a Signal. Protocolo para el cifrado e2e.
Tipos de clave pública
-
Identity Key Pair
- Un par de claves Curve25519 a largo plazo,
generado en el momento de la instalación.
-
Signed Pre Key
- Un par de claves Curve25519 a mediano plazo,
generado en el momento de la instalación, firmado por la clave de identidad y girado
sobre una base de tiempo periódico.
-
One-Time Pre Keys
- Una cola de pares de claves Curve25519 para uno
uso del tiempo, generado en el momento de la instalación, y se repone según sea necesario.
Tipos de claves de sesión
-
Root Key
: un valor de 32 bytes que se utiliza para crear claves de cadena.
-
Chain Key
: un valor de 32 bytes que se utiliza para crear un mensaje
Llaves.
-
Message Key
: un valor de 80 bytes que se usa para cifrar el mensaje
contenido. Se utilizan 32 bytes para una clave AES-256, 32 bytes para una clave
HMAC-SHA256 y 16 bytes para una IV.
Para establecer una sesión:
- El cliente iniciador ("iniciador") solicita al público
Identity Key
,
public Signed Pre Key
, y un solo public One-Time Pre Key
para el destinatario.
- El servidor devuelve los valores de clave pública solicitados. Un
One-Time
Pre Key
solo se usa una vez, por lo que se elimina del almacenamiento del servidor
despues de ser solicitado Si el último lote del destinatario de One-Time
Pre Keys
se ha consumido y el destinatario no se ha repuesto
En ellos, no se devolverá One-Time Pre Key
.
- El iniciador guarda el
Identity Key
del destinatario como Irecipient
, el
Signed Pre Key
as Srecipient
, y One-Time Pre Key
as
Orecipient
.
- El iniciador genera un par de claves Curve25519 efímeras,
Einitiator
.
- El iniciador carga su propio
Identity Key
como Iinitiator
.
- El iniciador calcula un secreto maestro como
master_secret =
ECDH(Iinitiator, Srecipient) || ECDH(Einitiator, Irecipient) ||
ECDH(Einitiator, Srecipient) || ECDH(Einitiator, Orecipient)
.
Si no hay One Time Pre Key
, se omite la ECDH final.
- El iniciador usa HKDF para crear un
Root Key
y Chain Keys
desde el master_secret
.
Configuración de la sesión receptora
Después de crear una sesión de cifrado de larga duración, el iniciador puede
comience a enviar mensajes al destinatario, incluso si el destinatario está fuera de línea.
Hasta que el destinatario responda, el iniciador incluye la información (en el
encabezado de todos los mensajes enviados) que el destinatario requiere para construir una
sesión. Esto incluye el Einitiator
y Iinitiator
del iniciador.
Cuando el destinatario recibe un mensaje que incluye la configuración de la sesión
información:
- El destinatario calcula el
master_secret
correspondiente usando
sus propias claves privadas y las claves públicas anunciadas en el encabezado de
el mensaje entrante.
- El destinatario elimina el
One-Time Pre Key
utilizado por el iniciador.
- El iniciador utiliza HKDF para derivar un
Root Key
correspondiente y
Chain Keys
del master_secret
.