25个稳定版本
2.5.7 | 2024年3月26日 |
---|---|
2.5.4 | 2024年2月22日 |
2.5.0 | 2023年12月22日 |
2.4.2 | 2023年11月20日 |
1.2.0 | 2023年3月30日 |
#107 在 加密学
1,703 每月下载量
用于 3 crates
660KB
4K SLoC
BLS签名方案
blissful包提供了一套生产就绪的BLS签名实现。
安全注意事项
此包已通过Kudelski Security的安全审计,未发现任何重大问题。审计报告可在此处找到。我们感谢LIT Protocol赞助此审计。
除非明确指出,否则所有操作都是常量时间。
文档
BLS签名提供了已知最小的签名大小,以及其他好处,如一轮阈值签名和签名聚合。
BLS签名依赖于对偶友好曲线,该曲线有两个点字段。此库为这两个字段提供了密钥和签名。
例如,大多数签名发生在G1群中,需要G2中的公钥,因此它们被简单地命名为Signature
和PublicKey
。变体类型交换了字段,因此命名为SignatureVt
和PublicKeyVt
。签名知识证明支持使用Signatures
上的proof_of_knowledge
方法,允许签名持有者证明对签名的知识,而不泄露它。签名的消息仍然公开。鉴于这主要用于签名,它不会直接提供多签名或聚合签名的功能。
此库支持以PartialSignature
的形式的阈值签名,该签名由SecretKeyShare
生成,而不是由SecretKey
生成。在阈值足够的情况下,PartialSignature
可以组合成完整的Signature
。可以使用类似vsss-rs的crates或使用类似gennaro-dkg的分布式密钥生成方法生成SecretKeyShare
。
多签名是指针对同一消息进行签名的聚合签名。这允许签名压缩和非常快速的验证,前提是已经考虑了使用拥有权证明来防止恶意密钥攻击。目前,这个库仅提供拥有权证明方案,因为这是最广泛使用的。
聚合签名是指针对不同消息进行签名的聚合签名。虽然验证速度提升不大,但仍然允许签名压缩。
示例
密钥操作
从随机熵源
let sk = SecretKey::<Bls12381G1Impl>::random(rand_core::OsRng);
let pk = PublicKey::from(&sk);
let pop = ProofOfPossession::new(&sk).expect("a proof of possession");
assert_eq!(pop.verify(pk).unwrap_u8(), 1u8);
从种子
let sk = SecretKey::<Bls12381G1Impl>::hash(b"seed phrase");
let pk = PublicKey::from(&sk);
将密钥分割成密钥份额
let shares = sk.split::<rand_core::OsRng, 3, 5>(rand_core::OsRng);
从份额恢复密钥
let sk = SecretKey::<Bls12381G1Impl>::combine::<3, 5>(&shares);
签名操作
创建签名
let sig = Signature::new(&sk, b"00000000-0000-0000-0000-000000000000").expect("a valid signature");
验证签名
assert_eq!(sig.verify(pk, b"00000000-0000-0000-0000-000000000000").unwrap_u8(), 1u8);
许可证
许可方式为以下之一
- Apache许可证,版本2.0,(LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则根据Apache-2.0许可证定义的,你提交的任何旨在包含在作品中的贡献,都将如上所述双重许可,无需任何额外的条款或条件。
参考
依赖项
~4.5–6.5MB
~118K SLoC