0.1.0 |
|
---|
#13 在 #blind 中
12KB
242 代码行
盲RSA签名
作者盲化的RSASSA-PSS RSAE签名。
协议概述
客户端请求服务器对一个消息进行签名。服务器接收到消息,并返回签名。
使用该 (message, signature)
对,客户端可以本地计算第二个有效的 (message', signature')
对。
任何人都可以验证 (message', signature')
对是否适用于服务器的公钥,即使服务器之前没有看到这对,但除了客户端外,没有人可以将 (message', signature')
与 (message, signature)
链接起来。
使用该方案,服务器可以发行一个令牌并验证客户端是否拥有有效的令牌,而无法将这两个动作与同一客户端链接。
- 客户端创建一个随机消息,并用一个随机、秘密的因子对其进行盲化。
- 服务器接收到盲消息,对其进行签名并返回一个盲签名。
- 从盲签名和已知秘密因子中,客户端可以本地计算出一个
(message, signature)
对,该对可以使用服务器的公钥进行验证。 - 因此,任何人,包括服务器,都可以在以后验证
(message, signature)
是否有效,而不需要知道步骤2发生的时间。
该方案由David Chaum设计,最初用于匿名化DigiCash交易。
使用方法
let kp = KeyPair::generate(2048)?;
let (pk, sk) = (kp.pk, kp.sk);
let msg = b"test";
let blinding_result = pk.blind(msg)?;
let blind_sig = sk.blind_sign(&blinding_result.blind_msg)?;
let sig = pk.finalize(&blind_sig, &blinding_result.secret, &msg)?;
sig.verify(&pk, msg)?;
依赖项
~9MB
~168K SLoC