1个不稳定版本

使用旧的Rust 2015

0.3.0 2019年6月9日

#2280密码学

61 星 & 7 关注者

Apache-2.0

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阶段过程。

  1. 每个签署者生成一个秘密随机数,对该随机数进行提交并创建该提交的哈希。在第一阶段,签署者生成这些并与其他签署者共享哈希...

    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();
    
  2. 一旦一个签署者从所有其他签署者获得了提交的哈希,它就与其他签署者共享其提交。
    收到由引用为 j 的签署者提供的提交 c 后,它调用 got_commitmentgot_commitment 检查第一阶段中的哈希是否为该提交。
    请注意,只有当它已从所有其他签署者那里获得哈希时,才能调用 got_commitment。这可以通过调用 is_phase_1_complete 来检查

     signer.got_commitment(c, j).unwrap();
    
  3. 一旦一个签署者从所有其他签署者那里获得了提交,它就使用 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