Aplicación de Transferencia Segura de Archivos en Sistemas Distribuidos mediante Sockets TCP, Cifrado Simétrico (AES-GCM), Cifrado Asimétrico Híbrido (RSA) y Verificación de Integridad (SHA-256).
Java Crypto Sockets es una aplicación desarrollada en Java para la asignatura de Sistemas Distribuidos. Su objetivo principal es demostrar cómo implementar mecanismos avanzados de seguridad de la información y criptografía en la transmisión distribuida de datos a través de sockets de red TCP.
El sistema permite transferir cualquier tipo de archivo (texto, imágenes, documentos, ejecutable, etc.) entre un cliente emisor y un servidor receptor de manera confidencial e íntegra.
-
🔒 Cifrado Simétrico (AES-GCM):
- Utiliza el algoritmo AES en modo GCM (Galois/Counter Mode) con vectores de inicialización (IV) de 12 bytes y etiquetas de autenticación de 128 bits.
- Implementa la transmisión de la clave secreta por un puerto separado (Puerto 7001) y los datos cifrados por el puerto principal (Puerto 7000).
-
🔑 Cifrado Asimétrico Híbrido (RSA + AES-GCM):
- Generación dinámica de par de llaves RSA (Pública / Privada).
- El receptor envía su clave pública RSA al emisor.
- El emisor genera una clave de sesión AES, cifra el archivo con AES-GCM y cifra la clave AES utilizando la clave pública RSA.
- Comunicación centralizada por el Puerto 6000.
-
🛡️ Verificación de Integridad con SHA-256:
- Calcula la huella digital (Hash SHA-256) del archivo original antes del envío y la compara automáticamente con el hash del archivo recibido y descifrado.
-
🧰 Arquitectura Limpia para Apache NetBeans:
- Proyecto optimizado y empaquetado para abrirse directamente en Apache NetBeans IDE mediante script Ant (
build.xml) sin dependencias de IDEs de terceros.
- Proyecto optimizado y empaquetado para abrirse directamente en Apache NetBeans IDE mediante script Ant (
java-crypto-sockets/
├── assets/
│ └── banner.png # Imagen gráfica de presentación
├── nbproject/ # Configuración nativa del proyecto Apache NetBeans
│ ├── build-impl.xml
│ ├── genfiles.properties
│ ├── project.properties
│ └── project.xml
├── src/
│ ├── EmisorSimetrico.java # Cliente emisor (Cifrado Simétrico AES)
│ ├── ReceptorSimetrico.java # Servidor receptor (Cifrado Simétrico AES)
│ ├── EmisorAsimetrico.java # Cliente emisor (Cifrado Asimétrico Híbrido RSA+AES)
│ ├── ReceptorAsimetrico.java # Servidor receptor (Cifrado Asimétrico Híbrido RSA+AES)
│ ├── Utilidades.java # Métodos auxiliares de I/O, hashing SHA-256 y Sockets
│ └── Mensaje.txt # Archivo de prueba para transmisión
├── build.xml # Script de construcción Ant para NetBeans
├── manifest.mf # Manifiesto Java
└── .gitignore # Reglas de exclusión de archivos temporales
- Java JDK: Versión 8 o superior (Recomendado Java 11 / 17 / 21).
- IDE: Apache NetBeans IDE (o ejecución directa por línea de comandos / Ant).
- Abre Apache NetBeans IDE.
- Selecciona File > Open Project... (o
Ctrl + Shift + O). - Navega hasta la carpeta del proyecto y selecciónala (reconocerá el icono de proyecto Java Ant).
- Presiona Open Project.
Para probar el envío y recepción de archivos, siempre debes ejecutar primero el Receptor (Servidor) y luego el Emisor (Cliente).
- Ejecutar Receptor:
- Haz clic derecho sobre
ReceptorSimetrico.java> Run File (Shift + F6). - El receptor quedará a la espera en los puertos 7000 (Archivo) y 7001 (Llave AES).
- Haz clic derecho sobre
- Ejecutar Emisor:
- Haz clic derecho sobre
EmisorSimetrico.java> Run File (Shift + F6). - Ingresa la ruta del archivo cuando te lo solicite en consola (ejemplo:
src/Mensaje.txt). - El archivo se descifrará y guardará como
recibido_simetrico_Mensaje.txt.
- Haz clic derecho sobre
- Ejecutar Receptor:
- Haz clic derecho sobre
ReceptorAsimetrico.java> Run File (Shift + F6). - Generará las llaves RSA y esperará la conexión en el puerto 6000.
- Haz clic derecho sobre
- Ejecutar Emisor:
- Haz clic derecho sobre
EmisorAsimetrico.java> Run File (Shift + F6). - Recibirá la clave pública RSA, cifrará la clave AES y el archivo, y los transmitirá.
- El archivo se descifrará y guardará como
recibido_asimetrico_Mensaje.txt.
- Haz clic derecho sobre
sequenceDiagram
autonumber
participant E as Emisor (Cliente)
participant R as Receptor (Servidor)
Note over R: Genera par de claves RSA (Pública/Privada)
R->>E: Envia Clave Pública RSA
Note over E: Genera clave secreta AES-256
Note over E: Cifra archivo con AES-GCM
Note over E: Cifra clave AES con Clave Pública RSA
E->>R: Transmite Clave AES Cifrada + IV + Archivo Cifrado
Note over R: Descifra clave AES con Clave Privada RSA
Note over R: Descifra el archivo mediante AES-GCM
Note over R: Compara Hash SHA-256 del archivo
Desarrollado como proyecto práctico de la asignatura Sistemas Distribuidos.
Autor: David Cevallos (@DavidCevallos15)
