#签名 #签名方案 #lamports #加密 #随机

lamport_signature_plus

Lamport一次签名方案的实现

2个不稳定版本

0.3.0 2024年4月17日
0.2.0 2024年4月16日

#1662加密学

每月 34 下载次数

MIT/Apache

47KB
948

lamport_signature

Crates.io docs.rs GitHub license

lamport_signature_plusLamport一次签名方案 的实现。

文档

文档可在此处获取:https://docs.rs/lamport_signature_plus.

使用方法

use lamport_signature::{VerifyingKey, SigningKey, LamportFixedDigest};
use sha2::Sha256;
use rand::thread_rng;

let mut signing_key = SigningKey::<LamportFixedDigest<Sha256>>::random(thread_rng());
let verifying_key = VerifyingKey::from(&signing_key);

let signature = signing_key.sign(b"Hello, World!").expect("signing failed");

assert!(verifying_key.verify(&signature, b"Hello, World!").is_ok());

此crate支持任何实现了 Digest 特性的哈希函数,来自 digest crate 或 ExtendableOutputFunctionSigningKeyVerifyingKeySignature 类型是针对所使用的哈希函数进行泛化的。

门限签名

此crate通过首先将 SigningKey 分割成份额,并从每个份额创建 SignatureShare 来支持门限签名。然后可以使用 combine 方法将这些 SignatureShare 合并成一个 Signature

use lamport_signature::{VerifyingKey, SigningKey, LamportFixedDigest};
use sha2::Sha256;

let mut rng = rand_chacha::ChaCha8Rng::from_seed(SEED);
let (sk, pk) = generate_keys::<LamportFixedDigest<Sha256>, _>(&mut rng);
let message = b"hello, world!";
let mut shares = sk.split(3, 5, &mut rng).unwrap();
let signatures = shares
    .iter_mut()
    .map(|share| share.sign(message).unwrap())
    .collect::<Vec<_>>();

let res = Signature::combine(&signatures[..3]);
assert!(res.is_ok());
let signature = res.unwrap();
assert!(pk.verify(&signature, message).is_ok());

许可证

许可证

许可证为以下之一

供您选择。

贡献

除非您明确声明,否则任何旨在包含在作品中并由您有意提交的贡献,根据Apache-2.0许可证的定义,应按上述方式许可,无需附加条款或条件。

依赖

~4MB
~65K SLoC