Estoy creando un chat anónimo donde una de las premisas es que las conversaciones se cifran de extremo a extremo. Estoy utilizando Firebase, por lo que toda la comunicación entre los clientes y el servidor está protegida por SSL. Pero estoy intentando ocultar el chat incluso desde el servidor.
Tuve la siguiente idea para el intercambio de claves. Tenga en cuenta que no estoy dispuesto a usar Diffie Hellman ya que no pude encontrar bibliotecas JavaScript compatibles, por lo que solo RSA y cualquier otro cifrado simétrico funcionarán.
Aquí está el algoritmo:
- El usuario Alice quiere chatear con Bob .
- Alice genera un par de claves pública / privada y envía su clave pública a Bob .
- Bob acepta el chat generando una clave pública / privada y envía la parte pública a Alice .
- Ahora el servidor y los usuarios conocen ambas claves públicas.
- Alice , que es el usuario que inició el chat, genera una clave simétrica, la cifra con Bob clave pública.
- Como cualquier otro usuario podría cifrar esta clave y enviarla con bob, Alice también envía el hash cifrado del mensaje cifrado con su clave privada, por lo que Bob puede verificar que fue Alice quien generó la clave.
- Alice envía el mensaje (clave simétrica cifrada + firma digital) a Bob .
- Primero, Bob descifra la firma digital con la clave pública Alice y compárela con el mensaje cifrado; si no se comprueba, el chat falla.
- Bob descifra la clave simétrica con su clave privada.
- Ahora Bob y Alice tienen la misma clave simétrica y Bob está seguro de que fue Alice quien generó esta clave.
¿Es correcto este algoritmo?