1个不稳定版本
0.1.0 | 2024年7月9日 |
---|
#1285 in 密码学
23KB
310 行
施诺尔协议
此存储库包含Claus-P. Schorr博士提出的各种施诺尔协议的Rust实现。
- 施诺尔识别协议
- 施诺尔签名方案
- 基于椭圆曲线密码学的施诺尔签名方案的变体
这是一个轻量级的库,以最简单的方式实现了协议,虽然协议交互性很高。尽管在使用前您需要考虑一些限制
- 使用 num-bigint。
- 当使用基于ECC的协议时,库选择曲线 p256 (即
secp256r1
,prime256v1
) 进行使用。
欢迎您贡献以消除(任何)限制(例如,使其更加灵活),同时保持简单原则。
施诺尔识别协议
该协议涉及 user
、issuer
和 verifier
,他们共享相同的参数,该参数可以通过 Identification::<Hash>::from_str
实例化。在以下示例中,变量 schnorr
是其实例化,而 i
是类型为 BigUInt
的身份。
// user interacts with issuer to get a certificate
let (iss_secret, iss_params) = schnorr.issue_params::<Rand>(i.clone());
let cert = schnorr.issue_certificate(iss_params);
// user presents the certificate to the verifier
let (ver_secret, ver_req) = schnorr.verification_request::<Rand>(cert);
// verifier challenges the user's knowledge of the secret
let challenge = schnorr
.verification_challenge::<Rand>(ver_req.clone())
.unwrap();
// user responds to the challenge
let ver_res = schnorr.verification_response(challenge.clone(), iss_secret, ver_secret);
// verifier verifies the response
assert!(schnorr.verification(ver_req, challenge, ver_res));
施诺尔签名方案
该方案从结构体 SignatureScheme<Hash>
开始。它可以由方法 from_str
实例化。在以下示例中,变量 schnorr
是其实例化。
let (key, public_key) = scheme.generate_key::<Rand>();
let message = "hello world".as_bytes();
let signature = scheme.sign::<Rand, _>(&key, &public_key, message);
assert!(scheme.verify(&public_key, message, &signature));
对于基于ECC的方案,使用结构体 SignatureSchemeECP256
,它可以通过 new
或 default
(因为使用的生成器是固定的) 实例化。
依赖关系
~3.5–4.5MB
~96K SLoC