1个不稳定版本

0.1.0 2024年7月9日

#1285 in 密码学

Apache-2.0

23KB
310

施诺尔协议

此存储库包含Claus-P. Schorr博士提出的各种施诺尔协议的Rust实现。

  • 施诺尔识别协议
  • 施诺尔签名方案
  • 基于椭圆曲线密码学的施诺尔签名方案的变体

这是一个轻量级的库,以最简单的方式实现了协议,虽然协议交互性很高。尽管在使用前您需要考虑一些限制

  • 使用 num-bigint
  • 当使用基于ECC的协议时,库选择曲线 p256 (即 secp256r1, prime256v1) 进行使用。

欢迎您贡献以消除(任何)限制(例如,使其更加灵活),同时保持简单原则。

施诺尔识别协议

该协议涉及 userissuerverifier,他们共享相同的参数,该参数可以通过 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,它可以通过 newdefault (因为使用的生成器是固定的) 实例化。

依赖关系

~3.5–4.5MB
~96K SLoC