Aplicacion de chat cifrado peer-to-peer con intercambio de claves ECDH y cifrado AES-256-GCM.
Chat de consola en Java puro (sin dependencias externas) que permite a dos usuarios comunicarse de forma segura a traves de una red TCP. Implementa cifrado de extremo a extremo usando criptografia de curva eliptica y AES.
- ECDH secp256r1 — Intercambio de claves mediante curva eliptica P-256
- AES-256-GCM — Cifrado autenticado de mensajes (confidencialidad + integridad)
- HKDF-SHA-256 — Derivacion de claves segura (RFC 5869)
- Claves efimeras — Perfect Forward Secrecy (PFS)
- Sin dependencias — Solo utiliza el JDK estandar (Java 11+)
- Observador de sesion — Visualizacion en tiempo real del protocolo criptografico
- Java 11 o superior
- Docker (opcional, para ejecucion en contenedores)
./scripts/build.shGenera dos archivos en build/:
encrypted-chat.jar— aplicacion principal de chatobserver.jar— observador de sesion
./scripts/test.shRequiere Java instalado en ambas maquinas.
Maquina A (servidor):
java -jar build/encrypted-chat.jar server --port 5050 --name AliciaMaquina B (cliente):
java -jar build/encrypted-chat.jar client --host IP_MAQUINA_A --port 5050 --name BrunoPara salir del chat: /salir
No requiere Java ni codigo fuente en la maquina remota, solo Docker.
docker build -t andresb420/encrypted-chat:latest .
docker push andresb420/encrypted-chat:latestMaquina A (servidor):
docker run -it -p 5050:5050 andresb420/encrypted-chat:latest server --port 5050 --name AliciaMaquina B (cliente):
docker run -it andresb420/encrypted-chat:latest client --host IP_MAQUINA_A --port 5050 --name BrunoPara probar ambos roles en una sola maquina:
docker-compose up --buildPara adjuntarse a cada contenedor e interactuar:
docker attach encrypted-chat-java-server-1
docker attach encrypted-chat-java-client-1El observador muestra en tiempo real todos los valores internos del protocolo: claves, nonces, texto plano, frames TCP cifrados, fingerprint y resultado de la confirmacion HMAC.
Siempre corre directamente en tu maquina (sin Docker).
Terminal 1 — arrancar el observador:
java -jar build/observer.jarTerminal 2 — servidor con observe activo:
java -jar build/encrypted-chat.jar server --port 5050 --name Alicia --observeTerminal 3 — cliente con observe activo:
java -jar build/encrypted-chat.jar client --host 127.0.0.1 --port 5050 --name Bruno --observeTerminal 1 — arrancar el observador en tu maquina:
java -jar build/observer.jarTerminal 2 — servidor Docker:
docker run -it -p 5050:5050 \
-e OBSERVER_HOST=host.docker.internal \
andresb420/encrypted-chat:latest server --port 5050 --name Alicia --observeTerminal 3 — cliente Docker:
docker run -it \
-e OBSERVER_HOST=host.docker.internal \
andresb420/encrypted-chat:latest client --host host.docker.internal --port 5050 --name Bruno --observe
host.docker.internales la direccion que Docker Desktop usa para referirse a tu maquina host. Funciona en Windows y Mac. En Linux usar la IP de la interfazdocker0(normalmente172.17.0.1).
El observador corre en la Maquina A. Ambos contenedores envian sus eventos a esa maquina.
Maquina A — observador + servidor:
# Terminal 1
java -jar build/observer.jar
# Terminal 2
docker run -it -p 5050:5050 -p 7777:7777/udp \
-e OBSERVER_HOST=host.docker.internal \
andresb420/encrypted-chat:latest server --port 5050 --name Alicia --observeMaquina B — cliente apuntando al observador de Maquina A:
docker run -it \
-e OBSERVER_HOST=IP_MAQUINA_A \
andresb420/encrypted-chat:latest client --host IP_MAQUINA_A --port 5050 --name Bruno --observeAsegurarse de que el puerto UDP 7777 este abierto en el firewall de Maquina A.
| Opcion | Descripcion | Aplica a |
|---|---|---|
--port |
Puerto TCP (default: 5050) | server, client |
--host |
IP o hostname del servidor | client |
--name |
Nombre del usuario en el chat | server, client |
--bind |
Direccion de escucha (default: 0.0.0.0) | server |
--observe |
Activa el envio de eventos al observador | server, client |
| Variable de entorno | Descripcion | Default |
|---|---|---|
OBSERVER_HOST |
Host donde corre el observador | localhost |
Proyecto academico.

