
GIE
🔐 ¿Qué es GIE y para qué sirve?
De forma resumida: Un cifrador y descifrador para archivos y carpetas para Windows, linux y macos, escrito en GO usando AES. 💜 GIE es cross-platform, funciona en Windows, Linux y macOS.
Ejemplo: Podra encriptar su archivo en windows y desencriptarlo en linux o viceversa.
En detalle: GIE (Go-based Information Encryptor), es una aplicación de escritorio multiplataforma construida utilizando el framework Wails. GIE está diseñada para el cifrado y descifrado seguro de archivos y directorios, aprovechando primitivas criptográficas robustas implementadas en Go. La aplicación tiene como objetivo proporcionar una interfaz fácil de usar para gestionar datos sensibles.

Versión
GIE v1.2.5
📦 Requisitos
- Go v1.24+
- Wails v2.10+
- Node v22.17+
❓ Características
- Cifra y descifra archivos y carpetas con AES, para cualquier tipo archivo sea.
- GIE sigue una arquitectura cliente-servidor facilitada por el framework Wails.
- Posiblidad de agregar pistas.
- Posibilidad de compartir archivos entre sistemas operativos.
- 3 niveles de protección (Bajo, Normal, Alto).
- Posibilidad de agregar un canal de cifrado para mayor seguridad.
- Ligero y facil de usar.
- Interfaz de usuario intuitiva y amigable.
- Open Source!.
🧑💻 Características tecnicas
Cifra y descifra tus archivos y carpetas con AES, para cualquier archivo sea: jpg, zip+, mp4, mp3, docx, pdf, etc...
GIE sigue una arquitectura cliente-servidor facilitada por el framework Wails. * Frontend (Cliente): Desarrollado con React (Svelte) y TypeScript, responsable de la interfaz de usuario y la interacción. Se comunica con el backend de Go a través de los mecanismos de comunicación entre procesos (IPC) de Wails. * Backend (Servidor): Implementado en Go, maneja toda la lógica central, incluyendo operaciones de archivo, procesos criptográficos e interacciones con el sistema.
GIE emplea un esquema de cifrado híbrido que combina cifrado simétrico (AES CTR) para la confidencialidad de los datos y un Código de Autenticación de Mensajes (HMAC-SHA256) para la integridad y autenticidad de los datos. La derivación de claves se realiza utilizando PBKDF2
Las claves de cifrado y HMAC se derivan de la contraseña del usuario utilizando PBKDF2(Password-Based Key Derivation Function 2) con SHA256 como función pseudoaleatoria. Se utilizan sales separadas para la clave AES y la clave HMAC para prevenir ataques entre protocolos. El número de iteraciones y la longitud de la clave son configurables según el nivel de cifrado elegido (Bajo, Normal, Alto).
La función PBKDF2 se define como:
Donde:
DK
: Clave DerivadaPRF
: Función Pseudoaleatoria (HMAC SHA256 en este caso)Password
: Contraseña proporcionada por el usuarioSalt
: Sal aleatoria (16 bytes)Iterations
: Número de iteraciones (ej., 10,000 para Bajo, 800,000 para Normal, 12,000,000 para Alto)KeyLength
: Longitud deseada de la clave derivada (16 bytes para AES-128, 32 bytes para AES-256)
AES en modo Contador (CTR) se utiliza para cifrar el contenido del archivo. El modo CTR transforma un cifrado por bloques en un cifrado de flujo, permitiendo el cifrado/descifrado paralelo y el acceso directo a cualquier parte del texto cifrado. Se utiliza un Vector de Inicialización (IV) único y generado aleatoriamente de 16 bytes para cada operación de cifrado. El proceso de cifrado en modo CTR se puede representar conceptualmente como:
Donde:
Ci
: i-ésimo bloque de texto cifradoEK
: Función de cifrado AES con clave KNonce
: Un valor único para cada cifrado (parte del IV)Counteri
: Un contador que se incrementa para cada bloquePi
: i-ésimo bloque de texto plano⊕
: Operación XOR a nivel de bits
HMAC-SHA256 se utiliza para garantizar la integridad y autenticidad de los datos cifrados y sus metadatos asociados. El HMAC se calcula sobre todo el archivo cifrado, incluyendo la cabecera de metadatos (longitud de la pista, pista, canal, código de nivel de cifrado, sal AES, sal HMAC, IV CTR) y el texto cifrado. Esto evita la manipulación tanto de los datos como de sus parámetros críticos.
La función HMAC se define como:
Donde:
H
: Función hash (SHA256 en este caso)K
: Clave secreta (clave HMAC derivada)m
: Mensaje (metadatos || texto cifrado)ipad
: Relleno interno (0x36 repetido)opad
: Relleno externo (0x5C repetido)||
: Concatenación
Estructura de Metodo
Campo | Tamaño (Bytes) | Descripción |
---|---|---|
Pista | Variable | Longitud de la pista proporcionada por el usuario para el archivo |
Canal | 2 | uint16, un canal definido por el usuario para agrupar archivos |
Código Nivel Cifrado | 1 | byte, código que representa la fuerza del cifrado (0=Bajo, 1=Normal, 2=Alto) |
Sal Clave AES | 16 | Sal aleatoria para la derivación de la clave AES |
Sal Clave HMAC | 16 | Sal aleatoria para la derivación de la clave HMAC |
IV CTR | 16 | Vector de Inicialización aleatorio para AES-CTR |
Texto Cifrado | Variable | Contenido cifrado del archivo original |
Etiqueta HMAC | 32 | HMAC-SHA256 de todos los datos precedentes (metadatos + texto cifrado) |
GIE proporciona una solución robusta y segura para el cifrado de archivos y directorios, construida sobre tecnologías multiplataforma modernas. Su diseño prioriza tanto la seguridad a través de prácticas criptográficas sólidas como la usabilidad a través de una interfaz gráfica responsiva


