#verification-key #threshold-signature #bls-signatures #signing-key #batch #multi-signature #algorithm

bls_acml

BLS签名。两种变体。支持多重签名、阈值签名和批量验证

2 个不稳定版本

使用旧的 Rust 2015

0.5.0 2019年11月5日
0.4.0 2019年11月2日

密码学 中排名第1896

Apache-2.0

45KB
763

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
~94K SLoC