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
每月下载量 5,873
在 5 个crate中(直接使用4个)
29KB
573 行
盲RSA签名
作者盲化的RSASSA-PSS RSAE签名。
协议概述
客户端请求服务器对一条消息进行签名。服务器接收到消息后,返回签名。
使用(message, signature)
对,客户端可以本地计算第二个有效的(message', signature')
对。
任何人都可以验证(message', signature')
对于服务器的公钥是有效的,尽管服务器之前没有看到这对,但除了客户端之外,没有人可以将(message', signature')
与(message, signature)
关联起来。
使用该方案,服务器可以发行令牌并验证客户端拥有有效的令牌,而无法将这两个操作与同一客户端关联起来。
- 客户端创建一个随机消息,并用一个随机、秘密的因子对其进行盲化。
- 服务器接收到盲消息,对其进行签名并返回盲签名。
- 从盲签名和已知的秘密因子中,客户端可以本地计算出一个可以由服务器的公钥验证的
(message, signature)
对。 - 因此,任何人,包括服务器,都可以在以后验证
(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