
tird & tirdFStird /tɪrd/ (“this is random data” 的缩写) 是一种文件加密工具,它最小化元数据并隐藏加密数据。
使用 tird,你可以:
tirdFS)。与 VeraCrypt 和 Shufflecake 不同,tirdFS 容器不包含头部;用户指定容器内数据的位置,并负责保持这些位置相互分离。文件或块设备中任何看起来随机的区域都可以用作容器。tird 提供内置的可否认性,即使在容器外部存储加密文件时也是如此。它还帮助抵御胁迫下的密钥泄露攻击(橡胶软管密码分析、xkcd 538)。
[!WARNING] 在使用
tird之前,请阅读“警告”一节。安全性不仅取决于工具,还取决于你的行为:安全的密钥存储、在安全环境中操作,以及避免使用真实数据进入调试模式。
格式稳定化和正式规范计划在 v1.0.0 中实现。
你无需记住命令行选项即可使用 tird。该工具采用基于提示符的 CLI:只需启动它,选择一个菜单选项,然后回答随后出现的问题即可。```
$ tird
MENU
———————————————————————————————————————————
0. Exit 1. Info & Warnings
2. Encrypt 3. Decrypt
4. Embed 5. Extract
6. Encrypt & Embed 7. Extract & Decrypt
8. Create w/ Random 9. Overwrite w/ Random
———————————————————————————————————————————
A0. SELECT AN OPTION [0-9]:
## 输入选项
共有 4 组输入选项:A (动作), D (数据), K (密钥), P (继续)。为便于描述,对它们进行了编号。```
+——————————————————————+————————————————————————+
| A0. SELECT AN OPTION | A. Select an action |
+——————————————————————+————————————————————————+
| D1. INPUT FILE PATH | |
| D2. COMMENTS | D. Enter data, |
| D3. OUTPUT FILE PATH | data location, |
| D4. OUTPUT FILE SIZE | data size |
| D5. START POSITION | |
| D6. END POSITION | |
+——————————————————————+————————————————————————+
| K1. KEYFILE PATH | K. Enter values |
| K2. PASSPHRASE | related to |
| K3. TIME COST | key derivation |
+——————————————————————+————————————————————————+
| P0. PROCEED? | P. Confirm to continue |
+——————————————————————+————————————————————————+
A detailed description of these options with examples can be found here.
在创建 cryptoblob 期间将被加密的载荷由以下部分组成:
在 UI 中指定载荷的方式如下:``` D1. FILE TO ENCRYPT (OPT): files.zip I: path: 'files.zip'; size: 2,824,230,648 B (2.6 GiB) D2. COMMENTS (DEFAULT='files.zip'): The X-Files, zip (секретные материалы) I: comments will be shown as ['The X-Files, zip (секретные материалы)']
## 输入密钥材料
`tird` 提供使用密钥文件内容和口令来派生一次性密钥的选项。
- **密钥文件(可选):** 零个、一个或多个密钥文件路径;输入顺序无关紧要。密钥文件路径可以是:
- 一个<ins>常规文件</ins>。密钥文件的内容将被哈希,其摘要将用于进一步的密钥拉伸和密钥派生。
- 一个<ins>块设备</ins>。与常规密钥文件处理方式相同:内容将被哈希。
- 一个<ins>目录</ins>。目录中的所有文件将被哈希并用作密钥文件。
- **口令(可选):** 经过 Unicode [规范化](https://www.unicode.org/reports/tr15/)(格式 C)后最多 2048 字节;可以省略。
在用户界面中指定 IKM 的方式如下:```
K1. KEYFILE PATH (OPT): key
I: path: 'key'; size: 32 B
I: reading and hashing contents of 'key'
I: keyfile accepted
K1. KEYFILE PATH (OPT):
K2. PASSPHRASE (OPT):
K2. CONFIRM PASSPHRASE:
I: passphrase accepted
有关更多详细信息,请参阅规范。
虽然加密消息的内容受到保护,但其大小、来源、目的地……却没有。数据被隐藏,元数据却被展示。有时,你的敌人仅凭这些就能揭开你的秘密。
我们基于元数据杀人。
![]() 对比 ![]() |
|---|
tirdFS — 用户驱动的隐写文件系统tird 采用了一种技术,其描述如下:
在加密数据或随机数据中隐藏数据。要隐藏的消息先被加密,然后用于覆盖更大的加密数据块或随机数据块的一部分(像一次性密码本这样不可破解的密码体制,在没有私钥的情况下生成的密文看起来完全随机)。
你可以加密文件,并将 cryptoblob 嵌入到容器中的任意起始位置。写入 cryptoblob 后,你需要记住它在容器中的位置(起始和结束位置),后续将用于提取 cryptoblob。通过这种方式,你可以在容器内创建 tirdFS — 隐藏的、无头部的、用户驱动的文件系统:
tirdFS 不是一个具有内部元数据结构的挂载文件系统。它是一个由独立放置的 cryptoblob 构建的用户管理的隐藏存储模型。
任何大于最小 cryptoblob 大小(1160 B)的文件、磁盘或分区都可以作为有效容器。cryptoblob 可以被嵌入到任何区域。
有效容器的示例包括:
容器结构示例:``` +—————————+—————————————+ <— Position 0 of the container | | | | | Random data | | | | | +—————————————+ <— Cryptoblob1 start position | Header- | | | less | Cryptoblob1 | | | | | Layer +—————————————+ <— Cryptoblob1 end position | | Random data | | Cake +—————————————+ <— Cryptoblob2 start position | | | | | Cryptoblob2 | | | | | +—————————————+ <— Cryptoblob2 end position | | Random data | +—————————+—————————————+
**用户管理的头部**
独立的用户管理的 `tirdFS` 文本头部可能如下所示:```
[100000000:100345765] secret_video.mp4
[100345765:234765345] various_secrets.zip
[12654876456:14765345098] Epstein_files_part1.zip
That is, it should typically contain the location of each cryptoblob in the container plus a brief comment. However, the user is free to determine how to store positions and what to include in such a header.
下图直观地展示了区分一个随机数据条目与另一个随机数据条目有多么困难,以及将 cryptoblob 嵌入容器的过程。
具有随机数据的空容器:

容器中嵌入一个 cryptoblob:

容器中嵌入两个 cryptoblob:

容器中嵌入三个 cryptoblob:

动画:嵌入可视化:

到处携带。这是你的权利。
请看下面的截图。
看起来这个 16 GB 卷中只包含一个 8.7 MiB 的文件。真的是这样吗?也许是的,也许不是。
文件系统告诉我们这里只有一个文件。但卷上真的只有一个文件吗?我们无法通过文件系统来确定这一点。事实上,数据可能位于文件系统之外,并且文件系统工具无法检测到。标记为空闲的 15.2 GiB 空间可能被一个隐藏的文件系统占用。这些“空闲”空间可能被隐藏的加密数据占用。
我们能否反驳这些数据的存在?可以,例如通过使用 binwalk 检查该空闲空间的熵水平。低熵表明可能不存在隐藏数据。高熵 本身 并 不 能证明存在加密的隐藏数据。高熵区域既可能只是残余数据,也可能是隐藏的加密数据。
如果你有兴趣在可见文件系统之外隐藏数据,那么 tird 随时为你服务,为你的文件提供隐形斗篷。
时间锁加密(TLE)可用于防止攻击者在 IKM 泄露(例如在用户遭到胁迫的情况下)时快速访问明文。在我们的实现中,它实际上是一种基于 PoW 的时间锁密钥派生。“Time cost”输入选项指定 Argon2 的迭代次数。如果你指定足够高的迭代次数,执行它们将花费大量时间。然而,攻击者在类似的硬件上也需要相同的时间。Argon2 的执行无法通过并行化加速,因此预计攻击者所花费的时间与防御者所花费的时间大致相同。
设置所需的 TIME COST 值:```
K3. TIME COST (DEFAULT=4): 1000000
I: time cost: 1,000,000
W: decryption will require the same "TIME COST" value!
**可信的 TLE:** 攻击者不知道时间成本的实际值,因此你可以合理地少报迭代轮数。在攻击者尝试使用指定的时间成本值解密密文数据块之前,他们无法反驳你的说法。
## 命令行选项
`tird` 在正常使用中不需要任何命令行选项。```
$ tird --help
tird v0.30.0
A tool for encrypting files and hiding encrypted data.
Homepage: https://github.com/hakavlad/tird
Usage:
tird [--unsafe-debug] [--unsafe-decrypt]
Start without options for normal usage.
Options:
--help print this help message and exit
--unsafe-debug enable unsafe debug mode
--unsafe-decrypt release plaintext even if MAC verification
failed (dangerous)
Examples:
$ tird
$ tird --unsafe-debug
[!WARNING] 调试模式不适用于生产环境!
使用 --unsafe-debug 选项启动 tird,可以在程序运行时查看其内部运作情况。
启用调试模式还会显示:
[!WARNING] 在此模式下,返回的明文可能已被攻击者修改或替换!
在不安全的解密模式下,即使身份验证失败,tird 也会释放明文。仅当您优先考虑可用性而非完整性,且无法在正常模式下成功解密加密数据块时,才使用此模式。
tird 不支持:
tird 不提供:
tird 无法在一次操作中处理(加密/嵌入)多个文件。不支持对目录和多个文件进行加密。tird 不会清理文件系统元数据(atime、mtime、ctime)。tird 的加密速度不是很高(在现代化硬件上的测试中最高可达 730 MiB/s)。加密可以提供帮助,但它无法让您免受误用、漏洞、社会工程攻击或物理威胁的侵害。
tird 尚未经过人类独立的安全审计。tird 在受破坏的环境中无效;在这种情况下执行可能会导致灾难性的数据泄露。tird 可能无法有效发挥作用。tird 在使用后不会从内存中清除其敏感数据;程序退出后,密钥可能会残留在内存中。tird 不会以常数时间对密钥文件和口令的摘要进行排序。tird 保护的是数据而非用户;如果您受到怀疑,它无法防止酷刑。HKDF 和快速的 ChaCha20 实现)Argon2 和 BLAKE2 的快速实现)改进文档。
欢迎在讨论板块提问、留下反馈或提出批评意见。