ruddro-roy/sindook
GitHub: ruddro-roy/sindook
sindook 是一款基于 X-Wing(X25519 + ML-KEM-768)的后量子文件加密工具,支持密钥轮换和多接收者封装,确保密文即使被未来量子计算机截获也无法解密。
Stars: 0 | Forks: 0
# sindook
[](https://github.com/ruddro-roy/sindook/actions/workflows/ci.yml)
[](https://scorecard.dev/viewer/?uri=github.com/ruddro-roy/sindook)
[](https://pkg.go.dev/github.com/ruddro-roy/sindook/xwing)
内置密钥轮换的后量子文件加密工具。Sindook 在孟加拉语中意为保险箱。
sindook 会对文件进行加密封装,这样即使对手今天记录了密文,日后也无法使用量子计算机将其解密。密钥建立使用 X-Wing,这是一种将 X25519 与 ML-KEM-768 (NIST FIPS 203) 相结合的混合 KEM,基于 draft-connolly-cfrg-xwing-kem-10 实现,并已与该草案公布的测试向量进行了逐字节的验证。要破解已封装的文件,必须同时攻破这两个组件。
它的独特之处在于密码敏捷性:已封装的文件带有密钥槽(采用 LUKS 模型),而 `rewrap` 仅通过重写文件头,即可针对任意大小的数据轮换接收者、密码、格式,乃至未来的算法。在此过程中,有效载荷字节原封不动,明文也绝不会出现在任何地方。这正是每一次后量子迁移都需要、而大多数文件加密工具无法做到的操作。
## 安装
```
go install github.com/ruddro-roy/sindook/cmd/sindook@latest
```
要求 Go 1.26 或更高版本。包含的 Dockerfile 会构建一个容器镜像(基于 distroless,体积不到 10 MB)。
适用于 Linux、macOS 和 Windows 的发布二进制文件包含 SBOM、cosign 无密钥签名以及 SLSA 构建来源证明。使用前请先进行验证:
```
cosign verify-blob checksums.txt --bundle checksums.txt.sigstore.json \
--certificate-identity-regexp 'github.com/ruddro-roy/sindook' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
gh attestation verify sindook_*.tar.gz --owner ruddro-roy
```
稳定性保证,包括已封装的文件将永远可被打开的承诺:[docs/COMPATIBILITY.md](docs/COMPATIBILITY.md)。
## 使用
生成身份:
```
sindook keygen -o my.key
# 写入 my.key (secret, 0600) 和 my.key.pub (shareable)
```
封装给一个或多个接收者(可选附带恢复密码),并打开:
```
sindook seal -r my.key.pub report.pdf
sindook seal -r alice.pub -r bob.pub -p budget.xlsx
sindook open -i my.key report.pdf.sindook
```
仅使用密码:
```
sindook seal -p notes.txt
sindook open -p notes.txt.sindook
```
原地轮换访问权限。快速模式仅重写头部,因此无论是 KB 还是 TB 的数据,其开销都是一样的:
```
# 替换 key slots:alice 保留,bob 被添加
sindook rewrap -i my.key -r alice.pub -r bob.pub archive.tar.sindook
# 有人离开且必须彻底失去访问权限:也要重新加密 payload
sindook rewrap -i my.key -r alice.pub -deep archive.tar.sindook
```
快速 rewrap 也会将 v1 文件就地升级为当前格式。如果不加 `-deep` 仅移除某个密钥槽,并不能追溯撤销那些保留了旧文件副本的人的访问权限;docs/SECURITY.md 详细说明了每种模式提供的具体保证。
支持流处理,每个命令都可以接收多个文件,`-R` 可读取接收者列表(直接拼接的 .pub 文件即可使用):
```
tar cz src | sindook seal -r my.key.pub -o src.tgz.sindook
sindook rewrap -i old.key -R team.keys backups/*.sindook
```
Armor(装甲)模式生成的 ASCII 能够在电子邮件和复制粘贴中幸存;open 会自动检测它:
```
sindook seal -r alice.pub -a -o - secret.txt | pbcopy
```
证明备份仍然可以被打开,且无需在任何地方写入明文;此外,无需任何凭据即可读取已封装文件的元数据:
```
sindook verify -i my.key backups/*.sindook
sindook inspect -json archive.tar.sindook
```
对于脚本编写,`-passfile` 可替代交互式提示。`keygen -p` 会将身份文件本身置于密码保护之下进行封装,因此仅靠被盗的密钥文件什么也打不开。`sindook completion bash|zsh|fish` 会打印 Shell 自动补全脚本,而 `sindook help ` 会显示参数标志和示例。
## 设计
每一个加密原语均来自 Go 标准库或 golang.org/x/crypto:ML-KEM-768 (crypto/mlkem)、X25519 (crypto/ecdh)、SHA-3 和 SHAKE-256 (crypto/sha3)、ChaCha20-Poly1305、HKDF-SHA-256、HMAC、Argon2id。本项目没有自行实现任何原语,也没有发明任何协议:密钥槽模型借鉴自 LUKS,头部 MAC 和分块有效载荷借鉴自 age,而 KEM 则遵循 IETF 草案。
这里唯一的规范级密码学实现是 X-Wing 密钥扩展与组合器(约 60 行代码),它会在每次 CI 运行时根据草案的附录 C 向量进行验证。它可以作为 `github.com/ruddro-roy/sindook/xwing` 被单独导入;X-Wing 目前仍处于 Internet-Draft 阶段,因此在该 RFC 正式发布前,请将该 API 视为草案阶段稳定(draft-stable)。
每个文件都有一个随机文件密钥,该密钥在每个槽中被包装一次,每次包装都与文件及该槽自身的 KDF 参数作为关联数据绑定,整个头部由一个 MAC 封装,且只有持有文件密钥的人才能计算出该 MAC。密钥槽采用长度前缀格式,因此未来推出的新槽类型(新算法)不会破坏旧版读取器的兼容性。有效载荷以 64 KiB 大小的 ChaCha20-Poly1305 数据块进行封装,并将块计数器和最终块标志绑定到 nonce 中,因此截断、重排和扩展操作都会导致身份验证失败。密码槽使用带有 RFC 9106 参数的 Argon2id,并在读取时设置了上限,以防恶意文件要求无限制的计算开销。
字节级布局:[docs/FORMAT.md](docs/FORMAT.md)。威胁模型与轮换语义:[docs/SECURITY.md](docs/SECURITY.md)。
## 验证
```
go test ./...
```
会运行 draft-10 的密钥生成、去随机化封装与解封向量、数据块边界处的往返测试、多接收者与混合槽情况、必须永远保持可读的 v1 黄金固定测试文件、rewrap 有效载荷保留与撤销检查,以及涵盖位翻转、截断、扩展、槽剥离、错误密钥和恶意头部的篡改测试套件。CI 还会加入 -race、vet、gofmt 和 govulncheck。该测试套件在纯净的 golang:1.26 容器中同样能通过测试。
`interop` 模块在每次 CI 运行时,会将此 X-Wing 实现与 Cloudflare 的 CIRCL 以及 filippo.io/mlkem768/xwing 进行交叉测试:在各实现间验证草案向量、种子对种子的密钥协商,以及轮流在每一侧进行封装与解封的共享密钥协商。
## 路线图
- 用于封装文件来源证明的 ML-DSA 签名
- 引入 OPAQUE,使密码无需发送即可完成身份验证
- 基于硬件的身份支持(passkey PRF、FIDO2 hmac-secret)
## 非目标
不自制原语,不发明协议。只要存在经过充分审计的成熟结构,sindook 就会直接使用它。
## 许可证
Apache-2.0
标签:EVTX分析, Go, Ruby工具, X-Wing, 后量子加密, 密码学, 密钥轮换, 手动系统调用, 文件加密, 日志审计, 请求拦截