2 个版本

0.1.1 2024年7月3日
0.1.0 2024年5月22日

#1125 in 加密学

BSD-3-Clause

190KB
3K SLoC

Triptych

Triptych 零知识证明系统的 Rust 实验性实现。

概述

Triptych 是一种零知识证明系统,旨在作为可链接环签名使用。这种结构允许签名者针对任意验证密钥集签署消息。成功验证签名意味着签名者知道与某个验证密钥相对应的签名密钥,但不会透露是哪一个。它还会生成一个链接标签;如果任何两个已验证签名具有相同的链接标签,则它们是使用相同的签名密钥生成的。但是,无法确定与链接标签相关联的签名密钥,也无法确定相应的验证密钥。

Triptych 证明具有很好的扩展性,其大小仅以对数方式随验证密钥集的大小增加。共享相同验证密钥集的证明也可以批量高效验证以节省时间。

更正式地,设 GU 为 Ristretto 群的固定独立生成元。设 N = n**m,其中 n, m > 1 是固定参数。Triptych 证明系统协议是以下关系的 sigma 协议,其中 M 是一个包含群元素的 N 向量

{M,J; (l,r) :M[l] =r*G,r*J=U}

可以使用 Fiat-Shamir 变换来生成一个可以绑定任意消息到会话的非交互式协议。这产生了可链接环签名。

此库还支持并行证明功能。

实现说明

此实现做出了几个有见地的选择

  • 它使用 Ristretto 进行群运算。
  • 它使用 Merlin 进行 Fiat-Shamir 会话操作。
  • 它使用 BLAKE3 进行其他加密哈希运算。

实现尽量减少依赖,并且对 no_std 友好。

默认启用了几个功能

  • rand:增加额外的证明功能,提供加密安全的随机数生成器
  • serde:通过serde添加证明序列化和反序列化
  • std:添加相应的依赖功能

底层曲线库根据CPU功能检测选择算术后端。使用夜间编译器可以扩展后端集,并可能提供更好的性能。您可以使用基准测试来检查性能:要么使用cargo bench,要么使用cargo +nightly bench

证明支持一个自定义的序列化格式,旨在高效且规范。此功能有一个关联的fuzzer,可以使用夜间编译器运行:cargo +nightly fuzz run proofs

警告

虽然这个实现是考虑到安全的,但目前它是实验性的,不适合生产使用。

依赖项

~4.5–6.5MB
~143K SLoC