hambosto/sweetbyte
GitHub: hambosto/sweetbyte
一款采用双层串联加密与纠错码的高安全性文件加密工具,在保障数据机密性的同时显著增强了文件抗损坏能力。
Stars: 0 | Forks: 0

**一个强韧、安全且高效的文件加密工具。**
[](https://github.com/hambosto/sweetbyte/actions/workflows/quality-checks.yaml)
[](https://goreportcard.com/report/github.com/hambosto/sweetbyte)
[](https://golang.org/)
[](https://opensource.org/licenses/MIT)
### 目录
- [为什么选择 SweetByte?](#-why-sweetbyte)
- [核心功能](#-core-features)
- [工作原理:加密流水线](#-how-it-works-the-encryption-pipeline)
- [架构](#-architecture)
- [文件格式](#-file-format)
- [用法](#-usage)
- [从源码构建](#️-building-from-source)
- [内部包概览](#-internal-packages-overview)
- [安全考量](#-security-considerations)
- [贡献](#-contributing)
- [许可证](#-license)
**SweetByte** 是一款专为稳健性和性能而设计的高安全性文件加密工具。它采用多层加密流水线保护您的文件,利用纠错码确保数据完整性,并提供交互式和命令行界面以带来无缝的用户体验。
## 🤔 为什么选择 SweetByte?
SweetByte 的构建秉持着三个核心原则:
- **安全至上:** 安全不仅是一项功能,更是基础。通过叠加像 **AES-256**、**XChaCha20** 和 **Argon2id** 这样顶级的密码学原语,SweetByte 针对广泛的威胁提供了深度防御。
- **极致的韧性:** 数据损坏会使加密文件变得无用。SweetByte 通过集成 **Reed-Solomon 纠错码** 来直面这个问题,让您的文件有机会在比特腐烂、传输错误或物理介质退化的情况下幸存。
- **以用户为中心的设计:** 强大的安全工具应该易于使用。SweetByte 既提供了易于使用的引导式**交互模式**,又提供了用于自动化的强大 **CLI**,在不影响功能性的前提下满足所有工作流程。
## ✨ 核心功能
- **双算法加密:** 将 **AES-256-GCM** 和 **XChaCha20-Poly1305** 串联起来实现分层防御,结合了 AES 标准与现代、高性能的 ChaCha20 流密码。
- **强密钥派生:** 利用密码哈希竞赛的获胜者 **Argon2id**,保护您的密码免受暴力破解攻击。
- **高韧性的文件格式:** 集成了 **Reed-Solomon 纠错码**,为数据增加冗余。这使得即使文件遭受部分损坏,也能被成功解密。
- **防篡改且可扩展的文件头:** 每个加密文件都包含一个既经过身份验证又具有灵活性的安全文件头。它使用 HMAC-SHA256 来防止篡改,并采用 Tag-Length-Value (TLV) 格式以允许未来的扩展。
- **高效流处理:** 以并发块处理文件,确保即使是超大文件也能实现低内存占用和高吞吐量。
- **双模式操作:**
- **交互模式:** 一个用户友好的向导式界面,引导您完成每一步操作。
- **命令行 (CLI) 模式:** 一个强大且可脚本化的界面,专为自动化和高级用户设计。
- **安全删除:** 提供一个选项,在操作完成后通过使用随机数据覆写源文件来安全擦除它们,使得数据恢复几乎不可能。
## ⚙️ 工作原理:加密流水线
SweetByte 通过复杂的流水线处理数据,以确保机密性、完整性和韧性。
```
graph TD
A[Data] --> B[Zlib]
B --> C[PKCS7]
C --> D[AES-GCM]
D --> E[XChaCha20]
E --> F[Reed-Solomon]
F --> G[Output]
```
#### 加密流程
在加密文件时,数据会经过以下几个阶段:
1. **Zlib 压缩:** 原始数据被压缩以减小其大小。
2. **PKCS7 填充:** 压缩后的数据被填充到特定的块大小,这是块密码的先决条件。
3. **AES-256-GCM 加密:** 填充后的数据使用 AES(行业标准)进行加密。
4. **XChaCha20-Poly1305 加密:** 经过 AES 加密的密文随后*再次*使用 XChaCha20 进行加密,添加了第二层独立的安全防护。
5. **Reed-Solomon 编码:** 最终的密文使用纠错数据进行编码,使其能够抵御损坏。
这个多阶段过程生成的最终文件不仅经过加密,而且经过压缩,并能抵御数据腐烂。
#### 解密流程
解密是加密流水线的精确逆过程,逐层解包以安全地恢复原始数据。
## 🏛️ 架构
SweetByte 采用模块化、分层的架构设计,分离关注点并促进代码重用。高层结构可以可视化如下:
```
graph TD
A[CLI Mode]
B[Interactive Mode]
C[Processor]
E[Stream]
D[Task Pool]
F[Cipher]
G[Derive]
H[Header]
I[Compression]
J[Encoding]
K[Padding]
L[File]
M[UI]
N[Config]
P[Utils]
Q[Types]
A --> C
B --> C
C --> E
E --> D
D --> F
D --> G
D --> H
D --> I
D --> J
D --> K
C --> L
B --> M
E --> N
D --> P
C --> Q
```
- **用户界面:** `cli` 和 `interactive` 包为用户提供了两种不同的与应用交互的方式。这两个界面都构建在 `processor` 包之上。
- **核心逻辑:** `processor`、`stream` 和 `task pool` 包构成了应用程序的核心。`processor` 包协调高级别的工作流,`stream` 包处理并发的、基于块的文件处理,而 `task pool` 包管理并发的任务执行。
- **密码学与数据处理:** 该层包含实现密码学和数据处理原语的包。这些包负责加密、密钥派生、文件头序列化、压缩、纠错和填充。它们主要由 `task pool` 包调用。
- **实用程序与支持:** 该层提供了一组在整个应用程序中使用的实用程序和支持包。这些包处理文件管理(`file`)、UI 组件(`ui`)、配置和其他杂项任务。`types` 包包含整个应用程序中使用的通用数据结构。
## 📦 文件格式
加密文件(`.swx`)具有专为安全性和韧性而设计的自定义二进制结构。
#### 总体结构
一个加密文件由一个具有韧性、可变大小的文件头和一系列可变长度的数据块组成。
```
[ Secure Header (variable size) ] [ Chunk 1 ] [ Chunk 2 ] ... [ Chunk N ]
```
#### 安全文件头
文件头旨在具备极致的韧性以抵御数据损坏。它不是一个简单的固定结构,而是一个多层、自校验的格式,其中每个组件——包括关于组件大小的元数据——都受到 **Reed-Solomon 纠错码** 的保护。这确保了即使文件头部分受损,也能被重构。
文件头由三个主要部分组成,按顺序读取:
`[ Lengths Header (16 bytes) ] [ Encoded Length Prefixes (variable) ] [ Encoded Data Sections (variable) ]`
**1. Lengths Header (16 bytes)**
这是文件头中唯一固定大小的部分。它充当当引导程序,提供四个主要部分(Magic、Salt、Header Data 和 MAC)各自的*编码长度前缀*的精确大小。
**2. Encoded Length Prefixes (Variable Size)**
在长度头之后是四个可变大小的块。每个块都是一个 Reed-Solomon 编码的值,解码后会揭示相应编码数据部分的大小。这为文件的结构元数据增加了另一层保护。
**3. Encoded Data Sections (Variable Size)**
这是文件头的核心,包含实际的元数据。每个部分都使用 Reed-Solomon 进行单独编码,使其能够独立恢复。
| 部分 | 原始大小 | 描述 |
|-----------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Magic Bytes** | 4 bytes | `0xCAFEBABE` - 一个常量值,用于将该文件标识为 SweetByte 加密文件。 |
| **Salt** | 32 bytes | 用于 Argon2id 密钥派生函数的唯一随机值。这确保了即使使用相同的密码,派生出的加密密钥也是唯一的。 |
| **Header Data** | 14 bytes | 包含序列化文件元数据的块。详见下文。 |
| **MAC** | 32 bytes | 提供对*原始、已解码的*文件头部分(`Magic Bytes` + `Salt` + `Header Data`)的完整性和真实性的 **HMAC-SHA256**。 |
**文件头身份验证**
为了防止篡改,**MAC** 是在*原始、已解码的* `Magic Bytes`、`Salt` 和 `Header Data` 部分上计算得出的。在解密期间,文件头各部分首先被解码(如有必要还会被纠正),然后验证 MAC。如果验证失败,则中止该过程。此检查使用恒定时间比较来防止计时攻击,从而确保文件头的元数据是真实的且未被篡改。
**Header Data**
`Header Data` 块是一个 14 字节的结构,包含文件的核心元数据。它是通过序列化内部的 `Header` 结构体创建的,随后被编码和身份验证。它具有以下布局:
| 字段 | 大小 (bytes) | 描述 |
|----------------|--------------|------------------------------------------------------------------------------------------------------------------------------------------|
| **Version** | 2 | 一个 16 位无符号整数,表示文件格式版本(当前为 `0x0001`)。 |
| **Flags** | 4 | 一个 32 位无符号整数位字段,包含指示处理选项的标志(例如,`FlagProtected`)。 |
| **OriginalSize** | 8 | 一个 64 位无符号整数,表示文件内容的原始、未压缩大小。 |
这种分层方法为文件的关键元数据提供了极高的韧性和安全性,保护其免受意外损坏和恶意篡改。
#### 加密参数
SweetByte 为密钥派生和加密使用了强大且现代的加密参数。
- **Argon2id 参数:**
- **Time Cost:** 3
- **Memory Cost:** 64 KB
- **Parallelism:** 4
- **Reed-Solomon 参数:**
- **Data Shards:** 4
- **Parity Shards:** 10(提供高冗余度)
#### 数据块
在文件头之后,文件包含被拆分为多个块的加密数据。每个块都以一个 4 字节的长度头作为前缀,这对于基于流的解密过程至关重要。
```
[ Chunk Size (4 bytes) ] [ Encrypted & Encoded Data (...) ]
```
## 🚀 用法
#### 安装
要安装 SweetByte,请使用 `go install` 命令:
```
go install github.com/hambosto/sweetbyte@latest
```
#### 交互模式
要获得引导式体验,请在不带任何命令的情况下运行 SweetByte。这是默认模式。
```
sweetbyte
```
您也可以显式运行交互模式:
```
sweetbyte interactive
```
交互式提示将引导您选择操作(加密/解密)、选择文件,以及在操作完成后处理源文件。
#### 命令行 (CLI) 模式
对于脚本编写和自动化,请使用 `encrypt` 和 `decrypt` 命令。
**要加密文件:**
```
# 基本加密(将提示输入密码)
sweetbyte encrypt -i my_document.txt -o my_document.swx
# 提供密码并在加密后删除原始文件
sweetbyte encrypt -i my_document.txt -p "my-secret-password" --delete-source
```
**要解密文件:**
```
# 基本解密(将提示输入密码)
sweetbyte decrypt -i my_document.swx -o my_document.txt
# 提供密码并删除加密的源文件
sweetbyte decrypt -i my_document.swx -p "my-secret-password" --delete-source
```
## 🏗️ 从源码构建
SweetByte 使用 Go 1.25.4 构建,并遵循 Go modules 进行依赖管理。要从源码构建,请遵循以下步骤:
### 前置条件
- Go 1.25.4 或更高版本
- Git
### 构建过程
要从源码构建项目,请克隆仓库并使用 `go build` 命令:
```
git clone https://github.com/hambosto/sweetbyte.git
cd sweetbyte
go build .
```
这将在当前目录中创建一个名为 `sweetbyte` 的二进制文件。
### 交叉编译
您还可以为不同平台进行交叉编译:
```
# 构建 Windows 版本
GOOS=windows GOARCH=amd64 go build -o sweetbyte.exe .
# 构建 macOS 版本
GOOS=darwin GOARCH=amd64 go build -o sweetbyte-darwin .
# 构建 Linux (ARM64) 版本
GOOS=linux GOARCH=arm64 go build -o sweetbyte-linux-arm64 .
```
### 运行测试
要运行项目的测试:
```
go test ./...
```
### 使用 Nix (可选)
如果您安装了启用 flakes 的 Nix,您可以使用提供的 flake.nix:
```
# 使用 Nix 构建
nix build
# 进入开发 shell
nix develop
# 使用 Nix 直接运行
nix run
```
## 🏛️ 内部包概览
SweetByte 采用模块化架构构建,每个包负责特定的职责。
| 包 | 描述 |
| ----------------- | ------------------------------------------------------------------------ |
| `cipher` | 实现 AES 和 XChaCha20-Poly1305 加密算法。主要的 `Cipher` 结构体管理 AES-GCM 和 XChaCha20-Poly1305 密码以进行分层加密。`cipher/algorithm` 子包包含使用 Go 的 crypto 包的实际实现,具有正确的 nonce 生成和身份验证加密。 |
| `cli` | 包含使用 Cobra 库的命令行界面逻辑。CLI 包提供了带有各自标志和功能的 `encrypt` 和 `decrypt` 命令,并管理命令行模式的密码提示和文件操作。 |
| `compression` | 处理具有可配置压缩级别的 Zlib 压缩和解压缩(NoCompression、BestSpeed、DefaultCompression、BestCompression)。该包与加密流水线无缝集成,以便在加密前减小文件大小。 |
| `config` | 存储所有应用程序范围的常量和配置参数。这包括应用程序名称、版本、文件扩展名以及文件操作的排除模式。该包还定义了在文件发现操作期间应排除哪些文件。 |
| `derive` | 使用 Argon2id 处理密钥派生和安全盐生成。此包使用推荐参数(Time=3、Memory=64KB、Threads=4)实现了安全的密钥派生函数,并提供了生成加密安全随机字节的。 |
| `encoding` | 管理 Reed-Solomon 纠错编码和解码。此包实现了具有 4 个 data shards 和 10 个 parity shards(总共 14 个)的 Reed-Solomon 前向纠错,以确保数据韧性。`Shards` 子组件处理将数据拆分为分片、合并分片以及从可能损坏的分片中提取数据。 |
| `file` | 提供用于查找、管理和安全删除文件的实用程序。该包包括用于验证文件路径、检查文件存在性、创建目录结构、根据文件类型和排除模式查找符合处理条件的文件以及通过目录遍历处理文件发现的函数。 |
| `header` | 管理安全文件头的序列化、反序列化和验证。这个复杂的包处理具有 Reed-Solomon 保护的多层文件头格式、使用恒定时间比较的 HMAC 身份验证以及各个文件头部分的正确反序列化。它包含 `Serializer` 和 `Deserializer` 组件,用于使用 Reed-Solomon 纠错来 marshal/unmarshal 文件头。 |
| `interactive` | 实现用户友好的交互模式工作流。交互包提供引导式体验,使用 `huh` 库通过美观的提示引导用户完成加密/解密过程,处理文件选择,并以用户友好的方式管理用户偏好。 |
| `types` | 定义整个应用程序中使用的通用类型、枚举和数据结构。此包包括处理模式(encrypt/decrypt)、处理类型(Encryption/Decryption)以及用于并发操作的与任务相关的结构(Task、TaskResult)。 |
| `padding` | 实现具有可配置块大小的 PKCS7 填充。padding 包确保数据被正确填充以满足块密码要求,并提供处理填充和反填充操作的正确 padding/unpadding 函数。 |
| `processor` | 包含主要加密/解密文件操作的高级逻辑。此包协调各个内部包以执行完整的加密或解密工作流,处理文件 I/O、文件头操作和流程管理。它管理从文件打开到完成的整个流水线。 |
| `stream` | 使用工作池管理并发的、基于块的文件处理。stream 包包含用于缓冲(`buffer`)、分块(`chunk`)、并发执行(`concurrent`)和处理(`processing`)的子包。它使用 `runtime.NumCPU()` 个工作池通过适当的并发管理来处理数据在加密流水线中的流式传输。`ChunkReader` 将文件分块读取以进行加密或解密,而 `ChunkWriter` 将处理后的块按顺序写入输出。`SequentialBuffer` 确保块以正确的顺序写入。 |
| `ui` | 提供 UI 组件,如交互式提示、进度条和横幅。UI 包包含使用具有可配置主题的 progressbar 库的进度条(`bar`)子包,使用 lipgloss 在表格中显示文件信息和结果的显示函数(`display`),使用 huh 库用于交互式用户输入的提示(`prompt`),以及用于清屏和打印横幅的终端实用程序(`term`)。 |
| `utils` | 包含各种辅助函数。此包提供了用于带有安全类型转换的字节操作、格式化(包括人类可读的字节格式)以及整个应用程序中使用的通用功能的工具函数。`bytes` 子包包含使用大端序编码将值转换为字节并反向转换的函数。 |
## 🛡️ 安全考量
SweetByte 在设计时高度重视安全性。但是,请注意以下几点:
- **密码强度:** 加密文件的安全性在很大程度上取决于密码的强度。请使用长、复杂且唯一的密码来防御暴力破解攻击。
- **安全环境:** 请在安全的环境中运行 SweetByte。如果您的系统感染了恶意软件,您的密码可能会被盗取,您的加密文件也可能会被解密。
- **源文件删除:** 提供 `--delete-source` 选项是为了方便起见。然而,文件删除是一个复杂的问题,取决于底层硬件和操作系统。虽然 SweetByte 尝试在加密/解密后安全地移除源文件,但它不能保证文件是不可恢复的。
- **侧信道攻击:** 虽然 SweetByte 使用了现代、安全的密码,但它并非对侧信道攻击免疫。这些攻击超出了本工具的防范范围,并且需要物理访问机器。
## 🤝 贡献
欢迎贡献!如果您想做出贡献,请随时 fork 本仓库并提交 pull request。对于重大更改,请先开一个 issue 来讨论您想要更改的内容。
请确保适当地更新测试,并在提交您的贡献之前运行质量检查。
## 📜 许可证
本项目基于 [MIT 许可证](LICENSE) 授权。标签:AES-256, Argon2id, CLI, EVTX分析, Go, Golang, ProjectDiscovery, Reed-Solomon, Ruby工具, SweetByte, WiFi技术, XChaCha20, Zenmap, 加密工具, 加密管道, 多重加密, 安全存储, 安全编程, 密码学, 开源, 手动系统调用, 操作系统检测, 数据保护, 数据完整性, 文件加密, 日志审计, 漏洞评估, 纠错码, 网络安全, 防数据损坏, 隐私保护