#blind #signatures #rsa #signature #crypto

blind-rsa-signatures

纯Rust实现的RSA盲签名

21个版本

0.15.1 2024年6月10日
0.15.0 2023年2月10日
0.14.1 2022年12月16日
0.13.0 2022年7月2日
0.9.0 2021年2月26日

密码学 类别下排名 854

Download history 1593/week @ 2024-05-03 1900/week @ 2024-05-10 1812/week @ 2024-05-17 1753/week @ 2024-05-24 1228/week @ 2024-05-31 2379/week @ 2024-06-07 1818/week @ 2024-06-14 1008/week @ 2024-06-21 1083/week @ 2024-06-28 1202/week @ 2024-07-05 1550/week @ 2024-07-12 1586/week @ 2024-07-19 1548/week @ 2024-07-26 1430/week @ 2024-08-02 1600/week @ 2024-08-09 992/week @ 2024-08-16

每月下载量 5,873
5crate中(直接使用4个)

MIT 许可证保护

29KB
573

GitHub CI Docs.rs crates.io

盲RSA签名

作者盲化的RSASSA-PSS RSAE签名。

这是基于RSA盲签名 RFC的实现,基于Zig实现

协议概述

客户端请求服务器对一条消息进行签名。服务器接收到消息后,返回签名。

使用(message, signature)对,客户端可以本地计算第二个有效的(message', signature')对。

任何人都可以验证(message', signature')对于服务器的公钥是有效的,尽管服务器之前没有看到这对,但除了客户端之外,没有人可以将(message', signature')(message, signature)关联起来。

使用该方案,服务器可以发行令牌并验证客户端拥有有效的令牌,而无法将这两个操作与同一客户端关联起来。

  1. 客户端创建一个随机消息,并用一个随机、秘密的因子对其进行盲化。
  2. 服务器接收到盲消息,对其进行签名并返回盲签名。
  3. 从盲签名和已知的秘密因子中,客户端可以本地计算出一个可以由服务器的公钥验证的(message, signature)对。
  4. 因此,任何人,包括服务器,都可以在以后验证(message, signature)是有效的,而不需要知道第二步何时发生。

该方案由David Chaum设计,最初用于匿名化DigiCash交易。

用法

use blind_rsa_signatures::{KeyPair, Options};
let options = Options::default();
let rng = &mut rand::thread_rng();

// [SERVER]: Generate a RSA-2048 key pair
let kp = KeyPair::generate(rng, 2048)?;
let (pk, sk) = (kp.pk, kp.sk);

// [CLIENT]: create a random message and blind it for the server whose public key is `pk`.
// The client must store the message and the secret.
let msg = b"test";
let blinding_result = pk.blind(rng, msg, true, &options)?;

// [SERVER]: compute a signature for a blind message, to be sent to the client.
// The client secret should not be sent to the server.
let blind_sig = sk.blind_sign(rng, &blinding_result.blind_msg, &options)?;

// [CLIENT]: later, when the client wants to redeem a signed blind message,
// using the blinding secret, it can locally compute the signature of the
// original message.
// The client then owns a new valid (message, signature) pair, and the
// server cannot link it to a previous(blinded message, blind signature) pair.
// Note that the finalization function also verifies that the new signature
// is correct for the server public key.
let sig = pk.finalize(
    &blind_sig,
    &blinding_result.secret,
    blinding_result.msg_randomizer,
    &msg,
    &options,
)?;

// [SERVER]: a non-blind signature can be verified using the server's public key.
sig.verify(&pk, blinding_result.msg_randomizer, msg, &options)?;

此crate还包括导入和导出密钥的实用函数。

其他语言

依赖关系

~5.5MB
~118K SLoC