La forma más eficiente de chat encriptado

7

Estoy creando un servidor donde las personas pueden venir y hablar entre ellas. Lo hago principalmente para un proyecto divertido, aquí está mi pregunta.

Estoy usando RSA para el cifrado / descifrado, por lo que solo los clientes sabrán lo que se dice. No quiero que el servidor maneje ningún texto descifrado.

Mi pregunta es, ¿cuál es la forma más eficiente de hacer esto? Desde mi entendimiento, tendré que darles a todos la clave pública de cada uno. Y una vez que un cliente diga algo, tendrá que cifrarlo para cada persona individualmente utilizando su respectiva clave pública, ¿no es así? Para mí eso parece extremadamente ineficiente.

¿Hay una mejor manera de hacer esto?

Gracias

    
pregunta Austin 22.03.2012 - 22:20
fuente

5 respuestas

10

La criptografía de clave pública puede, en este caso, usarse para facilitar la configuración de un canal seguro en el que transmitir una clave simétrica. Una vez que se ha configurado el canal seguro, no es necesario continuar cifrando y descifrando usando las claves públicas / privadas. En su lugar, genere una clave simétrica y utilícela para cifrar el tráfico. Solo tiene que distribuir la clave simétrica una vez, y el tráfico solo necesita cifrarse con esta clave en lugar de con cada clave pública. El principal desafío es cuándo o si la clave simétrica necesita regenerarse, revocarse, etc.

    
respondido por el logicalscope 22.03.2012 - 22:34
fuente
4

La forma más eficiente es que los clientes intercambien sus claves públicas RSA y luego generen "claves de sesión" aleatorias para usar para conversar entre sí. Esto evita el cifrado múltiple y no requiere que el servidor pueda descifrar los datos.

Entonces, si Jack va a hablar con Jill y Seth, Jack genera una clave de cifrado aleatoria para usar para hablar con Jill y Seth. Jack cifra esta clave con la clave pública de Jill y la clave pública de Seth y envía las claves cifradas a Jill y Set. El servidor no puede descifrarlos. Ahora Jill y Set saben la llave que usará Jack. Jack ahora puede cifrar los mensajes una vez con esta clave y hacer que el servidor los transmita a Jill y Seth. Jill y Seth pueden descifrar los datos con la clave de sesión. El servidor nunca puede descifrar los datos.

Esto significa que los clientes deberán mantener las tablas de claves de sesión y generar nuevas claves para cualquier combinación distinta de clientes con los que deseen hablar.

Tenga en cuenta que con todos estos esquemas, a menos que use certificados, son vulnerables a un ataque en el que el servidor simplemente sustituye sus claves por las claves del cliente y descifra todo el tráfico, sin el conocimiento de los clientes.

    
respondido por el David Schwartz 23.03.2012 - 04:08
fuente
3

Ejecute un servidor jabber y dígales que usen pidgin con OTR

    
respondido por el RobotHumans 22.03.2012 - 22:31
fuente
1

En general, el intercambio de información de chat encriptado asimétricamente comienza con el intercambio de claves públicas. Idealmente, debería tener algún mecanismo para vincular la clave al propietario (piense en certificados y firmas SSL) para evitar ataques MITM. Es más fácil utilizar un sistema existente (como certificados SSL o claves PGP) para evitar reinventar la rueda. Las firmas en las que decida confiar dependen del tipo de modelo de confianza que le interese mantener. Un buen punto de partida es determinar exactamente qué constituye la identidad de un usuario y qué tipo de acceso tendría que tener un atacante para robar esa identidad.

Luego, por supuesto, use RSA para cifrar las claves de sesión ad-hoc usadas para criptografía simétrica como AES, Twofish, RC4, etc. La eficiencia radica en el hecho de que solo está usando RSA para establecer la identidad del partido. se está comunicando con e inmediatamente cambia a algo más eficiente.

Por otro lado
Si está hablando de usar RSA en un medio de transmisión (piense en IRC en lugar de en Jabber), entonces sí, esto es terriblemente ineficiente. El cifrado es necesariamente punto a punto, en lugar de punto a multipunto. Cada flujo es encriptado individualmente. Por lo tanto, la cantidad de transmisiones encriptadas que genera un determinado cliente es igual a la cantidad de destinos a los que se envía el mensaje. Cada uno se configura independientemente de los demás. Esto es precisamente por lo que los sistemas como IRC no cifran de extremo a extremo entre diferentes clientes. La sobrecarga sería simplemente demasiado. A lo sumo, cifran el cliente al servidor, permitiendo que cada usuario tenga un solo canal seguro, con el servidor que maneja la distribución de mensajes.

Eso no quiere decir que lo que estás haciendo es imposible o poco aconsejable. Si quieres construirlo, entonces adelante.

    
respondido por el tylerl 25.03.2012 - 22:29
fuente
0

¿Qué hay de cambiar de RSA a una variante de intercambio de claves Diffie-Hellman? Elija un primo (p) y una base (g) compartidos entre todos los participantes, y luego cada participante elige su propia clave privada (a) y publica una clave pública (A = G ^ a mod p) derivada de ella. Luego, para comunicarse con algún otro participante, simplemente elevan la clave pública del otro usuario a su propia clave privada (mod p), y obtendrán un secreto compartido que esos dos participantes pueden usar para cifrar (con algún cifrado simétrico apropiado) los mensajes entre ellos.

Esto todavía requiere que todos conozcan las claves públicas de todos los demás, y que un mensaje con múltiples destinatarios se cifre y se envíe por separado para cada destinatario; pero le permite omitir el paso donde cada par de participantes tiene que negociar una clave de sesión compartida.

p.s. este método tiene algunas limitaciones de seguridad; por ejemplo, si alguna vez se expone la clave privada de un usuario, todos sus mensajes pasados se pueden descifrar de forma trivial.

    
respondido por el Gordon Davisson 23.03.2012 - 05:41
fuente

Lea otras preguntas en las etiquetas