#bls #bn256 #bn128 #crypto #bn

bn254

使用Rust编写的Barreto-Naehrig (BN)聚合签名的开源实现

1个不稳定版本

0.0.1 2023年2月10日

#2 in #bn128

MIT许可证

38KB
603

bn254

bn254是椭圆曲线BN254(Barreto-Naehrig (BN))上的聚合签名的一个开源Rust实现。

此曲线也被称为bn256bn128alt-bn128),指的是安全位。在Kim-Barbulescu的新算法之后,bn254的安全位从128下降到大约100。

免责声明:这是一个实验性软件。请小心使用!

使用方法

此模块使用substrate-bn库在适当的字段上执行椭圆曲线运算。它提供以下功能:

  • sign:使用密钥对消息进行签名。
  • verify:给定公钥、签名和消息,验证签名是否有效。

签名和公钥聚合可以使用+-运算符直接进行。

将哈希值映射到G1

将给定消息哈希到G1上的点的算法遵循“尝试并递增”方法。我们不建议在哈希秘密消息的情况下使用它,因为它的运行时间会泄露关于输入的信息。

在其他情况下,如果要哈希的消息是公开的,“尝试并递增”应该是安全的。所使用的哈希算法是sha256

示例

使用bn254曲线进行签名、聚合和验证

use bn254::{PrivateKey, PublicKey, ECDSA};

fn main() {
    // Inputs: Secret Key, Public Key (derived) & Message

    // Secret key one
    let private_key_1_bytes = hex::decode("c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721").unwrap();
    let private_key_1 = PrivateKey::try_from(private_key_1_bytes.as_ref()).unwrap();

    // Secret key two
    let private_key_2_bytes = hex::decode("a55e93edb1350916bf5beea1b13d8f198ef410033445bcb645b65be5432722f1").unwrap();
    let private_key_2 = PrivateKey::try_from(private_key_2_bytes.as_ref()).unwrap();

    // Derive public keys from secret key
    let public_key_1 = PublicKey::from_private_key(&private_key_1);
    let public_key_2 = PublicKey::from_private_key(&private_key_2);

    let message: &[u8] = b"sample";

    // Sign identical message with two different secret keys
    let signature_1 = ECDSA::sign(&message, &private_key_1).unwrap();
    let signature_2 = ECDSA::sign(&message, &private_key_2).unwrap();

    // Aggregate public keys
    let aggregate_pub_key = public_key_1 + public_key_2;

    // Aggregate signatures
    let aggregate_sig = signature_1 + signature_2;

    // Check whether the aggregate signature corresponds to the aggregated
    // public_key
    ECDSA::verify(&message, &aggregate_sig, &aggregate_pub_key).unwrap();
    println!("Successful aggregate signature verification");
}

许可证

bn254MIT许可证下发布

依赖关系

~1.3–2MB
~42K SLoC