Si desea saber más a profundidad, puede consultar el Repositorio de GitHub para obtener detalles adicionales y ejemplos de uso. De igual forma puede consultar con DeepWiki
💻 Instalación
Ejecuta los comandos según tu caso (Win o Linux)
Clona o descarga este repositorio
#BATCH1git@github.com:aiskoa/GIE.git 2
Cambia de directorio
#BATCH1cd GIE 2
Instala las dependencias
#BATCH1npm install 2
Y ejecuta
wails build
para compilar la aplicación
Asegurate de tener instalado la ultima versión de Wails, Node y Go en tu equipo.
ATENCIÓN!!
Si solo deseas usarla, puedes descargarla desde github o desde el sitio oficial según tu sistema.
Desde Sitio Oficial: ⬇ Descargar GIE
Requisitos Minimos:
- Windows 10/11 / Debian / macOS Ventura o posterior
- 1 GB de espacio en disco
- 2 GB de memoria RAM
🔒 ¿Cómo Cifrar?
De momento solo esta disponible mediante la GUI.
Para Cifrar una carpeta o archivo
- Arrastre ó busque el archivo al programa (Interfaz Gráfica)
- Introduce una contraseña (Importante recordarla)
- Escriba una pista parar la contraseña (Opcional)
- Elija el canal de cifrado (Opcional)
- Elija el nivel de cifrado (Opcional)
- Clic en "Encrypt"
- Esto Convierte el archivo a (.gie)
Una vez el archivo este cifrado en .gie este no podra ser abierto, leido o modificado. Tenga en cuenta que GIE funciona para cualquier tipo de archivo, incluso para archivos grandes.
👀 OJO SI ENCRIPTA POR ERROR ALGÚN ARCHIVO O FUNCIONALIDAD DE GIE LA UNICA FORMA DE RESTAURARLO ES REINSTALANDO EL PROGRAMA!
⚠️⚠️ IMPORTATE ⚠️⚠️
- La unica forma de "recuperar" el achivo nuevamente es mediante el programa GIE desencriptandolo.
- Si deseas compartir el archivo con tu colega, amigo o equipo de trabajo, tendrás que proporcionarle el .gie, la contraseña utilizada y canal (si aplica).
- SI OLVIDA O PIERDE LA CONTRASEÑA, NO PODRÁ RECUPERAR EL ARCHIVO SI NO SE ESCRIBIÓ UNA PISTA.
- SI PUSO UN CANAL TAMBIÉN DEBERÁ RECORDARLO DE LO CONTRARIO NO PODRÁ RECUPERAR EL ARCHIVO.

🔓 ¿Cómo Descifrar?
De momento solo esta disponible mediante la GUI.
Para Desencriptar un archivo
- Arrastre ó busque el archivo (.gie) al programa (Interfaz Gráfica)
- Introduce la contraseña (Obligatorio)
- Elija el canal de cifrado (Opcional)
- Clic en "Decrypt"
- Esto Convierte el archivo a su estado natural
Tenga en cuenta que solo funcionará para archivos .gie cifrados. Solo funciona con archivos encriptados por GIE (Go-based Information Encryptor) actual v1.2.5 o superior.
👀 OJO NO FUNCIONARÁ CON ARCHIVOS .GIE VERSIÓN PYTHON, SOLO CON LA VERSIÓN ESCRITA EN GO!!
- La unica forma de "recuperar" el achivo nuevamente es mediante el programa GIE desencriptandolo.
- Si deseas compartir el archivo con tu colega, amigo o equipo de trabajo, tendrás que proporcionarle el .gie, la contraseña utilizada y canal (si aplica).
- SI OLVIDA O PIERDE LA CONTRASEÑA, NO PODRÁ RECUPERAR EL ARCHIVO SI NO SE ESCRIBIÓ UNA PISTA.
- SI PUSO UN CANAL TAMBIÉN DEBERÁ RECORDARLO DE LO CONTRARIO NO PODRÁ RECUPERAR EL ARCHIVO.

