
Compresión de copias de seguridad con cifrado autenticado AES-256 y encapsulamiento de claves post-cuántico.
Compresión total. No confíes en nada. Cifra siempre.
Compresión de respaldos con selección adaptativa de códec según hardware, cifrado autenticado AES-256, encapsulación de clave post-cuántica y respaldo de disco completo. C11 puro, cero dependencias, ~13.000 líneas. Compila y ejecuta en x86_64, aarch64, armhf, ppc64le, s390x y riscv64.
--vv o --lzhp.--pq usa un KEM híbrido ML-KEM-768 + X25519 (mismo enfoque que Signal e iMessage). Protege contra ataques cuánticos de "cosechar ahora, descifrar después".-t 0 detecta núcleos automáticamente.zupt disk backup clona discos completos o particiones en un solo comando. Detección de bloques dispersos omite regiones de ceros, barra de progreso en tiempo real, todos los modos de cifrado compatibles. Restaura con verificación byte por byte mediante sumas de verificación XXH64 por bloque.zupt compress -p contraseña respaldo.zupt ~/datos/ — AES-256 + HMAC-SHA256, nombres de archivo ocultos.curl -fsSL https://short.securityops.co/zupt | bash
### Construir e Instalar```
git clone https://github.com/cristiancmoises/zupt.git && \
cd zupt && \
make && \
sudo make install
La iniciativa openSUSE for Innovators ofrece Zupt dentro de la solución Diraq.
Para 16.0:```bash zypper addrepo https://download.opensuse.org/repositories/home:cabelo:innovators/16.0/home:cabelo:innovators.repo zypper refresh && zypper install zupt
### Uso básico```bash
# Compress (auto-selects best codec for your hardware)
zupt compress backup.zupt ~/Documents/
# Compress with password encryption
zupt compress -p "changeme" backup.zupt ~/Documents/
# Extract
zupt extract -o ~/restored/ backup.zupt
# Post-quantum encrypted backup
zupt keygen -o mykey.key
zupt keygen --pub -o pub.key -k mykey.key
zupt compress --pq pub.key backup.zupt ~/Documents/
zupt extract --pq mykey.key -o ~/restored/ backup.zupt
Zupt v2.0.0 selecciona automáticamente el mejor códec de compresión según tu hardware. No se necesitan banderas — simplemente ejecuta zupt compress y elige la opción más rápida disponible.
La descompresión es universal. Un archivo creado con VaptVupt en x86_64 se extrae en aarch64 (usando descompresión NEON o escalar), y viceversa. El ID del códec se almacena por bloque — el decodificador envía automáticamente a la ruta correcta.
Anula con --vv (forzar VaptVupt) o --lzhp (forzar Zupt-LZHP) cuando sepas lo que quieres.
VaptVupt es el códec de compresión de alto rendimiento de Zupt. Combina coincidencia de diccionario LZ77 con codificación entrópica tANS (Sistemas Numéricos Asimétricos basados en tablas) y descompresión acelerada por SIMD.
Encoder: Hash-chain LZ77 → 5-byte multiply-shift hash, rep-match (3 recent offsets), lazy-2 parsing, AVX2 match extension (32 bytes/cycle) Entropy: Canonical Huffman | tANS | 4-way interleaved ANS | order-1 context model Decoder: AVX2 inline SIMD copies, tiered by offset (32/16/8/overlap), safe-zone fast path NEON SIMD on aarch64, scalar fallback on all architectures
### Tres modos
| Modo | CLI | Profundidad de cadena | Entropía | Caso de uso |
|------|-----|-----------------------|----------|-------------|
| Ultra-rápido | `-l 1` a `-l 3` | 4 | Ninguna | Prioridad de velocidad, transmisión |
| Balanceado | `-l 4` a `-l 7` (predeterminado) | 48 | ANS de 4 vías | Datos de respaldo generales |
| Extremo | `-l 8` a `-l 9` | 256 | ANS de contexto de orden 1 | Compresión máxima |
### Resultados de referencia
Medido en el host de compilación con un corpus mixto de 1.9 MB (texto, JSON, CSV, binario aleatorio). Cada códec se ejecutó una vez, tiempo de pared vía `clock_gettime(CLOCK_MONOTONIC)`. Reproducir con `zupt bench --compare`.
| Códec | Comprimir | Descomprimir | Relación |
|-------|-----------|--------------|----------|
| **VaptVupt UF** | 63 MB/s | **298 MB/s** | 2.7:1 |
| **VaptVupt BAL** (predeterminado) | 18 MB/s | **268 MB/s** | 3.5:1 |
| **VaptVupt EXT** | 12 MB/s | **311 MB/s** | 3.5:1 |
| Zupt-LZHP (v1.x predeterminado) | 8 MB/s | 137 MB/s | 4.0:1 |
| Zupt-LZ | 28 MB/s | 348 MB/s | 3.3:1 |
| gzip -6 | 26 MB/s | 99 MB/s | 4.0:1 |
VaptVupt BAL descomprime **2× más rápido** que el anterior Zupt-LZHP predeterminado y **2.7× más rápido** que gzip, logrando relaciones de compresión competitivas. Ejecute `zupt bench --compare` en su hardware con lz4/zstd instalado para una comparación completa.
### ¿Por qué VaptVupt?
Ventajas arquitectónicas de VaptVupt sobre los códecs tradicionales basados en Huffman:
- **Entropía tANS** — codificación asintóticamente óptima con decodificación de una sola instrucción por símbolo (vs el recorrido de árbol de múltiples pasos de Huffman)
- **ANS entrelazado de 4 vías** — decodifica 4 símbolos por ciclo de recarga de flujo de bits, reduciendo la sobrecarga de recarga en 4×
- **Decodificación SIMD AVX2/NEON** — copias en línea de 32 bytes con manejo de offset escalonado (sin despacho de punteros a función). Retrocede a escalar en hardware no compatible.
- **Rep-match** — verifica 3 offsets recientes antes de la sonda hash (O(1) vs O(profundidad_cadena)), acierta ~30 % de las coincidencias. Ahorra 10–15 bits por offset repetido.
- **Modelo de contexto de orden 1** — captura correlaciones de pares de bytes en datos estructurados (JSON, CSV, logs)
- **Ventana adaptativa** — comprime de prueba con wlog=16 vs wlog=20, selecciona una ventana más grande solo si la mejora es ≥3 %
- **~4200 líneas** de C11 puro — auditable, portátil, sin dependencias externas
---
## Cifrado Post-Cuántico
El modo `--pq` usa encapsulación de clave híbrida ML-KEM-768 + X25519 según NIST FIPS 203.```
Public key → ML-KEM-768 Encaps + X25519 ECDH → hybrid shared secret
→ SHA3-512(ss ‖ transcript) → enc_key[32] + mac_key[32]
→ AES-256-CTR + HMAC-SHA256 per block
Modelo de seguridad: Seguro si YA SEA ML-KEM-768 (post-cuántica) O X25519 (clásica) es seguro.
El modo de contraseña (-p) NO es seguro contra la computación cuántica. Use --pq para protección a largo plazo.
Clona discos completos, particiones o imágenes raw con compresión y cifrado en un solo comando.
sudo zupt disk backup backup.zupt /dev/sda1
zupt keygen -o mykey.key zupt keygen --pub -o pub.key -k mykey.key sudo zupt disk backup --pq pub.key backup.zupt /dev/nvme0n1p2
sudo zupt disk backup -p "changeme" backup.zupt /dev/sda1
sudo zupt disk backup -l 9 backup.zupt /dev/sda1
sudo zupt disk restore backup.zupt /dev/sda1 sudo zupt disk restore --pq mykey.key backup.zupt /dev/sda1
### Cómo funciona```
Source device → Read 4MB blocks → Sparse detection → Compress → Encrypt → Write .zupt
│ │ │
│ │ └─ AES-256-CTR + HMAC-SHA256
│ └─ VaptVupt/LZHP (auto-selected)
└─ Zero blocks stored as STORE (near-zero overhead)
Zupt lee el dispositivo fuente secuencialmente en fragmentos de 4 MB. Cada bloque se verifica para contenido de solo ceros (la detección de dispersión utiliza comparación de 8 bytes de ancho). Los bloques de ceros se almacenan con el códec STORE — efectivamente solo el encabezado del bloque sin carga útil, ahorrando tanto tiempo de CPU de compresión como espacio en el archivo. Los bloques no cero se comprimen con el códec seleccionado y opcionalmente se cifran. Los checksums XXH64 por bloque aseguran integridad byte por byte en la restauración.
Jerarquía de cifrado (más fuerte → más rápido):
Niveles de compresión para discos:
Orientación operativa:
fsfreeze -f /mnt/data && zupt disk backup ... && fsfreeze -u /mnt/data..img, .raw) no.zupt test archive.zupt — revisa el checksum XXH64 de cada bloque sin extraer.--pq para resistir futuros ataques cuánticos. Genere un par de claves, almacene la clave privada fuera de línea, distribuya la clave pública.Zupt se compila y ejecuta en todas las arquitecturas principales. El Makefile detecta automáticamente la plataforma y habilita las mejores características disponibles.
Compilar para empaquetado (PIE, banderas de endurecimiento):```bash make CFLAGS="-Wall -Wextra -O2 -std=c11 -fPIE -Iinclude -Isrc" LDFLAGS="-pie -Wl,-z,relro,-z,now" make install DESTDIR=/buildroot
---
## Comparación de Características
| Característica | Zupt v2.1 | gzip | zstd | 7-Zip |
|---------|-----------|------|------|-------|
| Códec predeterminado | VaptVupt/LZHP (automático) | DEFLATE | FSE+Huffman | LZMA2 |
| Copia de seguridad de disco completo | **`zupt disk`** | — | — | — |
| Cifrado post-cuántico | **ML-KEM-768** | — | — | — |
| Cifrado por contraseña | AES-256 + HMAC | — | — | AES-256 |
| Aceleración hardware AES-NI | **Verificado con Jasmin** | — | — | — |
| Integridad por bloque | XXH64 + HMAC | CRC32 | XXH64 | CRC32 |
| Compresión multihilo | ✓ | — (pigz) | ✓ | ✓ |
| Descompresión multihilo | **✓** | — | ✓ | ✓ |
| Verificación formal | **Jasmin CT + ACSL** | — | — | — |
| Protección de clave con mlock() | ✓ | — | — | — |
| Harness de fuzzing AFL++ | ✓ | — | ✓ | — |
| Multiarquitectura | **6 arquitecturas** | ✓ | ✓ | ✓ |
| Cero dependencias | ✓ | ✓ | — | — |
| Código base | ~12K líneas | ~10K | ~75K | ~100K+ |
| Licencia | **AGPL-3.0** (comercial disponible) | GPL | BSD | LGPL |
---
## Seguridad```
Password mode: Password → PBKDF2-SHA256 (600K iter) → enc_key + mac_key
PQ hybrid mode: Public key → ML-KEM-768 Encaps + X25519 ECDH → enc_key + mac_key
Per-block: AES-256-CTR(enc_key, nonce ⊕ seq) + HMAC-SHA256(mac_key)
Key protection: mlock() prevents swap, buffer canaries detect overflow
Timing: Always-decrypt mitigation (no timing oracle on MAC failure)
AES dispatch: AVX+AES-NI check with OSXSAVE/XCR0 (no SIGILL on any CPU)
Verification: 5 Jasmin CT proofs, 19 ACSL contracts, 13 NIST/RFC test vectors
Consulte SECURITY.md para el modelo de amenazas. Consulte AUDIT.md para la lista de verificación de auditoría.
zupt compress [OPTIONS] <output.zupt> <files/dirs...> zupt extract [OPTIONS] <archive.zupt> zupt list [OPTIONS] <archive.zupt> zupt test [OPTIONS] <archive.zupt> zupt disk backup [OPTIONS] <output.zupt> <device_or_file> zupt disk restore [OPTIONS] <archive.zupt> zupt bench [--compare] <files/dirs...> zupt keygen [-o file] [--pub] [-k privkey] zupt version zupt help
| Option | Descripción |
|--------|-------------|
| `-l <1-9>` | Nivel de compresión (predeterminado: 7) |
| `-t <N>` | Número de hilos (0=automático, 1=individual, 2–64) |
| `-p [PW]` | Cifrado de contraseña (PBKDF2 → AES-256) |
| `--pq <keyfile>` | Cifrado híbrido post-cuántico |
| `-o <DIR>` | Directorio de salida (extraer) |
| `-s` | Almacenar sin compresión |
| `-f` | Códec LZ rápido (Zupt-LZ) |
| `--vv` | Forzar códec VaptVupt |
| `--lzhp` | Forzar códec Zupt-LZHP |
| `-v` | Verboso |
| `--solid` | Modo sólido (contexto LZ entre archivos) |
| `--compare` | Benchmark de comparación de códecs |
---
## Compilación```bash
make # Auto-detects arch, Jasmin, AVX2
make V=1 # Verbose build output
make test-all # 77 tests: regression + NIST + VV + MT + PQ + disk
make test-vv # VaptVupt codec unit tests only
make test-asan # AddressSanitizer + UBSan build
make fuzz-build # AFL++ fuzzing harnesses
make install # Install binary + man page
make help # Show all targets + detected capabilities
build.bat # Windows (MSVC)
zupt bench ~/Documents/ # Per-level benchmark (levels 1-9) zupt bench --compare # Cross-codec comparison (auto-generates corpus) zupt bench --compare ~/Documents/ # Compare codecs on your own data
---
## Referencia de codecs
| ID | Nombre | Algoritmo | Predeterminado en | Anulación |
|----|--------|-----------|-------------------|-----------|
| `0x0010` | **VaptVupt** | LZ77 + tANS + AVX2/NEON SIMD | x86_64 (AVX2), aarch64 (NEON) | `--vv` |
| `0x000A` | **Zupt-LZHP** | LZ77 + Huffman + predicción de bytes | armhf, ppc64le, s390x, riscv64 | `--lzhp` |
| `0x0009` | Zupt-LZH | LZ77 + Huffman | — | — |
| `0x0008` | Zupt-LZ | LZ77 rápido, ventana de 64KB | — | `-f` |
| `0x0000` | Store | Sin compresión | — | `-s` |
Todos los codecs son compatibles hacia adelante: los archivos creados con cualquier codec pueden ser leídos por cualquier versión de Zupt que incluya ese codec, en cualquier arquitectura. Los archivos VaptVupt requieren Zupt v2.0+.
---
## Historial de versiones
| Versión | Descripción |
|---------|-------------|
| v0.1–v0.6 | Compresión LZ77, cifrado AES-256, multiproceso |
| v0.7 | Cifrado híbrido postcuántico (ML-KEM-768 + X25519) |
| v1.0 | Versión estable — formato congelado v1.4, auditoría de seguridad |
| v1.1–v1.4 | Corrección X25519, vectores NIST, detección CPUID, archivos fuente Jasmin corregidos |
| v1.5 | Ensamblado CT de Jasmin vinculado (verificación MAC + selección activa de ML-KEM) |
| v1.5.5 | Instalación de página man, V=1 verbose, LDFLAGS/PIE, rpmlint, Makefile multiarq. |
| v2.0 | Codec VaptVupt 1.1.0, detección automática de hardware, los 5 Jasmin cableados, corrección AVX SIGILL, correcciones copy_match/litlen, ACSL, mlock, fuzzing, canarios, pipeline AES-NI, descompresión MT, multiarquitectura (6 arq.), indicador --lzhp |
| v2.1.0 | VaptVupt 1.4.0: arrastre de diccionario entre bloques, captación previa de contexto de descompresión, ventana adaptativa más rápida (codificación 2.6×), API de integración |
| v2.1.1 | Corrección de compilación para Termux/Android, protección de seguridad de arquitectura, corrección UB de Keccak ROL64, cero violaciones de UBSan |
| v2.1.2 | Copia de seguridad/restauración de disco completo (`zupt disk`), detección de archivos dispersos, todos los modos de cifrado, barra de progreso |
| v2.1.3 | Corrección de restauración de disco (E/S sin formato POSIX + O_SYNC para dispositivos de bloque, bloque de descompresión compartido), corrección de compilación de Termux (detección de arquitectura CC -dumpmachine), 77 pruebas |
| **v2.1.3** | **Corrección de codificación de predicción LZHP (corrupción de datos en datos estructurados), encabezado de cifrado compartido, indicador SOLID eliminado de disco, 78 pruebas** |
| **v2.1.4** | **CodeQL: 4 correcciones de seguridad — condiciones de carrera TOCTOU eliminadas (fstat sobre fd), limpieza escalar X25519 mediante volátil, 78 pruebas** |
| **v2.1.5** | **Deduplicación a nivel de bloque (`--dedup`), índice de huella digital XXH64, tipo de bloque DEDUP_REF, 81 pruebas** |
| **v2.1.6** | **Comando de metadatos de archivo `zupt info`, advertencias de fortaleza de contraseña, VaptVupt 2.40.0 (format_v2), aplicación de escritorio GUI, 97 pruebas** |
| **v2.1.7** | **Cambio de licencia MIT → AGPL-3.0-or-later. VaptVupt sigue siendo GPL-3.0-or-later (mantenido sincronizado con el repositorio ascendente); VaptVupt actualizado de 2.40.0 → 2.46.1. Cobertura completa de SPDX, auditoría de seguridad actualizada, canal de licencias comerciales a través de [email protected]** |
Consulte [CHANGELOG.md](https://github.com/cristiancmoises/zupt/blob/HEAD/CHANGELOG.md) para ver los cambios detallados por versión.
---
## Licencia
**Zupt está bajo la licencia GNU Affero General Public License v3.0 o posterior (AGPL-3.0-or-later).**
El texto completo de la licencia está en [LICENSE](https://github.com/cristiancmoises/zupt/blob/HEAD/LICENSE), precedido por un preámbulo formal que explica la justificación. En resumen:
- **Puede usar Zupt libremente** — para copias de seguridad personales, en su negocio, en sus servidores, en entornos aislados, en cualquier lugar. La AGPL no impone obligaciones sustanciales por el simple uso.
- **Si modifica Zupt y ejecuta la versión modificada como un servicio de red** (un producto de copia de seguridad como servicio, un backend de archivo en la nube, etc.), debe poner a disposición de los usuarios de ese servicio el código fuente de sus modificaciones. Esta es la "cláusula SaaS" de la AGPL y es la única razón por la que Zupt es AGPL en lugar de GPL o MIT.
- **Si redistribuye Zupt** (modificado o no), la AGPL lo acompaña.
El **códec de compresión VaptVupt** integrado (`src/vv_*.c`, `include/vaptvupt*.h`, `include/vv_*.h`) tiene licencia por separado bajo **GPL-3.0-or-later** porque VaptVupt se puede usar de forma independiente como un códec de compresión independiente (repositorio ascendente canónico: [github.com/cristiancmoises/vaptvupt](https://github.com/cristiancmoises/vaptvupt)). GPL-3.0-or-later es compatible bidireccionalmente con AGPL-3.0-or-later a través de la cláusula de compatibilidad de la sección 13 de AGPL, por lo que el binario combinado de Zupt sigue siendo AGPL-3.0 válido. Consulte [LICENSE-VAPTVUPT](https://github.com/cristiancmoises/zupt/blob/HEAD/LICENSE-VAPTVUPT) para obtener más detalles.
### Licencia comercial
Si el uso que pretende no es compatible con AGPL, por ejemplo:
- Incrustar Zupt o VaptVupt en un producto cerrado, dispositivo o firmware de código cerrado
- Operar Zupt como backend alojado/SaaS sin publicar sus modificaciones
- Redistribuir Zupt como parte de un producto comercial propietario
- Requerir garantía, indemnización o términos por escrito
**Hay disponible una licencia comercial.** Contacto: **[email protected]**
El autor conserva la propiedad total de los derechos de autor de todo el código fuente original de Zupt y VaptVupt y, por lo tanto, puede otorgar términos de licencia alternativos.
Vulnerabilidades de seguridad: consulte [SECURITY.md](https://github.com/cristiancmoises/zupt/blob/HEAD/SECURITY.md).
## Apoye el proyecto
[](DONATIONS.md)
---
© 2026 Cristian Cezar Moisés — [github.com/cristiancmoises](https://github.com/cristiancmoises)
gcc o cl.| Arquitectura | SIMD Disponible | Códec Predeterminado | Rendimiento de Descompresión |
|---|
| x86_64 + AVX2 | AVX2 inline SIMD | VaptVupt | ~2–3 GB/s |
| x86_64 (no AVX2) | Scalar | Zupt-LZHP | ~500 MB/s |
| aarch64 + NEON | NEON SIMD | VaptVupt | ~1–2 GB/s |
| armhf, ppc64le, s390x, riscv64 | Scalar | Zupt-LZHP | ~300–500 MB/s |
| Modo | Comando | Nivel de Seguridad | Impacto en Velocidad |
|---|
| Híbrido PQ | --pq pub.key | Resistente a cuántica + clásico | ~5% de sobrecarga |
| Contraseña | -p | AES-256, PBKDF2 600K iter | ~3% de sobrecarga |
| Ninguno | (predeterminado) | Solo integridad (XXH64) | Más rápido |
| Nivel | Modo | Mejor para | Relación típica |
|---|
-l 1 a -l 3 | Ultra rápido | Sistemas en vivo, NVMe (prioridad de velocidad) | 1.5–2.5:1 |
-l 4 a -l 7 | Balanceado (predeterminado) | Particiones generales, ext4/NTFS | 2–5:1 |
-l 8 a -l 9 | Extremo | Almacenamiento en frío, copias de seguridad de archivo | 3–10:1 |
| Característica | Zupt disk | dd + gzip | Clonezilla | partclone |
|---|
| Compresión | VaptVupt/LZHP (adaptativo) | gzip (fijo) | Múltiples | Múltiples |
| Cifrado | AES-256 + híbrido PQ | Ninguno (tubería a gpg) | Ninguno | Ninguno |
| Detección de dispersión | Automática | Ninguna | Consciente del sistema de archivos | Consciente del sistema de archivos |
| Integridad por bloque | XXH64 por bloque | Ninguna | Ninguna | CRC32 |
| Binario único | ✓ (cero dependencias) | 2+ herramientas | ISO de arranque | Múltiples |
| Post-cuántico | ML-KEM-768 | — | — | — |
| Multiplataforma | 6 arquitecturas | ✓ | solo x86 | solo Linux |
| Característica | x86_64 | aarch64 | armhf | ppc64le | s390x | riscv64 |
|---|
| Criptografía Jasmin CT | ✓ | C fallback | C fallback | C fallback | C fallback | C fallback |
| Hardware AES-NI | ✓ (con AVX) | — | — | — | — | — |
| Decodificación SIMD AVX2 | ✓ | — | — | — | — | — |
| Decodificación SIMD NEON | — | ✓ | — | — | — | — |
| Códec predeterminado | VaptVupt | VaptVupt | LZHP | LZHP | LZHP | LZHP |
| Todos los códecs decodifican | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |