tlock进阶技巧:Duration、轮次编号与Armor,6个让时间锁加密更灵活的用法
【免费下载链接】tlockTimelock Encryption made practical. The Go `tlock` library and the `tle` cmd line tool home to encrypt towards the future.项目地址: https://gitcode.com/gh_mirrors/tl/tlock
tlock 是一款将「时间锁加密(Timelock Encryption)」落到实地的 Go 项目,配套的tle命令行工具可以让你把文件加密到未来某个时刻才能解开。本文带你掌握 6 个进阶用法:Duration 时长、轮次编号、强制加密、Armor 编码、环境变量与元数据查询,让时间锁加密更灵活、更可控。
时间锁加密的原理:
tle依赖 drand 阈值随机信标网络,每隔固定频率(默认网络为 3 秒一轮)产生一个不可跳过的轮次签名。只有当网络到达你指定的那一轮时,密钥才能被推导出来——因此「提前解密」在数学上不可能。
一、用 Duration 灵活控制解锁时刻
最常用的是--duration(简写-D)参数,它接受「数字 + 单位」的形式,支持秒、分、时、天、月、年等单位。
# 10 天后才能解密 tle -D 10d -o encrypted_file data.txt # 5 秒后解密(适合测试) tle -D 5s -o encrypted_file data.txt🔍小技巧:单位可以叠加。解析逻辑位于 cmd/tle/commands/encrypt.go 中的parseDurationsAsSeconds函数,它会把多个「数字+单位」组合累加,例如-D 1d12h表示 1 天 12 小时后解锁。但注意:
- 同一单位不能重复出现(如
1d2d会报错) - drand 网络最短精度是「秒」,更小的时间没有意义
- 时间会换算成未来的目标轮次号,源码通过
network.RoundNumber(decryptionTime)完成映射
解密时只需指定文件:
tle -d -o decrypted.txt encrypted_file二、用轮次编号(Round)精确指定解锁点
如果你已经知道(或提前算好)drand 网络的目标轮次号,可以用--round(简写-r)直接指定,跳过时长换算:
tle -r 123456 -o encrypted_file data.txt⚠️ 两个注意点:
- Round 和 Duration 互斥,二者只能选其一,同时传入会被 cmd/tle/commands/commands.go 中的
validateFlags拒绝 - 默认不允许加密到过去的轮次——如果指定的轮次号小于当前网络轮次,会报
round xxx is in the past错误
加密时会把轮次号写入密文(age stanza 参数中,见 tlock_age.go 的Wrap方法),解密程序会先检查当前轮次是否已达到该值,未达标则返回too early to decrypt。
三、用 force 强制加密到过去的轮次
有时你可能只是想测试、或者需要向一个历史轮次加密(比如复现旧数据)。加上--force(简写-f)即可跳过「轮次不能在过去」的检查:
tle -f -r 100 -o old_test.txt data.txt实现上很简单:flags.Force为 true 时,encrypt 流程会跳过对lastestAvailableRound的比较,直接调用tlock.Encrypt(dst, src, flags.Round)。
💡 由于目标轮次的签名早已存在,这样加密出来的文件可以立刻解密,非常适合本地调试。
四、用 Armor 输出 PEM 文本格式
默认加密产物是二进制文件,不方便查看或粘贴。加上--armor(简写-a)后,tle会把密文包装成 PEM 文本(age armor 格式):
tle -a -D 20s -o encrypted_data.PEM data.txt生成的文件可以用文本编辑器直接打开,内容形如带-----BEGIN AGE ENCRYPTED FILE-----头尾的标准 PEM 块。
✨ 优点:
- 方便在邮件、工单、代码仓库中直接粘贴分享
- 与 age 生态的文本密文保持一致的风格
- 解密时不需要再加
-a,解密逻辑会自动嗅探头部(见 tlock.go 中Decrypt对armor.Header的判断),两种格式通吃
五、用 TLE_ 环境变量省掉重复输入
tle的所有命令行参数都可以通过环境变量预先配置,统一使用TLE_前缀(实现见 cmd/tle/commands/commands.go 中基于envconfig的Parse函数),命令行参数会覆盖环境变量:
export TLE_NETWORK="https://api.drand.sh/" export TLE_CHAIN="52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" export TLE_ENCRYPT="true" # 之后只需给出时长和文件 tle -D 30d secret.txt -o secret.tle对应关系一览:
| 环境变量 | 对应参数 | 说明 |
|---|---|---|
TLE_NETWORK | -n | drand 网络端点 |
TLE_CHAIN | -c | 链哈希(chainhash) |
TLE_DURATION | -D | 加密时长 |
TLE_ROUND | -r | 目标轮次号 |
TLE_FORCE | -f | 允许过去轮次 |
TLE_OUTPUT | -o | 输出文件 |
TLE_ARMOR | -a | PEM 编码 |
这套机制特别适合 CI 脚本或固定测试网场景:一次配置,处处复用。
六、用 metadata 一键查看网络状态
加密前先确认目标网络是否在线、当前轮次走到哪了,能帮你提前换算「现在加密,D 多久合适」:
tle -m该命令会以 YAML 格式输出四个关键字段(实现见 tlock.go 中的Metadata方法):
chain_hash:当前使用的链哈希current:网络当前轮次号(配合 3 秒一轮的频率,可以反推未来任一时刻的轮次)public_key:网络公钥,校验身份用scheme:密码学方案名称
⚡ 提示:查看不同网络的状态时,记得带上-n和-c切换端点与链哈希。
常见组合速查
| 需求 | 命令 |
|---|---|
| 最快测试(5 秒解锁) | tle -D 5s -o out data.txt |
| 长期封存 + 文本格式 | tle -a -D 1y -o out.PEM data.txt |
| 指定轮次 + 允许过去 | tle -f -r 42 -o out data.txt |
| 解密并输出到文件 | tle -d -o plain.txt out |
| 管道组合(配合 age 口令) | cat data.txt \| age -p \| tle -D 30s -o out |
自 v1.3.0 起,解密时还支持自动探测链哈希:如果密文携带的 chainhash 与当前默认值不同,tle会自动切换并给出警告(见 tlock_age.go 中Unwrap的SwitchChainHash逻辑),跨网络解密体验更顺滑。
小结
掌握这 6 个技巧,tle就不再只是「加密 + 等待」的简单工具:
- Duration:秒到年自由组合,还能叠加单位
- Round:直接锁定轮次,精确到每一签
- force:放行历史轮次,调试利器
- Armor:PEM 文本输出,分享更方便
- TLE_ 环境变量:脚本化配置,一次生效
- metadata:网络状态一目了然
时间锁加密的价值在于「不可提前解密」的确定性,而 tlock 的灵活参数让你可以把这份确定性精确地编排进任何工作流。动手试试吧!
【免费下载链接】tlockTimelock Encryption made practical. The Go `tlock` library and the `tle` cmd line tool home to encrypt towards the future.项目地址: https://gitcode.com/gh_mirrors/tl/tlock
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考