2个不稳定版本
0.3.0 | 2024年4月17日 |
---|---|
0.2.0 | 2024年4月16日 |
#1662 在 加密学
每月 34 下载次数
47KB
948 行
lamport_signature
lamport_signature_plus 是 Lamport一次签名方案 的实现。
文档
文档可在此处获取: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 或 ExtendableOutputFunction
。 SigningKey
、VerifyingKey
和 Signature
类型是针对所使用的哈希函数进行泛化的。
门限签名
此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,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
供您选择。
贡献
除非您明确声明,否则任何旨在包含在作品中并由您有意提交的贡献,根据Apache-2.0许可证的定义,应按上述方式许可,无需附加条款或条件。
依赖
~4MB
~65K SLoC