2个版本
使用旧Rust 2015
0.7.2 | 2021年12月2日 |
---|---|
0.7.1 | 2021年12月2日 |
#1225 in 加密学
46KB
814 行
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, ¶ms);
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, ¶ms)
多重签名和验证(不受恶意公钥攻击影响但速度较慢)
多重签名
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, ¶ms)
OR
let vks = vec![&keypair1.vk, &keypair2.vk]
let avk = AggregatedVerKey::from_verkeys(vks);
assert!(asig.verify(&b, &avk, ¶ms));
多重签名和验证(易受恶意公钥攻击影响但速度快)
秘密密钥拥有证明(验证密钥上的签名)
生成签名密钥拥有证明
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, ¶ms)
多重签名
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, ¶ms)
OR
let vks = vec![&keypair1.vk, &keypair2.vk]
let avk = AggregatedVerKeyFast::from_verkeys(vks);
assert!(asig.verify(&b, &avk, ¶ms));
签名批量验证
使用 Signature::batch_verify
和 Signature::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, ¶ms);
// 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, ¶ms));
序列化和反序列化
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 也类似
依赖关系
~6MB
~116K SLoC