#encryption #encryption-decryption #snark #verifiable #data #groth16 #elgamal

无需std saver

SAVER SNARK友好、加法同态和可验证加密解密及重随机化

15次重大发布

0.18.0 2024年7月18日
0.16.0 2024年5月10日
0.15.0 2024年3月4日
0.14.0 2023年10月2日
0.3.0 2022年5月27日

#803密码学

Download history 3/week @ 2024-04-21 112/week @ 2024-05-05 22/week @ 2024-05-12 9/week @ 2024-05-19 5/week @ 2024-05-26 2/week @ 2024-06-02 131/week @ 2024-06-16 23/week @ 2024-06-23 116/week @ 2024-07-14 6/week @ 2024-07-21 106/week @ 2024-07-28 1/week @ 2024-08-04

每月229次下载
用于 2 个crate(通过 proof_system

Apache-2.0

660KB
15K SLoC

saver

使用SAVER进行可验证加密

基于SAVER实现。实现了

可验证加密构造的基本思想是将要加密的消息(一个域元素)分成几个小段,例如b位,并用Elgamal加密的指数变体加密每个段。解密时,在扩展域(F_{q^k})中的离散对数问题通过穷举法解决,其中离散对数的位数最多为b位,因此需要进行最多2^b - 1次迭代。使用SNARK(Groth16)来证明每个段最多为b位,因此是一个范围证明。

加密除了密文外还输出一个承诺。对于消息m的加密,承诺psi的形式如下

psi = m_1*Y_1 + m_2*Y_2 + ... + m_n*Y_n + r*P_2

m_i 是原始消息 m 的位分解,满足以下条件:m_1*{b^{n-1}} + m_2*{b^{n-2}} + ... + m_n(大端序)其中 bm 分解的基数,r 是承诺的随机性。例如,如果 m = 325 并且 m 在 4 位块中分解,b 为 16(2^4),分解为 [1, 4, 5],如下所示:325 = 1 * 16^2 + 4 * 16^1 + 5 * 16^0

从分解的承诺获取完整消息的承诺。

要使用 Schnorr 协议比较承诺消息的等价性,必须将承诺转换为对完整(非分解)消息的承诺。这通过 ChunkedCommitment 实现,其文档描述了此过程。

与 BBS+ 签名一起使用

参见 tests.rs 文件

许可证:Apache-2.0

依赖关系

~7–19MB
~213K SLoC