3. Comunicación Encriptada . El esquema asimétrico es especialmente útil para definir protocolos de comunicación encriptada entre cliente y servidor. Un ejemplo es el conocido esquema de key agreement (aceptación mútua de claves) que consiste en que el cliente y el servidor intercambian sus clave públicas con objeto de construir un secreto compartido y luego usan dicho secreto para encriptar el canal de comunicación (a partir de un cierto punto, la información que el cliente envía al servidor está encriptada por un cifrador de stream.
Pues bien, en las aplicaciones Cliente.java y Servidor.java hemos implementado un protocolo mucho más sencillo que consiste en los siguientes pasos:
1. Servidor crea un par (clave pública y clave privada) y envía al cliente la parte pública.
2. Cliente crea una clave secreta, utiliza la clave pública que llega del servidor para encriptarla y se la envía al servidor.
3. Servidor recibe a clave secreta encriptada por la clave pública, y utiliza su clave privada para desencriptarla. Una vez desencriptada, la utiliza para inicializar un cifrador de stream de entrada. Por lo tanto crea un IV y se lo envía al cliente.
4. Cliente recibe el IV u utiliza su clave secreta (la misma que ha utilizado el servidor) para inicializar un cifrador de stream de salida. A partir de este punto todo lo que tecleemos en la terminal del cliente se encripta y se transmite al servidor.
5. Servidor desencripta todo lo que reciba y muestra el texto por pantalla.
En este ejercicio se pide lo siguiente:
a) Modificar el servidor para que muestre directamente lo que le llega encriptado desde el cliente. El resultado será el programa Ejercicio3aServidor.java.
b) Modificar tanto el cliente como el servidor para que en lugar de utilizar el algoritmo de encriptación asimétrica utilicen el algoritmo de El Gamal. Los resultados serán los ficheros Ejercicio3bServidor.java y Ejercicio3bCliente.java.