1 个不稳定版本
0.5.2 | 2022年12月23日 |
---|
#7 in #quadratic
7.5MB
226K SLoC
类别
Rust 库,用于构建 IQC:基于虚二次序类群(Cl)的密码学。
背景
Cls 容易生成。它们最有趣和有用的性质是寻找群阶被认为是困难的。近年来,我们看到越来越多的基于 Cls 的密码学原语。我们建议阅读 [6,7,8] 以了解更多关于 Cls 的实际应用。
群元素表示
群元素可以表示为 (a,b,c) 或 (a,b,Δ) 三元组(分别对应 BinaryQF 和 ABDeltaTriple 结构)。我们还支持从 论文 中压缩(请参阅 BinaryQFCompressed 结构)。
原语
欢迎为实现新原语或改进现有原语做出贡献。请首先查看开放问题。现有原语可以在 primitives 文件夹中找到。
-
PoE:指数证明:证明者可以有效地让验证者相信进行了正确的较大指数运算。声明是
(x,u,w)
,如果w = u^x
,则验证者接受。 -
多项式承诺:实现了以下算法([1] 第4.2节和4.3节)
Setup
:生成公共参数Commit
:将多项式提交Open
:打开和验证提交Encode
:将多项式编码为整数的独立代码Decode
:将整数转换为唯一的多项式Eval_prover
:对于提交的多项式f()
,证明y = f(z)
的 NI 证明Eval_verify
:eval_proof 的 NI 验证者
-
VDF:可验证延迟函数。基于 Wesolowski 协议 [4,5]。实现了以下接口。相同的设置可以用于多个证明。
time(Eval) >> time(Verify)
Setup
:生成公钥Eval
:使用公钥生成一个vdf语句(y,pi)
Verify
:使用公钥验证语句
-
加密方案:线性同态加密方案和ZK证明。接口包括:
Keygen
、Encrypt
、Decrypt
、Prove
、Verify
。加密方案取自[2]定理2。零知识证明是非交互式证明,取自[3]图8。证明语句包括一个公共椭圆曲线点Q = xG
并证明给定的密文加密了x
。ZK证明还有一个实验性变体。这个构造在2P-ECDSA中使用。为了使证明更高效,我们使用了LCM技巧。参见dl_cl_lcm.rs
。
构建
使用 Cargo build
。
PARI构建
库使用对PARI C库的绑定。第一次运行 Cargo build
将从 depend 文件夹中获取PARI并安装在机器上。它已在MacOS和Linux上进行了测试。如果您在安装PARI时遇到问题,请提交问题并尝试手动安装。绑定将自动生成,这可能会使构建过程慢几秒。
测试
如果可能,Rust中的测试是多线程的。然而,PARI配置支持单线程。因此,为了确保所有测试都以定义良好的行为运行,请使用 cargo test -- --test-threads=1
。
使用方法
我们使用测试来演示每个原语的正确性:每个原语的 .rs
文件末尾都有一个测试,用于显示原语的正确用法。通常有一个或多个测试来显示实现的正确性,即不知道证据将导致PoK失败。对于所有测试,我们假设128位安全性(保守地转换为1600位判别式)。
安全性
原语之间的安全性假设可能不同,并在相关论文中讨论。在使用任何原语之前应充分理解。代码未经审计,我们没有尝试将其改为恒等时间。不要在生产系统中使用此库。
联系
请随时联系或加入ZenGo X Telegram 讨论代码和研究。
名人堂
我们感谢Fabien Laguillaumie、Guilhem Castagnos、Ida Tucker、Claudio Orlandi和Ben Fisch的支持和持续帮助。我们感谢CoBloX研究实验室和Lloyd Fournier的贡献代码,使这个库更安全、更快速。
参考文献
[1] https://eprint.iacr.org/2019/1229.pdf
[2] https://eprint.iacr.org/2018/791.pdf
[3] https://eprint.iacr.org/2019/503.pdf
[4] https://eprint.iacr.org/2018/623.pdf
[5] https://eprint.iacr.org/2018/712.pdf
[6] 书籍:二元二次型:一种算法方法
[7] https://www.michaelstraka.com/posts/classgroups
[8] https://github.com/Chia-Network/vdf-competition/blob/master/classgroups.pdf
依赖关系
~19MB
~286K SLoC