Función de cifrado a directorios
#GO1func (a *App) EncryptDirectory(dirPath string, password string, hint string, encryptionLevel string, channel int) string { 2 if password == "" { 3 return "Encryption failed: password cannot be empty." 4 } 5 6 // Check if path is actually a directory 7 isDir, err := a.IsDirectory(dirPath) 8 if err != nil { 9 return fmt.Sprintf("Error checking if path is directory: %v", err) 10 } 11 if !isDir { 12 return "Selected path is not a directory." 13 } 14 15 // Get all files in directory 16 files, err := a.GetFilesInDirectory(dirPath) 17 if err != nil { 18 return fmt.Sprintf("Error getting files from directory: %v", err) 19 } 20 21 if len(files) == 0 { 22 return "No files found in directory to encrypt." 23 } 24 25 // Track results 26 var results []string 27 successCount := 0 28 29 for i, file := range files { 30 fmt.Printf("Encrypting file %d/%d: %s\n", i+1, len(files), file) 31 32 result := a.EncryptFile(file, password, hint, encryptionLevel, channel) 33 if result == "success" { 34 successCount++ 35 results = append(results, fmt.Sprintf("✓ %s", filepath.Base(file))) 36 } else { 37 results = append(results, fmt.Sprintf("✗ %s: %s", filepath.Base(file), result)) 38 } 39 } 40 41 // Return summary 42 summary := fmt.Sprintf("Directory encryption completed: %d/%d files encrypted successfully", successCount, len(files)) 43 if successCount < len(files) { 44 summary += "\n\nDetailed results:\n" + strings.Join(results, "\n") 45 } 46 47 return summary 48} 49
Función de desifrado a directorios
#GO1func (a *App) DecryptDirectory(dirPath string, password string, channel int) string { 2 if password == "" { 3 return "Decryption failed: password cannot be empty." 4 } 5 6 // Check if path is actually a directory 7 isDir, err := a.IsDirectory(dirPath) 8 if err != nil { 9 return fmt.Sprintf("Error checking if path is directory: %v", err) 10 } 11 if !isDir { 12 return "Selected path is not a directory." 13 } 14 15 // Get all .gie files in directory 16 var encryptedFiles []string 17 18 err = filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { 19 if err != nil { 20 return err 21 } 22 23 // Only add .gie files 24 if !info.IsDir() && strings.HasSuffix(path, ".gie") { 25 encryptedFiles = append(encryptedFiles, path) 26 } 27 return nil 28 }) 29 30 if err != nil { 31 return fmt.Sprintf("Error scanning directory: %v", err) 32 } 33 34 if len(encryptedFiles) == 0 { 35 return "No encrypted files (.gie) found in directory to decrypt." 36 } 37 38 // Track results 39 var results []string 40 successCount := 0 41 42 for i, file := range encryptedFiles { 43 fmt.Printf("Decrypting file %d/%d: %s\n", i+1, len(encryptedFiles), file) 44 45 result := a.DecryptFile(file, password, false, channel) 46 if result == "success" { 47 successCount++ 48 results = append(results, fmt.Sprintf("✓ %s", filepath.Base(file))) 49 } else { 50 results = append(results, fmt.Sprintf("✗ %s: %s", filepath.Base(file), result)) 51 } 52 } 53 54 // Return summary 55 summary := fmt.Sprintf("Directory decryption completed: %d/%d files decrypted successfully", successCount, len(encryptedFiles)) 56 if successCount < len(encryptedFiles) { 57 summary += "\n\nDetailed results:\n" + strings.Join(results, "\n") 58 } 59 60 return summary 61} 62
📖 Documentación
Consulte la Documentación y Guias de uso
📝 Changelog
Consulte el Historial de Cambios
✍️ Lista de Tareas
- Pista de la contraseña
- Cambio de tema
- Soporte en Android
- Soporte en iOS
- Posibilidad de uso desde terminal sin GUI (API o MCP)
- Comprobación de contraseña
- AES reforzado
- Menú de interfaz de usuario
- Encriptación de carpetas y directorios completos
🤝 Contribuyendo
¡Las contribuciones, los problemas y las solicitudes de características son bienvenidos! Siéntete libre de consultar la página de problemas.
❤️ Muestra tu apoyo
¡Da una ⭐️ si este proyecto te ayudó!