Recientemente me interesé por el cifrado y los métodos detrás de ellos. Así que para un proyecto divertido / escolar, estoy creando un programa en Python para cifrar datos entre dos clientes (chat y archivos).
Realmente no estoy seguro de cómo hacer que sea realmente seguro contra ataques tanto pasivos como activos. En este momento, mi idea es usar un servidor para establecer un acuerdo entre los clientes de la siguiente manera:
- Una vez que un cliente se inicia, se conecta al servidor para que sepa que está vivo.
- El cliente bob le dice al servidor que quiere conectarse al cliente Alice
- El servidor envía un mensaje al cliente Alice que bob quiere configurar una conexión segura
- Alicia le dice al servidor que acepta la conexión
- El servidor genera un número aleatorio y lo cifra utilizando la clave pública del cliente El cliente tiene una clave RSA privada codificada (no cambia por conexión / cliente)
- El servidor envía el número aleatorio a Alice y Bob
- Alice y Bob descifran el número aleatorio y lo trocean, ambos lo envían de vuelta al servidor
- El servidor comprueba si ambos hashes son iguales (ninguno está atenuado)
- El servidor envía un OK o error a ambas partes
- Alice y Bob hacen el número de hash un número de veces igual al número aleatorio (por lo tanto, si el servidor envía 1234, lo hace de 1234 veces.
- Alice y Bob configuraron una clave común para esta conexión mediante el intercambio de claves Diffie-Hellman y cifran el intercambio con AES.
- Una vez que se decida una clave común, use esta clave o un hash de esta clave para el cifrado AES (esta clave cambia por conexión y todos los datos se envían a través de este canal)
El único problema que veo con este protocolo es si los adversarios pueden aplicar ingeniería inversa a mi código para obtener la clave privada, y pueden usar ataques activos tanto en la conexión de Alice como en la de Bob O si el servidor está comprometido.
Usaré py2exe para compilar el código, de esa manera debería ser difícil obtener la clave, pero no estoy seguro de cuán difícil sería.
Lo siento por la larga pregunta, pero se siente como una idea realmente horrible de codificar la clave en el cliente, pero no estoy seguro de a dónde ir desde aquí.
Reflexiones sobre esta idea / mejoras / ¿Cómo puedo hacerlo mejor?
Lo siento por cualquier error tipográfico, el inglés no es mi primer idioma.