1 个不稳定版本
0.1.0 | 2020 年 5 月 5 日 |
---|
#1512 在 加密学
每月 58 次下载
35KB
431 行
bls-signatures-rs
bls-signatures-rs
是 Bonneh-Lynn-Shacham (BLS) 签名 的开源实现,使用 Rust 编写。目前这个实现仅支持 BN256 配对友好。
免责声明:这是一个实验性软件。请谨慎使用!
BN256
此模块使用 BN 库 在适当的字段上执行椭圆曲线操作。它基于 bn256 库提供了以下功能
derive_public_key
:给定一个密钥,从 bn256 曲线导出一个公钥。sign
:给定一个密钥对一条消息进行签名。verify
:给定一个公钥、一个签名和一个消息,验证签名是否有效。aggregate_public_keys
:将一组公钥聚合为一个单一的聚合公钥。aggregate_signatures
:将一组签名聚合为一个单一的聚合签名。
哈希到 G1
用于将给定消息哈希到 G1 中一个点的算法是尝试并增加。我们不建议在哈希秘密消息的情况下使用它,因为其运行时间会泄露关于输入的信息。在其他任何情况下,如果要哈希的消息是公开的,尝试并增加应该是安全的。使用的哈希算法是 sha256
。
示例
使用 BN256 曲线进行签名、聚合和验证
use bls_signatures_rs::MultiSignature;
use bls_signatures_rs::bn256::Bn256;
fn main() {
// Inputs: Secret Key, Public Key (derived) & Message
// Secret key one
let secret_key_1 =
hex::decode("c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721").unwrap();
// Secret key two
let secret_key_2 =
hex::decode("a55e93edb1350916bf5beea1b13d8f198ef410033445bcb645b65be5432722f1").unwrap();
// Derive public keys from secret key
let public_key_1 = Bn256.derive_public_key(&secret_key_1).unwrap();
let public_key_2 = Bn256.derive_public_key(&secret_key_2).unwrap();
let message: &[u8] = b"sample";
// Sign identical message with two different secret keys
let sig_1 = Bn256.sign(&secret_key_1, &message).unwrap();
let sig_2 = Bn256.sign(&secret_key_2, &message).unwrap();
// Aggregate public keys
let agg_pub_key = Bn256.aggregate_public_keys(&[&public_key_1, &public_key_2]).unwrap();
// Aggregate signatures
let agg_sig = Bn256.aggregate_signatures(&[&sig_1, &sig_2]).unwrap();
// Check whether the aggregated signature corresponds to the aggregated public key
let beta = Bn256.verify(&agg_sig, &message, &agg_pub_key).unwrap();
println!("Successful verification");
}
添加不受支持的曲线
此库定义了一个 MultiSignature 特征,可以扩展以使用不同的曲线和算法。
pub trait MultiSignature<PublicKey, SecretKey, Signature> {
type Error;
fn derive_public_key(&mut self, secret_key: SecretKey) -> Result<Vec<u8>, Self::Error>;
fn sign(&mut self, secret_key: SecretKey, message: &[u8]) -> Result<Vec<u8>, Self::Error>;
fn verify(
&mut self,
signature: Signature,
message: &[u8],
public_key: PublicKey,
) -> Result<(), Self::Error>;
fn aggregate_public_keys(&mut self, public_key: &[PublicKey]) -> Result<Vec<u8>, Self::Error>;
fn aggregate_signatures(&mut self, public_key: &[Signature]) -> Result<Vec<u8>, Self::Error>;
}
许可证
bls-signatures-rs
在 MIT 许可证 下发布
依赖关系
~5.5MB
~52K SLoC