¿Cómo funciona el Protocolo de Señal, utilizado por WhatsApp?

15

Quiero entender el proceso del Protocolo de Señal. Lo tengo en Google, pero no puedo encontrar ningún buen artículo o tutorial.

Quiero comprender la definición básica y la funcionalidad del protocolo de señal, y sería genial si hubiera disponible algún diagrama que describa el proceso.

    
pregunta Taha Kirmani 23.04.2016 - 11:08
fuente

1 respuesta

14

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:

  1. 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.
  2. 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 .
  3. El iniciador guarda el Identity Key del destinatario como Irecipient , el Signed Pre Key as Srecipient , y One-Time Pre Key as Orecipient .
  4. El iniciador genera un par de claves Curve25519 efímeras, Einitiator .
  5. El iniciador carga su propio Identity Key como Iinitiator .
  6. 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.
  7. 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:

  1. 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.
  2. El destinatario elimina el One-Time Pre Key utilizado por el iniciador.
  3. El iniciador utiliza HKDF para derivar un Root Key correspondiente y Chain Keys del master_secret .
respondido por el joshperry 23.05.2016 - 02:58
fuente

Lea otras preguntas en las etiquetas