5个版本

0.2.0 2020年1月16日
0.1.4 2020年1月15日
0.1.2 2019年10月20日
0.1.1 2019年9月25日
0.1.0 2019年9月23日

#1977密码学


用于 coconut_sig

Apache-2.0

91KB
1.5K SLoC

David Pointcheval 和 Olivier Sanders 的可随机化签名。

来自CT-RSA 2016论文《Short Randomizable signatures》,该论文使用了交互式假设

签名和签名知识的证明

实现了论文中第4.2节和第6.1节描述的2种变体。第6.1节中的方案被提出以使盲签名更有效,尽管也有方法使用第4.2节来实现盲签名,但它们相对效率较低。其中一种方法在Coconut中进行了描述。

第4.2节的签名方案不允许直接进行盲签名,而论文中也没有描述任何实现此目的的技术。但可以使用Coconut或其他方案中的较不高效的方案。方案按照论文中的描述实现。

此代码位于signature.rs、blind_signature.rs和pok_sig.rs中。使用keys::keygen生成密钥。

论文第6.1节中的签名方案允许对盲消息进行签名。由测试test_signature_blinded_messages演示。
实现了论文第6.2节中的签名知识的证明。由测试test_PoK_sig演示。
除了证明知识之外,用户还可以在不透露所有消息或签名的情况下,透露签名下的一些消息。由测试test_PoK_sig_reveal_messages演示。
一个更全面的测试,其中用户在混合消息上获得签名,其中一些已知而其他则被提交,然后对带有选择性透露一些消息的签名进行证明知识。由测试test_scenario_1演示。第6.1节中的方案实现了2个变体,其中一个是按照论文实现的。
但另一个变体进行了某些修改。公钥被分成两部分,波浪线元素(X_tilde 和 Y_tilde)和非波浪线元素(X,Y)。现在验证者只需要前者(波浪线元素),因此验证者的存储需求降低了。密钥生成和签名进行了修改。

  • 密钥生成:不是只保留X作为密钥,签名人还保留x、y_1、y_2、..y_r作为密钥。公钥保持不变,即(g, Y_1, Y_2,..., Y_tilde_1, Y_tilde_2, ...)
  • 签名:假设签名人想要对一个包含10条消息的多消息进行签名,其中只有1条消息是盲签的。如果我们按照论文中的方法进行,其中签名人没有y_1、y_2、.. y_10,签名人将选择一个随机的u,并计算签名(g^u, (XC)^u.Y_2^{m_2*u}.Y_3^{m_3*u}...Y_10^{m_10*u}),Y_1被省略,因为第一条消息是盲签的。当然,(XC)^u.Y_2^{m_2*u}.Y_3^{m_3*u}...Y_10^{m_10*u}可以使用有效的多指数运算技术进行计算,但如果签名人能够计算(g^u, C^u.g^{(x+y_2.m_2+y_3.m_3+...y_10.m_10).u})将更高效。得到的签名将具有相同的形式,并且可以像论文中描述的那样进行解盲。
    这将使签名人密钥的存储稍微多一点,但会使签名更加高效,特别是在签名中只有少数消息是盲签的,而大多数消息是签名人所知道的情况下,这在匿名凭证中通常是情况,其中用户的密钥在签名中被盲签(对签名人来说不知道)在签名中。这种变化使得签名速度大大提高,除非未盲签消息的数量与盲签消息的数量相比非常小。运行测试timing_comparison_for_both_blind_signature_schemes以查看差异

多签名

可以使用与BLS签名相同的原则聚合多个PS签名,因为秘密位于指数中,就像BLS签名一样。签名通过相乘来聚合,就像BLS签名一样,验证密钥可以通过将相应的部分相乘来聚合。然而,签名人应该使用相同的Params,并在签名时使用new_deterministic创建确定性签名,该签名将消息散列以创建群生成器。查看测试test_multi_signature_all_known_messages

来自2018年CT-RSA论文重新评估可随机化签名的安全性,该论文使用非交互式假设

此代码位于signature_2018.rs和pok_sig_2018.rs中。对于生成密钥,请使用keygen_2018。对于多签名,请使用方法from_sigs_2018verify_2018。由于签名(已知)和签名知识证明的大多数协议与CT-RSA 2016论文相同,因此有很多代码复用。目前没有使用此新方案实现盲签名,但可以通过使用Coconut的想法来实现,其中使用Elgamal加密分别对承诺属性进行承诺。

实现细节

可以通过编译带有特性SignatureG2SignatureG1来交换公钥(*_tilde)和签名的组。这些特性是互斥的。默认特性是SignatureG2,这意味着签名在组G2中,这会使签名速度较慢,但证明签名知识的速度更快。

要运行带有签名在组G1中的测试。签名知识的证明将涉及组G2中的多指数运算。

cargo test --release --no-default-features --features SignatureG1

要运行带有签名在组G2中的测试。签名知识的证明将涉及组G1中的多指数运算。

cargo test --release --no-default-features --features SignatureG2

要基准测试,运行以timing为前缀的测试,并将打印出各种操作所需的时间。

cargo test --release --no-default-features --features SignatureG2 timing -- --nocapture

cargo test --release --no-default-features --features SignatureG1 timing -- --nocapture

依赖项

~5.5MB
~99K SLoC