2个不稳定版本

使用旧的Rust 2015

0.7.0 2019年11月20日
0.6.0 2019年11月17日

#2158 in 密码学

48 每月下载量

Apache-2.0

46KB
802

BLS签名

概述

验证密钥、消息和签名的组可以通过使用功能标志进行配置。
当使用功能 SignatureG1 时,签名和消息在G1中,验证密钥在G2中,这使得签名更便宜但验证更昂贵。当使用功能 SignatureG2 时,签名和消息在G2中,验证密钥在G1中,这使得签名更昂贵但验证更便宜。
默认功能是 SignatureG2 以保持验证速度快。
提供了两种创建多重签名的变体,一个需要证明拥有权以避免恶意密钥攻击并且速度快。另一个不需要证明拥有权但较慢。前者在 multi_sig_fast.rs 中,后者在 multi_sig_slow.rs 中。两种变体仅在签名和验证密钥聚合方面有所不同。每个签名的签名算法保持不变。验证算法也保持不变。还支持批量验证。可以创建阈值签名,但当前实现的关键生成需要可信第三方,但无需更改签名聚合或验证密钥聚合机制,可以使用无需可信第三方的密钥生成机制。

API

生成所有签名者和验证者在系统中使用的参数。为了模拟随机预言机,将公开知名字符串散列到一个生成群元素

let params = Params::new("some publicly known string".as_bytes());

生成密钥

let mut rng = thread_rng();
let keypair = Keypair::new(&mut rng, &params);


let sk = keypair.sig_key;
let vk = keypair.ver_key;

签名

let msg = "Message to sign";
let b = msg.as_bytes();
let sig = Signature::new(&b, &sk);

验证

sig.verify(&b, &vk, &params)

多重签名和验证(不受恶意公钥攻击的影响但较慢)

多重签名

let keypair1 = Keypair::new(None);
let keypair2 = Keypair::new(None);
let msg = "Small msg";
let b = m.as_bytes();
let sig1 = Signature::new(&b, &keypair1.sig_key);
let sig2 = Signature::new(&b, &keypair2.sig_key);
let sigs_and_ver_keys: Vec<(&Signature, &VerKey)> = vec![(&sig1, &keypair1.vk), (&sig2, &keypair2.vk)]
let asig = MultiSignature::from_sigs(sigs_and_ver_keys);

多重签名验证

let vks = vec![&keypair1.vk, &keypair2.vk]
MultiSignature::verify(&asig, &b, vks, &params)
        OR
let vks = vec![&keypair1.vk, &keypair2.vk]
let avk = AggregatedVerKey::from_verkeys(vks);
assert!(asig.verify(&b, &avk, &params));

多重签名和验证(易受恶意公钥攻击但速度快)

秘密密钥拥有权的证明(对验证密钥的签名)

生成签名密钥拥有权的证明
let keypair = Keypair::new(None);
let sk = keypair.sig_key;
let vk = keypair.ver_key;

let proof = ProofOfPossession::generate(&vk, &sk);
验证签名密钥拥有权的证明
ProofOfPossession::verify(&proof, &vk, &params)

多重签名

let keypair1 = Keypair::new(None);
let keypair2 = Keypair::new(None);
let msg = "Small msg";
let b = m.as_bytes();
let sig1 = Signature::new(&b, &keypair1.sig_key);
let sig2 = Signature::new(&b, &keypair2.sig_key);
let sigs: Vec<&Signature> = vec![&sig1, &sig2]
let asig = MultiSignatureFast::from_sigs(sigs);

多重签名验证

let vks = vec![&keypair1.vk, &keypair2.vk]
MultiSignatureFast::verify(&asig, &b, vks, &params)
        OR
let vks = vec![&keypair1.vk, &keypair2.vk]
let avk = AggregatedVerKeyFast::from_verkeys(vks);
assert!(asig.verify(&b, &avk, &params));

签名批量验证

使用 Signature::batch_verifySignature::batch_verify_distinct_msgs 进行批量验证。前者
不假设消息是不同的,但后者是。对于它们的速度比较,运行测试 batch_verify

阈值签名

// To generate keys using a trusted third party
let threshold = 3;
let total = 5;
let params = Params::new("test".as_bytes());
let (_, signers) = trusted_party_SSS_keygen(threshold, total, &params);

// Once threshold no of signatures are present, use ThresholdScheme::aggregate_sigs
let threshold_sig = ThresholdScheme::aggregate_sigs(threshold, sigs);

// Once threshold no of keys are present, use ThresholdScheme::aggregate_vk
let threshold_vk = ThresholdScheme::aggregate_vk(
            threshold,
            signers
                .iter()
                .map(|s| (s.id, &s.verkey))
                .collect::<Vec<(usize, &VerKey)>>(),
        );

// Now the threshold sig can be verified like a regular signature
assert!(threshold_sig.verify(&msg, &threshold_vk, &params));

序列化和反序列化

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();

let sig = Signature::from_bytes(&bs).unwrap();
let sig_bytes = sig.tobytes();

对于其他对象如 AggregatedVerKey、MultiSignature、AggregatedVerKeyFast、MultiSignatureFast 等也是类似的。

依赖关系

~5MB
~93K SLoC