1个不稳定版本
使用旧的Rust 2015
0.3.0 | 2019年6月9日 |
---|
#2280 在 密码学 中
61 星 & 7 关注者
19KB
376 行
API
生成密钥
let keypair = Keypair::new(None);
OR
let rng = EntropyRng::new();
let keypair = Keypair::new(Some(rng));
let my_sk = keypair.sig_key;
let my_vk = keypair.ver_key;
签名
签名是一个交互式的3阶段过程。
-
每个签署者生成一个秘密随机数,对该随机数进行提交并创建该提交的哈希。在第一阶段,签署者生成这些并与其他签署者共享哈希...
let signer = Signer::new(num_cosigners); // num_cosigners is the total number of signers including the current signer signer.init_phase_1();
每个签署者给其他签署者一个从1开始的数字引用。这些引用仅限于签署者本地。
收到由引用为j
的签署者提供的哈希h
后,它调用got_hash
signer.got_hash(h, j).unwrap();
-
一旦一个签署者从所有其他签署者获得了提交的哈希,它就与其他签署者共享其提交。
收到由引用为j
的签署者提供的提交c
后,它调用got_commitment
。got_commitment
检查第一阶段中的哈希是否为该提交。
请注意,只有当它已从所有其他签署者那里获得哈希时,才能调用got_commitment
。这可以通过调用is_phase_1_complete
来检查signer.got_commitment(c, j).unwrap();
-
一旦一个签署者从所有其他签署者那里获得了提交,它就使用
generate_sig
生成其签名。
请注意,只有当它已从所有其他签署者那里获得了提交时,才能调用generate_sig
。这可以通过调用is_phase_2_complete
来检查let msg = "Message to sign"; let msg_b = msg.as_bytes(); let all_verkeys = vec![my_vk, others_vk, ....]; let sig = signer.generate_sig(msg_b, &keypair.sig_key, &keypair.ver_key, &all_verkeys).unwrap();
generate_sig
创建一个聚合验证密钥和签署者在聚合验证密钥中的贡献。这两个都不依赖于随机数或消息,而是依赖于签署者组。因此,当相同的签署者组创建许多此类签名时,仅计算一次聚合值然后将其重用于所有后续签名会更有效。let L = HashedVerKeys::new(&all_verkeys); let a = L.hash_with_verkey(&keypair.ver_key); let sig = Signer::generate_sig_using_aggregated_objs(msg_b, &keypair.sig_key, &nonce, &keypair.ver_key, &aggregate_nonce, &a, &aggregate_verkey);
签名聚合和验证
签名聚合
一旦签名人生成他们的签名,它们可以一起汇总。
let signatures = vec![sig1, sig2];
let aggr_sig = AggregatedSignature::new(&signatures);
汇总签名验证
任何拥有所有验证密钥的人都可以使用 verify
来验证汇总签名。
assert!(aggr_sig.verify(msg_b, &all_verkeys));
verify
将创建汇总的验证密钥。当需要使用相同的合签者组验证多个签名时,一次性创建汇总的验证密钥并使用它来验证签名会更有效。
let avk = AggregatedVerKey::new(&all_verkeys);
assert!(aggr_sig.verify_using_aggregated_verkey(b, &avk));
序列化和反序列化
let bs: Vec<u8> = vec![1, 5, 190, 200, ......]
let sk = SigKey::from_bytes(&bs);
let sk_bytes = sk.tobytes();
let vk = VerKey::from_bytes(&bs);
let vk_bytes = vk.tobytes();
Similar for AggregatedVerKey
依赖项
~0.6–0.9MB
~12K SLoC