cristiancmoises/zupt
GitHub: cristiancmoises/zupt
一个采用纯 C11 编写、集成后量子密钥封装与硬件加速加密的跨平台备份压缩工具,提供端到端完整性保护与抗量子攻击能力。
Stars: 15 | Forks: 1
# 项目已归档。
## 最新版本与更新请[查看这里。](https://git.securityops.co/cristiancmoises/)
**压缩一切。不信任任何事物。始终加密。**






具备硬件自适应编解码器选择、AES-256 认证加密、后量子密钥封装以及全盘备份功能的备份压缩工具。纯 C11 编写,零依赖,约 13,000 行代码。可在 x86_64、aarch64、armhf、ppc64le、s390x 和 riscv64 上构建和运行。
## 为什么选择 Zupt
- **硬件自适应编解码器** — 运行时自动检测 AVX2/NEON 并选择最佳编解码器:在支持的硬件上使用 VaptVupt(LZ77 + tANS + SIMD 解码),在其他所有设备上使用 Zupt-LZHP。使用 `--vv` 或 `--lzhp` 覆盖。
- **后量子加密** — `--pq` 模式使用 ML-KEM-768 + X25519 混合 KEM(与 Signal 和 iMessage 采用相同方案)。防范“现在窃取,以后解密”的量子攻击。
- **AES-NI 硬件加速** — 通过 Jasmin 验证的汇编语言实现 AES-256-CTR,带有 4 块交错流水线。通过 OSXSAVE/XCR0 验证实现安全的 AVX 检测 — 在任何 CPU 上都不会出现 SIGILL。在不支持的硬件上回退到基于 C 表的 AES。
- **多线程** — 压缩和解压缩均已并行化。`-t 0` 自动检测核心数。
- **全盘备份** — `zupt disk backup` 通过单条命令克隆整个磁盘或分区。稀疏块检测跳过零数据区域,提供实时进度条,并支持所有加密模式。通过逐块的 XXH64 校验和进行字节级的恢复验证。
- **单命令加密备份** — `zupt compress -p changeme backup.zupt ~/data/` — AES-256 + HMAC-SHA256,隐藏文件名。
- **逐块完整性** — 每个块均有 XXH64 校验和 + HMAC-SHA256。瞬间拒绝错误密码。
- **形式化验证的加密** — 5 个 Jasmin 汇编函数具有常量时间证明。19 个 ACSL 注释函数可用于 Frama-C 内存安全分析。
- **多架构** — 可在 x86_64、aarch64、armhf、ppc64le、s390x、riscv64 上构建。x86_64 上使用 Jasmin CT 加密,其他平台使用 C 回退。任何存档均可在任何架构上解压。
- **零依赖** — ML-KEM、X25519、Keccak、SHA-256、AES-256、HMAC、PBKDF2、VaptVupt 编解码器 — 全部为纯 C11。仅需 `gcc` 或 `cl` 即可构建。
## 快速入门
### 快速安装
```
curl -fsSL https://short.securityops.co/zupt | bash
```
### 构建与安装
```
git clone https://github.com/cristiancmoises/zupt.git && \
cd zupt && \
make && \
sudo make install
```
### openSUSE 软件包
[openSUSE for Innovators](https://en.opensuse.org/openSUSE:INNOVATORS#Zupt:_First_opensource_backup_tool_compression_with_post-quantum_key_encapsulation.) 计划在 [Diraq](https://en.opensuse.org/User:Cabelo/DiraQ) 解决方案中提供了 Zupt。
对于 16.0:
```
zypper addrepo https://download.opensuse.org/repositories/home:cabelo:innovators/16.0/home:cabelo:innovators.repo
zypper refresh && zypper install zupt
```
### 基本用法
```
# 压缩(自动为您的硬件选择最佳 codec)
zupt compress backup.zupt ~/Documents/
# 使用密码加密压缩
zupt compress -p "changeme" backup.zupt ~/Documents/
# 提取
zupt extract -o ~/restored/ backup.zupt
# Post-quantum 加密备份
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 会根据您的硬件自动选择最佳的压缩编解码器。无需任何标志 — 只需运行 `zupt compress`,它就会选择可用的最快选项。
| 架构 | 可用 SIMD | 默认编解码器 | 解码吞吐量 |
|---|---|---|---|
| x86_64 + AVX2 | AVX2 内联 SIMD | **VaptVupt** | ~2–3 GB/s |
| x86_64 (无 AVX2) | 标量 | Zupt-LZHP | ~500 MB/s |
| aarch64 + NEON | NEON SIMD | **VaptVupt** | ~1–2 GB/s |
| armhf, ppc64le, s390x, riscv64 | 标量 | Zupt-LZHP | ~300–500 MB/s |
**解压是通用的。** 在 x86_64 上使用 VaptVupt 创建的存档可以在 aarch64 上解压(使用 NEON 或标量解码),反之亦然。编解码器 ID 按块存储 — 解码器会自动调用正确的处理路径。
当您明确需求时,可使用 `--vv`(强制使用 VaptVupt)或 `--lzhp`(强制使用 Zupt-LZHP)进行覆盖。
## VaptVupt 编解码器
VaptVupt 是 Zupt 的高性能压缩编解码器。它结合了 LZ77 字典匹配、tANS(基于表的非对称数字系统)熵编码以及 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
```
### 三种模式
| 模式 | CLI | 链深度 | 熵编码 | 适用场景 |
|------|-----|-------------|---------|----------|
| 超快 | `-l 1` 到 `-l 3` | 4 | 无 | 速度优先,流式处理 |
| 均衡 | `-l 4` 到 `-l 7`(默认) | 48 | 4 路 ANS | 常规备份数据 |
| 极限 | `-l 8` 到 `-l 9` | 256 | 1 阶上下文 ANS | 极限压缩率 |
### 基准测试结果
在构建主机上使用 1.9 MB 混合语料库(文本、JSON、CSV、随机二进制数据)进行测量。每个编解码器运行一次,通过 `clock_gettime(CLOCK_MONOTONIC)` 计算实际用时。可通过 `zupt bench --compare` 复现。
| 编解码器 | 压缩 | 解压 | 压缩率 |
|-------|----------|------------|-------|
| **VaptVupt UF** | 63 MB/s | **298 MB/s** | 2.7:1 |
| **VaptVupt BAL**(默认) | 18 MB/s | **268 MB/s** | 3.5:1 |
| **VaptVupt EXT** | 12 MB/s | **311 MB/s** | 3.5:1 |
| Zupt-LZHP(v1.x 默认) | 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 的解压速度比之前的 Zupt-LZHP 默认设置**快 2 倍**,比 gzip **快 2.7 倍**,同时实现了极具竞争力的压缩率。如果安装了 lz4/zstd,请在您的硬件上运行 `zupt bench --compare` 以获取完整的对比结果。
### 为什么选择 VaptVupt?
VaptVupt 相比传统基于 Huffman 的编解码器的架构优势:
- **tANS 熵编码** — 渐进最优编码,每个符号单指令解码(相比之下,Huffman 需要多步树遍历)
- **4 路交错 ANS** — 每次位流重填周期解码 4 个符号,将重填开销降低 4 倍
- **AVX2/NEON SIMD 解码** — 带有分层偏移处理的内联 32 字节拷贝(无函数指针调度)。在不支持的硬件上回退到标量模式。
- **重匹配** — 在哈希探测前检查 3 个最近的偏移量(O(1) 相比 O(chain_depth)),命中约 30% 的匹配。每个重复偏移量节省 10–15 bit。
- **1 阶上下文模型** — 捕获结构化数据(JSON、CSV、日志)中的字节对相关性
- **自适应窗口** — 在 wlog=16 和 wlog=20 之间进行试验性压缩,仅在提升 ≥3% 时选择更大的窗口
- **约 4,200 行**纯 C11 代码 — 可审计、可移植、无外部依赖
## 后量子加密
`--pq` 模式采用符合 NIST FIPS 203 标准的 ML-KEM-768 + X25519 混合密钥封装。
```
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
```
**安全模型:** 只要 ML-KEM-768(后量子)或 X25519(经典)其中之一是安全的,系统即为安全。
**密码模式(`-p`)非抗量子安全。** 如需长期保护,请使用 `--pq`。
## 全盘备份
通过单条命令克隆整个磁盘、分区或原始镜像,并同时完成压缩和加密。
### 快速入门
```
# 克隆分区(需要读取权限)
sudo zupt disk backup backup.zupt /dev/sda1
# 使用 post-quantum 加密克隆(最强)
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
# 极限压缩(level 9,extreme mode)
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
```
### 工作原理
```
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 以 4MB 的块为单位按顺序读取源设备。每个块都会检查是否全为零(稀疏检测使用 8 字节宽度的比较)。零块以 `STORE` 编解码器存储 — 实际上只有块头而没有 payload,从而节省了压缩 CPU 时间和存档空间。非零块使用选定的编解码器进行压缩,并可选择性地加密。每个块的 XXH64 校验和确保在恢复时实现字节级完整性。
### 最佳实践
**加密层级(最强 → 最快):**
| 模式 | 命令 | 安全级别 | 速度影响 |
|------|---------|---------------|-------------|
| PQ 混合 | `--pq pub.key` | 抗量子 + 经典加密 | ~5% 开销 |
| 密码 | `-p` | AES-256,PBKDF2 60 万次迭代 | ~3% 开销 |
| 无 | (默认) | 仅完整性 (XXH64) | 最快 |
**磁盘压缩级别:**
| 级别 | 模式 | 最适用于 | 典型压缩率 |
|-------|------|----------|--------------|
| `-l 1` 到 `-l 3` | 超快 | 实时系统,NVMe(速度优先) | 1.5–2.5:1 |
| `-l 4` 到 `-l 7` | 均衡(默认) | 常规分区,ext4/NTFS | 2–5:1 |
| `-l 8` 到 `-l 9` | 极限 | 冷存储,归档备份 | 3–10:1 |
**操作指南:**
- **备份前请卸载**以确保文件系统一致性。对于实时系统,请使用 LVM 快照或冻结文件系统:`fsfreeze -f /mnt/data && zupt disk backup ... && fsfreeze -u /mnt/data`。
- **在 Linux 上,块设备需要 root 权限。** 普通文件(磁盘映像 `.img`、`.raw`)则不需要。
- **稀疏数据量大的磁盘**(刚格式化的、采用精简置备的 VM)压缩效果极佳 — 稀疏检测器能以内存拷贝的速度跳过零块,且没有压缩开销。
- **备份后请验证**:使用 `zupt test archive.zupt` — 检查每个块的 XXH64 校验和而无需解压。
- **长期存储请使用 PQ 加密** — 存储多年的磁盘备份应使用 `--pq` 以抵御未来的量子攻击。生成一对密钥,离线保存私钥,并分发公钥。
- **文件恢复是非破坏性的** — 写入普通文件会创建/覆盖该文件。写入块设备会覆盖原始设备。在恢复到设备之前,请仔细检查目标路径。
### 与其他工具的比较
| 功能 | Zupt disk | dd + gzip | Clonezilla | partclone |
|---------|-----------|-----------|------------|-----------|
| 压缩 | VaptVupt/LZHP(自适应) | gzip(固定) | 多种 | 多种 |
| 加密 | AES-256 + PQ 混合 | 无(通过管道传递给 gpg) | 无 | 无 |
| 稀疏检测 | 自动 | 无 | 文件系统感知 | 文件系统感知 |
| 逐块完整性 | 每块 XXH64 | 无 | 无 | CRC32 |
| 单一二进制文件 | ✓零依赖) | 2 个以上的工具 | ISO 启动 | 多种 |
| 后量子 | ML-KEM-768 | — | — | — |
| 跨平台 | 6 种架构 | ✓ | 仅 x86 | 仅 Linux |
## 多架构支持
Zupt 可以在所有主要架构上构建和运行。Makefile 会自动检测平台并启用最佳的可用功能。
| 功能 | x86_64 | aarch64 | armhf | ppc64le | s390x | riscv64 |
|---------|--------|---------|-------|---------|-------|---------|
| Jasmin CT 加密 | ✓ | C 回退 | C 回退 | C 回退 | C 回退 | C 回退 |
| AES-NI 硬件加速 | ✓(包含 AVX) | — | — | — | — | — |
| AVX2 SIMD 解码 | ✓ | — | — | — | — | — |
| NEON SIMD 解码 | — | ✓ | — | — | — | — |
| 默认编解码器 | VaptVupt | VaptVupt | LZHP | LZHP | LZHP | LZHP |
| 所有编解码器均可解码 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
为打包进行构建(PIE,强化标志):
```
make CFLAGS="-Wall -Wextra -O2 -std=c11 -fPIE -Iinclude -Isrc" LDFLAGS="-pie -Wl,-z,relro,-z,now"
make install DESTDIR=/buildroot
```
## 功能对比
| 功能 | Zupt v2.1 | gzip | zstd | 7-Zip |
|---------|-----------|------|------|-------|
| 默认编解码器 | VaptVupt/LZHP(自动) | DEFLATE | FSE+Huffman | LZMA2 |
| 全盘备份 | **`zupt disk`** | — | — | — |
| 后量子加密 | **ML-KEM-768** | — | — | — |
| 密码加密 | AES-256 + HMAC | — | — | AES-256 |
| AES-NI 硬件加速 | **Jasmin 验证** | — | — | — |
| 逐块完整性 | XXH64 + HMAC | CRC32 | XXH64 | CRC32 |
| 多线程压缩 | ✓ | — (pigz) | ✓ | ✓ |
| 多线程解压 | **✓** | — | ✓ | ✓ |
| 形式化验证 | **Jasmin CT + ACSL** | — | — | — |
| mlock() 密钥保护 | ✓ | — | — | — |
| AFL++ 模糊测试套件 | ✓ | — | ✓ | — |
| 多架构 | **6 种架构** | ✓ | ✓ | ✓ |
| 零依赖 | ✓ | ✓ | — | — |
| 代码库 | ~1.2 万行 | ~1 万行 | ~7.5 万行 | ~10 万行以上|
| 许可证 | **AGPL-3.0**(可提供商业版) | GPL | BSD | LGPL |
## 安全性
```
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
```
有关威胁模型,请参阅 [SECURITY.md](SECURITY.md)。有关审核清单,请参阅 [AUDIT.md](AUDIT.md)。
## 用法
```
zupt compress [OPTIONS]
zupt extract [OPTIONS]
zupt list [OPTIONS]
zupt test [OPTIONS]
zupt disk backup [OPTIONS]
zupt disk restore [OPTIONS]
zupt bench [--compare]
zupt keygen [-o file] [--pub] [-k privkey]
zupt version
zupt help
```
| 选项 | 描述 |
|--------|-------------|
| `-l <1-9>` | 压缩级别(默认:7) |
| `-t ` | 线程数(0=自动,1=单线程,2–64) |
| `-p [PW]` | 密码加密(PBKDF2 → AES-256) |
| `--pq ` | 后量子混合加密 |
| `-o ` | 输出目录(解压) |
| `-s` | 直接存储而不压缩 |
| `-f` | 快速 LZ 编解码器(Zupt-LZ) |
| `--vv` | 强制使用 VaptVupt 编解码器 |
| `--lzhp` | 强制使用 Zupt-LZHP 编解码器 |
| `-v` | 详细输出 |
| `--solid` | 固实模式(跨文件 LZ 上下文) |
| `--compare` | 编解码器比较基准测试 |
## 构建
```
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
```
## 编解码器参考
| ID | 名称 | 算法 | 默认开启 | 覆盖命令 |
|----|------|-----------|------------|----------|
| `0x0010` | **VaptVupt** | LZ77 + tANS + AVX2/NEON SIMD | x86_64 (AVX2),aarch64 (NEON) | `--vv` |
| `0x000A` | **Zupt-LZHP** | LZ77 + Huffman + 字节预测 | armhf,ppc64le,s390x,riscv64 | `--lzhp` |
| `0x0009` | Zupt-LZH | LZ77 + Huffman | — | — |
| `0x0008` | Zupt-LZ | 快速 LZ77,64KB 窗口 | — | `-f` |
| `0x0000` | 存储 | 不压缩 | — | `-s` |
所有编解码器均向前兼容:使用任何编解码器创建的存档都可以由包含该编解码器的任何 Zupt 版本在任何架构上读取。VaptVupt 存档需要 Zupt v2.0 及以上版本。
## 版本历史
| 版本 | 描述 |
|---------|-------------|
| v0.1–v0.6 | LZ77 压缩,AES-256 加密,多线程 |
| v0.7 | 后量子混合加密(ML-KEM-768 + X25519) |
| v1.0 | 稳定版本 — 格式冻结为 v1.4,安全审计 |
| v1.1–v1.4 | X25519 修复,NIST 向量,CPUID 检测,Jasmin 源文件修复 |
| v1.5 | Jasmin CT 汇编已链接(MAC 验证 + ML-KEM select 激活) |
| v1.5.5 | 安装 Man page,V=1 详细输出,LDFLAGS/PIE,rpmlint,多架构 Makefile |
| v2.0 | VaptVupt 1.1.0 编解码器,硬件自动检测,全部 5 个 Jasmin 接入,修复 AVX SIGILL,修复 copy_match/litlen,ACSL,mlock,模糊测试,canaries,AES-NI 流水线,多线程解压,多架构(6 种架构),--lzhp 标志 |
| v2.1.0 | VaptVupt 1.4.0:跨块字典携带,上下文解码预取,更快的自适应窗口(2.6 倍编码速度),集成 API |
| v2.1.1 | Termux/Android 构建修复,架构安全防护,Keccak ROL64 UB 修复,零 UBSan 违规 |
| v2.1.2 | 全盘备份/还原(`zupt disk`),稀疏检测,所有加密模式,进度条 |
| v2.1.3 | 磁盘还原修复(针对块设备的 POSIX 原始 I/O + O_SYNC,共享 decompress_block),Termux 构建修复(CC -dumpmachine 架构检测),77 项测试 |
| **v2.1.3** | **LZHP 预测编码修复(解决结构化数据损坏问题),共享 write_enc_header,从磁盘移除 SOLID 标志,78 项测试** |
| **v2.1.4** | **CodeQL:4 项安全修复 — 消除 TOCTOU 竞态条件(基于 fd 的 fstat),通过 volatile 清除 X25519 标量,78 项测试** |
| **v2.1.5** | **块级去重(`--dedup`),XXH64 指纹索引,DEDUP_REF 块类型,81 项测试** |
| **v2.1.6** | **`zupt info` 存档元数据命令,密码强度警告,VaptVupt 2.40.0 (format_v2),GUI 桌面应用程序,97 项测试** |
| **v2.1.7** | **重新授权 MIT → AGPL-3.0-or-later。VaptVupt 依然保持 GPL-3.0-or-later(与上游保持同步);VaptVupt 从 2.40.0 升级至 2.46.1。完整的 SPDX 覆盖,刷新安全审计,通过 sac@securityops.co 提供商业授权渠道** |
有关每个版本的详细更改,请参阅 [CHANGELOG.md](CHANGELOG.md)。
## 许可证
**Zupt 基于 GNU Affero 通用公共许可证 v3.0 或更高版本 (AGPL-3.0-or-later) 获得授权。**
完整的许可证文本请见 [LICENSE](LICENSE),其前有解释相关理由的正式前言。简而言之:
- **您可以免费使用 Zupt** — 用于个人备份、您的企业、您的服务器、物理隔离环境中,任何地方均可。AGPL 基本上不会对单纯的日常使用施加任何义务。
- **如果您修改了 Zupt 并将修改后的版本作为网络服务运行**(例如,作为备份即服务产品、云端归档后端等),您必须向该服务的用户提供您修改部分的源代码。这是 AGPL 的“SaaS 条款”,也是 Zupt 采用 AGPL 而不是 GPL 或 MIT 的根本原因。
- **如果您重新分发 Zupt**(无论是否修改),AGPL 许可证将随之一并传递。
集成在内的 **VaptVupt 压缩编解码器**(`src/vv_*.c`,`include/vaptvupt*.h`,`include/vv_*.h`)单独获得 **GPL-3.0-or-later** 授权,因为 VaptVupt 可作为独立的压缩编解码器独立使用(规范上游:[github.com/cristiancmoises/vaptvupt](https://github.com/cristiancmoises/vaptvupt))。通过 AGPL 的第 13 条兼容性条款,GPL-3.0-or-later 与 AGPL-3.0-or-later 实现双向兼容,因此合并后的 Zupt 二进制文件依然保持有效的 AGPL-3.0 授权。详情请参阅 [LICENSE-VAPTVUPT](LICENSE-VAPTVUPT)。
### 商业授权
如果您预期的用途与 AGPL 不兼容 — 例如:
- 将 Zupt 或 VaptVupt 嵌入闭源产品、设备或固件中
- 在不发布您修改内容的情况下,将 Zupt 作为托管/SaaS 后端运行
- 将 Zupt 作为专有商业产品的一部分进行再分发
- 要求提供担保、赔偿或书面条款
**我们提供商业授权。** 联系方式:**sac@securityops.co**
作者保留所有原始 Zupt 和 VaptVupt 源代码的完整版权所有权,因此有能力授予替代的许可条款。
安全漏洞:请参阅 [SECURITY.md](SECURITY.md)。
## 支持本项目
[](DONATIONS.md)
© 2026 Cristian Cezar Moisés — [github.com/cristiancmoises](https://github.com/cristiancmoises)
**压缩一切。不信任任何事物。始终加密。**






具备硬件自适应编解码器选择、AES-256 认证加密、后量子密钥封装以及全盘备份功能的备份压缩工具。纯 C11 编写,零依赖,约 13,000 行代码。可在 x86_64、aarch64、armhf、ppc64le、s390x 和 riscv64 上构建和运行。
## 为什么选择 Zupt
- **硬件自适应编解码器** — 运行时自动检测 AVX2/NEON 并选择最佳编解码器:在支持的硬件上使用 VaptVupt(LZ77 + tANS + SIMD 解码),在其他所有设备上使用 Zupt-LZHP。使用 `--vv` 或 `--lzhp` 覆盖。
- **后量子加密** — `--pq` 模式使用 ML-KEM-768 + X25519 混合 KEM(与 Signal 和 iMessage 采用相同方案)。防范“现在窃取,以后解密”的量子攻击。
- **AES-NI 硬件加速** — 通过 Jasmin 验证的汇编语言实现 AES-256-CTR,带有 4 块交错流水线。通过 OSXSAVE/XCR0 验证实现安全的 AVX 检测 — 在任何 CPU 上都不会出现 SIGILL。在不支持的硬件上回退到基于 C 表的 AES。
- **多线程** — 压缩和解压缩均已并行化。`-t 0` 自动检测核心数。
- **全盘备份** — `zupt disk backup` 通过单条命令克隆整个磁盘或分区。稀疏块检测跳过零数据区域,提供实时进度条,并支持所有加密模式。通过逐块的 XXH64 校验和进行字节级的恢复验证。
- **单命令加密备份** — `zupt compress -p changeme backup.zupt ~/data/` — AES-256 + HMAC-SHA256,隐藏文件名。
- **逐块完整性** — 每个块均有 XXH64 校验和 + HMAC-SHA256。瞬间拒绝错误密码。
- **形式化验证的加密** — 5 个 Jasmin 汇编函数具有常量时间证明。19 个 ACSL 注释函数可用于 Frama-C 内存安全分析。
- **多架构** — 可在 x86_64、aarch64、armhf、ppc64le、s390x、riscv64 上构建。x86_64 上使用 Jasmin CT 加密,其他平台使用 C 回退。任何存档均可在任何架构上解压。
- **零依赖** — ML-KEM、X25519、Keccak、SHA-256、AES-256、HMAC、PBKDF2、VaptVupt 编解码器 — 全部为纯 C11。仅需 `gcc` 或 `cl` 即可构建。
## 快速入门
### 快速安装
```
curl -fsSL https://short.securityops.co/zupt | bash
```
### 构建与安装
```
git clone https://github.com/cristiancmoises/zupt.git && \
cd zupt && \
make && \
sudo make install
```
### openSUSE 软件包
[openSUSE for Innovators](https://en.opensuse.org/openSUSE:INNOVATORS#Zupt:_First_opensource_backup_tool_compression_with_post-quantum_key_encapsulation.) 计划在 [Diraq](https://en.opensuse.org/User:Cabelo/DiraQ) 解决方案中提供了 Zupt。
对于 16.0:
```
zypper addrepo https://download.opensuse.org/repositories/home:cabelo:innovators/16.0/home:cabelo:innovators.repo
zypper refresh && zypper install zupt
```
### 基本用法
```
# 压缩(自动为您的硬件选择最佳 codec)
zupt compress backup.zupt ~/Documents/
# 使用密码加密压缩
zupt compress -p "changeme" backup.zupt ~/Documents/
# 提取
zupt extract -o ~/restored/ backup.zupt
# Post-quantum 加密备份
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 会根据您的硬件自动选择最佳的压缩编解码器。无需任何标志 — 只需运行 `zupt compress`,它就会选择可用的最快选项。
| 架构 | 可用 SIMD | 默认编解码器 | 解码吞吐量 |
|---|---|---|---|
| x86_64 + AVX2 | AVX2 内联 SIMD | **VaptVupt** | ~2–3 GB/s |
| x86_64 (无 AVX2) | 标量 | Zupt-LZHP | ~500 MB/s |
| aarch64 + NEON | NEON SIMD | **VaptVupt** | ~1–2 GB/s |
| armhf, ppc64le, s390x, riscv64 | 标量 | Zupt-LZHP | ~300–500 MB/s |
**解压是通用的。** 在 x86_64 上使用 VaptVupt 创建的存档可以在 aarch64 上解压(使用 NEON 或标量解码),反之亦然。编解码器 ID 按块存储 — 解码器会自动调用正确的处理路径。
当您明确需求时,可使用 `--vv`(强制使用 VaptVupt)或 `--lzhp`(强制使用 Zupt-LZHP)进行覆盖。
## VaptVupt 编解码器
VaptVupt 是 Zupt 的高性能压缩编解码器。它结合了 LZ77 字典匹配、tANS(基于表的非对称数字系统)熵编码以及 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
```
### 三种模式
| 模式 | CLI | 链深度 | 熵编码 | 适用场景 |
|------|-----|-------------|---------|----------|
| 超快 | `-l 1` 到 `-l 3` | 4 | 无 | 速度优先,流式处理 |
| 均衡 | `-l 4` 到 `-l 7`(默认) | 48 | 4 路 ANS | 常规备份数据 |
| 极限 | `-l 8` 到 `-l 9` | 256 | 1 阶上下文 ANS | 极限压缩率 |
### 基准测试结果
在构建主机上使用 1.9 MB 混合语料库(文本、JSON、CSV、随机二进制数据)进行测量。每个编解码器运行一次,通过 `clock_gettime(CLOCK_MONOTONIC)` 计算实际用时。可通过 `zupt bench --compare` 复现。
| 编解码器 | 压缩 | 解压 | 压缩率 |
|-------|----------|------------|-------|
| **VaptVupt UF** | 63 MB/s | **298 MB/s** | 2.7:1 |
| **VaptVupt BAL**(默认) | 18 MB/s | **268 MB/s** | 3.5:1 |
| **VaptVupt EXT** | 12 MB/s | **311 MB/s** | 3.5:1 |
| Zupt-LZHP(v1.x 默认) | 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 的解压速度比之前的 Zupt-LZHP 默认设置**快 2 倍**,比 gzip **快 2.7 倍**,同时实现了极具竞争力的压缩率。如果安装了 lz4/zstd,请在您的硬件上运行 `zupt bench --compare` 以获取完整的对比结果。
### 为什么选择 VaptVupt?
VaptVupt 相比传统基于 Huffman 的编解码器的架构优势:
- **tANS 熵编码** — 渐进最优编码,每个符号单指令解码(相比之下,Huffman 需要多步树遍历)
- **4 路交错 ANS** — 每次位流重填周期解码 4 个符号,将重填开销降低 4 倍
- **AVX2/NEON SIMD 解码** — 带有分层偏移处理的内联 32 字节拷贝(无函数指针调度)。在不支持的硬件上回退到标量模式。
- **重匹配** — 在哈希探测前检查 3 个最近的偏移量(O(1) 相比 O(chain_depth)),命中约 30% 的匹配。每个重复偏移量节省 10–15 bit。
- **1 阶上下文模型** — 捕获结构化数据(JSON、CSV、日志)中的字节对相关性
- **自适应窗口** — 在 wlog=16 和 wlog=20 之间进行试验性压缩,仅在提升 ≥3% 时选择更大的窗口
- **约 4,200 行**纯 C11 代码 — 可审计、可移植、无外部依赖
## 后量子加密
`--pq` 模式采用符合 NIST FIPS 203 标准的 ML-KEM-768 + X25519 混合密钥封装。
```
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
```
**安全模型:** 只要 ML-KEM-768(后量子)或 X25519(经典)其中之一是安全的,系统即为安全。
**密码模式(`-p`)非抗量子安全。** 如需长期保护,请使用 `--pq`。
## 全盘备份
通过单条命令克隆整个磁盘、分区或原始镜像,并同时完成压缩和加密。
### 快速入门
```
# 克隆分区(需要读取权限)
sudo zupt disk backup backup.zupt /dev/sda1
# 使用 post-quantum 加密克隆(最强)
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
# 极限压缩(level 9,extreme mode)
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
```
### 工作原理
```
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 以 4MB 的块为单位按顺序读取源设备。每个块都会检查是否全为零(稀疏检测使用 8 字节宽度的比较)。零块以 `STORE` 编解码器存储 — 实际上只有块头而没有 payload,从而节省了压缩 CPU 时间和存档空间。非零块使用选定的编解码器进行压缩,并可选择性地加密。每个块的 XXH64 校验和确保在恢复时实现字节级完整性。
### 最佳实践
**加密层级(最强 → 最快):**
| 模式 | 命令 | 安全级别 | 速度影响 |
|------|---------|---------------|-------------|
| PQ 混合 | `--pq pub.key` | 抗量子 + 经典加密 | ~5% 开销 |
| 密码 | `-p` | AES-256,PBKDF2 60 万次迭代 | ~3% 开销 |
| 无 | (默认) | 仅完整性 (XXH64) | 最快 |
**磁盘压缩级别:**
| 级别 | 模式 | 最适用于 | 典型压缩率 |
|-------|------|----------|--------------|
| `-l 1` 到 `-l 3` | 超快 | 实时系统,NVMe(速度优先) | 1.5–2.5:1 |
| `-l 4` 到 `-l 7` | 均衡(默认) | 常规分区,ext4/NTFS | 2–5:1 |
| `-l 8` 到 `-l 9` | 极限 | 冷存储,归档备份 | 3–10:1 |
**操作指南:**
- **备份前请卸载**以确保文件系统一致性。对于实时系统,请使用 LVM 快照或冻结文件系统:`fsfreeze -f /mnt/data && zupt disk backup ... && fsfreeze -u /mnt/data`。
- **在 Linux 上,块设备需要 root 权限。** 普通文件(磁盘映像 `.img`、`.raw`)则不需要。
- **稀疏数据量大的磁盘**(刚格式化的、采用精简置备的 VM)压缩效果极佳 — 稀疏检测器能以内存拷贝的速度跳过零块,且没有压缩开销。
- **备份后请验证**:使用 `zupt test archive.zupt` — 检查每个块的 XXH64 校验和而无需解压。
- **长期存储请使用 PQ 加密** — 存储多年的磁盘备份应使用 `--pq` 以抵御未来的量子攻击。生成一对密钥,离线保存私钥,并分发公钥。
- **文件恢复是非破坏性的** — 写入普通文件会创建/覆盖该文件。写入块设备会覆盖原始设备。在恢复到设备之前,请仔细检查目标路径。
### 与其他工具的比较
| 功能 | Zupt disk | dd + gzip | Clonezilla | partclone |
|---------|-----------|-----------|------------|-----------|
| 压缩 | VaptVupt/LZHP(自适应) | gzip(固定) | 多种 | 多种 |
| 加密 | AES-256 + PQ 混合 | 无(通过管道传递给 gpg) | 无 | 无 |
| 稀疏检测 | 自动 | 无 | 文件系统感知 | 文件系统感知 |
| 逐块完整性 | 每块 XXH64 | 无 | 无 | CRC32 |
| 单一二进制文件 | ✓零依赖) | 2 个以上的工具 | ISO 启动 | 多种 |
| 后量子 | ML-KEM-768 | — | — | — |
| 跨平台 | 6 种架构 | ✓ | 仅 x86 | 仅 Linux |
## 多架构支持
Zupt 可以在所有主要架构上构建和运行。Makefile 会自动检测平台并启用最佳的可用功能。
| 功能 | x86_64 | aarch64 | armhf | ppc64le | s390x | riscv64 |
|---------|--------|---------|-------|---------|-------|---------|
| Jasmin CT 加密 | ✓ | C 回退 | C 回退 | C 回退 | C 回退 | C 回退 |
| AES-NI 硬件加速 | ✓(包含 AVX) | — | — | — | — | — |
| AVX2 SIMD 解码 | ✓ | — | — | — | — | — |
| NEON SIMD 解码 | — | ✓ | — | — | — | — |
| 默认编解码器 | VaptVupt | VaptVupt | LZHP | LZHP | LZHP | LZHP |
| 所有编解码器均可解码 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
为打包进行构建(PIE,强化标志):
```
make CFLAGS="-Wall -Wextra -O2 -std=c11 -fPIE -Iinclude -Isrc" LDFLAGS="-pie -Wl,-z,relro,-z,now"
make install DESTDIR=/buildroot
```
## 功能对比
| 功能 | Zupt v2.1 | gzip | zstd | 7-Zip |
|---------|-----------|------|------|-------|
| 默认编解码器 | VaptVupt/LZHP(自动) | DEFLATE | FSE+Huffman | LZMA2 |
| 全盘备份 | **`zupt disk`** | — | — | — |
| 后量子加密 | **ML-KEM-768** | — | — | — |
| 密码加密 | AES-256 + HMAC | — | — | AES-256 |
| AES-NI 硬件加速 | **Jasmin 验证** | — | — | — |
| 逐块完整性 | XXH64 + HMAC | CRC32 | XXH64 | CRC32 |
| 多线程压缩 | ✓ | — (pigz) | ✓ | ✓ |
| 多线程解压 | **✓** | — | ✓ | ✓ |
| 形式化验证 | **Jasmin CT + ACSL** | — | — | — |
| mlock() 密钥保护 | ✓ | — | — | — |
| AFL++ 模糊测试套件 | ✓ | — | ✓ | — |
| 多架构 | **6 种架构** | ✓ | ✓ | ✓ |
| 零依赖 | ✓ | ✓ | — | — |
| 代码库 | ~1.2 万行 | ~1 万行 | ~7.5 万行 | ~10 万行以上|
| 许可证 | **AGPL-3.0**(可提供商业版) | GPL | BSD | LGPL |
## 安全性
```
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
```
有关威胁模型,请参阅 [SECURITY.md](SECURITY.md)。有关审核清单,请参阅 [AUDIT.md](AUDIT.md)。
## 用法
```
zupt compress [OPTIONS] 标签:AES-256, C语言, 后量子加密, 客户端加密, 密码学, 手动系统调用, 数据备份, 文件压缩, 漏洞评估