GSEA (Secure and Efficient File Management Utility) – Proyecto 3 de Sistemas Operativos.
Utilidad de línea de comandos para compresión, descompresión, encriptación y desencriptación de archivos con soporte para procesamiento concurrente y journaling automático.
- Características
- Requisitos
- Compilación
- Uso
- Algoritmos Disponibles
- Ejemplos
- Operaciones con Carpetas
- Sistema de Journaling
- Casos de Prueba
- Compresión/Descompresión: RLE, LZW, Huffman
- Encriptación/Desencriptación: Vigenere, AES-128 (CBC)
- Operaciones combinadas: Comprimir + Encriptar en una sola ejecución
- Procesamiento concurrente: Usa thread pool para carpetas con múltiples archivos
- Journaling automático: Registro detallado de todas las operaciones
- Soporte para carpetas: Procesamiento recursivo de directorios completos
- Validación de claves: Verifica complejidad y seguridad de contraseñas
- Sistema Operativo: Linux
- Compilador: g++ con soporte para C++11 o superior
- Bibliotecas: Estándar de C++ (no requiere dependencias externas)
Para compilar el proyecto, usa el siguiente comando:
makeTambién puedes usar:
make all- Compila el proyectomake clean- Limpia los archivos compiladosmake rebuild- Limpia y recompila todo
El ejecutable se generará en bin/FileUtility.
web/app.py expone la utilidad por HTTP: subir un archivo, elegir operación y
algoritmos, y descargar el resultado. Es solo una envoltura — la compresión y el
cifrado los sigue haciendo el mismo binario de bin/FileUtility.
Para desplegarla gratis: Render → New + → Blueprint → este repositorio.
render.yaml y Dockerfile.web la configuran; no hay variables que definir.
Para levantarla en local:
docker build -f Dockerfile.web -t gsea-web . && docker run --rm -p 8000:8000 gsea-web- Máximo 5 MB por archivo y 30 s por operación.
- Los argumentos se pasan como lista, nunca por shell, y operación y algoritmos se validan contra una lista cerrada.
- Cada petición usa un directorio temporal propio que se borra al responder, journal incluido. Ni el archivo ni la clave se guardan.
- La CLI pregunta de forma interactiva antes de cambiar de algoritmo o de
aceptar una clave débil; la envoltura responde
na todo, de modo que respeta el algoritmo elegido y rechaza las claves débiles en vez de continuar. - La CLI termina con código 0 aunque falle, así que los errores se detectan leyendo su salida.
./bin/FileUtility [operaciones] [opciones]-c: Comprimir-d: Descomprimir-e: Encriptar-u: Desencriptar (decrypt)
Nota: Puedes combinar operaciones, por ejemplo: -ce (comprimir y encriptar), -ud (desencriptar y descomprimir)
-i <archivo>: Archivo de entrada (obligatorio)-o <archivo>: Archivo de salida (obligatorio)--comp-alg <algoritmo>: Algoritmo de compresión (RLE, LZW, Huff)--enc-alg <algoritmo>: Algoritmo de encriptación (VIG, AES128)-k <clave>: Clave para encriptación/desencriptación
- RLE (Run-Length Encoding): Ideal para archivos con datos repetitivos
- LZW (Lempel-Ziv-Welch): Compresión basada en diccionario, buena relación velocidad/tamaño
- Huff/Huffman: Compresión basada en frecuencia de símbolos, excelente para texto
- VIG/Vigenere: Cifrado por sustitución polialfabética, requiere clave alfanumérica
- AES/AES128: AES-128 en modo CBC, requiere clave de mínimo 16 caracteres
El programa incluye un sistema de sugerencias inteligente que recomienda el mejor algoritmo según el tipo de archivo:
Extensiones: .txt, .log, .md, .csv
Algoritmo recomendado: Huffman
- Mejor compresión para texto plano y estructurado
- Eficiencia: 60-70% de reducción típica
Extensiones: .bmp, .pgm, .ppm
Algoritmos recomendados: Huffman o LZW
- Huffman: Ligeramente mejor en general
- LZW: Excelente para imágenes con patrones
- Evitar RLE a menos que sean imágenes muy simples (logos, iconos)
- Eficiencia: 50-70% de reducción
Extensiones: .wav, .aiff, .au
Algoritmos recomendados: Huffman o LZW
- Huffman: Mejor rendimiento general
- LZW: Alternativa válida
- Evitar RLE
- Eficiencia: 15-35% de reducción
Extensiones: .avi, .mov
Algoritmo recomendado: Huffman
- Nota: Videos modernos (MP4, MKV) ya están comprimidos y no se benefician de compresión adicional
Extensiones: .bin, .exe, archivos sin extensión (ejecutables Linux)
Algoritmo recomendado: LZW
- Mejor para código binario y estructuras de datos complejas
- Eficiencia: 40-60% de reducción
Cuando comprimes un archivo individual con un algoritmo subóptimo, el programa te preguntará si deseas cambiar:
$ ./bin/FileUtility -c -i documento.txt -o output.dat --comp-alg LZW
SUGERENCIA para documento.txt:
Este es un archivo de texto (.txt).
El algoritmo Huffman suele ofrecer mejor compresión.
Algoritmo actual: LZW
¿Desea cambiar a Huffman? (s/n):Para imágenes y audio con RLE, se ofrecen múltiples opciones:
$ ./bin/FileUtility -c -i imagen.bmp -o output.dat --comp-alg RLE
SUGERENCIA para imagen.bmp:
Este es un imagen sin comprimir (.bmp).
RLE no es óptimo para este tipo de archivo.
Algoritmo actual: RLE
¿Desea cambiar el algoritmo?
1) Huffman
2) LZW
3) Continuar con RLE
Seleccione (1/2/3):Nota: Las sugerencias solo aparecen para archivos individuales, no cuando se procesan carpetas completas.
./bin/FileUtility -c -i archivo.txt -o archivo_comprimido.dat --comp-alg RLE./bin/FileUtility -e -i archivo.txt -o archivo_encriptado.dat --enc-alg VIG -k "Encrypt3*PassK3y@"./bin/FileUtility -ce -i archivo.txt -o archivo_protegido.dat --comp-alg LZW --enc-alg AES128 -k "Encrypt3*PassK3y@"./bin/FileUtility -d -i archivo_comprimido.dat -o archivo_descomprimido.txt --comp-alg RLE./bin/FileUtility -u -i archivo_encriptado.dat -o archivo_desencriptado.txt --enc-alg VIG -k "Encrypt3*PassK3y@"./bin/FileUtility -ud -i archivo_protegido.dat -o archivo_original.txt --comp-alg LZW --enc-alg AES128 -k "Encrypt3*PassK3y@"El programa soporta procesamiento de carpetas completas de forma recursiva. Utiliza un thread pool para procesar múltiples archivos en paralelo, mejorando significativamente el rendimiento.
Ejemplo:
./bin/FileUtility -ce -i tests -o testsOut --comp-alg LZW --enc-alg AES128 -k "Encrypt3*PassK3y@"Esto procesará todos los archivos dentro de tests/ y sus subdirectorios, manteniendo la estructura de carpetas en testsOut/.
El programa implementa un sistema de journaling que registra todas las operaciones realizadas, creando logs detallados para trazabilidad y auditoría.
- Crea un archivo
.logpor cada operación - Registra: tipo de operación, tamaños, timestamps, cada paso del proceso
- Formato:
journal/journal_[OPERACION]_[ARCHIVO]_[TIMESTAMP].log
- Crea un único archivo
.logpara toda la carpeta - Registra cada archivo procesado dentro de la carpeta
- Incluye separadores visuales entre archivos
- Formato:
journal/journal_[OPERACION]_[CARPETA]_[TIMESTAMP].log
Al ejecutar:
./bin/FileUtility -c -i tests/Test1C.txt -o tests/Test1C_compressed.txt --comp-alg RLESe genera: journal/journal_COMPRESS_Test1C.txt_20251117_143025.log
Contenido del archivo journal:
========================================
JOURNAL DE OPERACIÓN - ARCHIVO
========================================
Tipo: COMPRESS
Archivo: Test1C.txt
Origen: tests/Test1C.txt
Destino: tests/Test1C_compressed.txt
Tamaño: 126.08 KB
Timestamp inicio: 2025-11-17 14:30:25
========================================
[14:30:25] Inicio de proceso...
[14:30:25] Comprimiendo con RLE...
[14:30:26] Compresión completada
[14:30:26] Archivo completado
[14:30:26] Tamaño final: 85.2 KB
[14:30:26] Tiempo procesamiento: 12 ms
========================================
[14:30:26] Proceso completado: EXITOSO
Tiempo total: 12 ms
========================================
- COMPRESS: Compresión de archivos
- DECOMPRESS: Descompresión de archivos
- ENCRYPT: Encriptación de archivos
- DECRYPT: Desencriptación de archivos
- Combinaciones: COMPRESS_ENCRYPT, DECOMPRESS_DECRYPT, etc.
Todos los journals se guardan en journal/ (ignorado por git según .gitignore)
- Trazabilidad: Registro completo de todas las operaciones
- Debugging: Facilita la identificación de problemas
- Auditoría: Permite revisar qué se procesó y cuándo
- Thread-safe: Funciona correctamente en procesamiento concurrente
- Educativo: Simula sistemas de journaling reales en sistemas operativos
- Las claves de encriptación deben ser seguras (mínimo 8 caracteres, se recomienda 16+ para AES)
- El programa valida la complejidad de las claves antes de procesar
- Para operaciones combinadas, el orden de descompresión/desencriptación debe invertirse
- Los journals se generan automáticamente en
journal/y no se incluyen en git - El procesamiento concurrente se adapta automáticamente al número de núcleos disponibles