1个不稳定版本
0.0.1 | 2023年2月10日 |
---|
#2 in #bn128
38KB
603 行
bn254
bn254
是椭圆曲线BN254(Barreto-Naehrig (BN))上的聚合签名的一个开源Rust实现。
此曲线也被称为bn256
或bn128
(alt-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");
}
许可证
bn254
在MIT许可证下发布
依赖关系
~1.3–2MB
~42K SLoC