#bls-signatures #bls #bn256 #bonneh-lynn-shacham

bls-signatures-rs

Bonneh-Lynn-Shacham (BLS) 签名在 Rust 中的开源实现

1 个不稳定版本

0.1.0 2020 年 5 月 5 日

#1512加密学

Download history 10/week @ 2024-03-09 18/week @ 2024-03-16 3/week @ 2024-03-23 17/week @ 2024-03-30 6/week @ 2024-04-06 2/week @ 2024-04-13 20/week @ 2024-04-27 18/week @ 2024-05-11 15/week @ 2024-05-25 29/week @ 2024-06-01 9/week @ 2024-06-08 8/week @ 2024-06-15 8/week @ 2024-06-22

每月 58 次下载

MIT 许可证

35KB
431

bls-signatures-rs

bls-signatures-rsBonneh-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-rsMIT 许可证 下发布

依赖关系

~5.5MB
~52K SLoC