2个不稳定版本

0.3.0 2022年6月17日
0.2.0 2022年6月16日

#1690密码学

MIT 许可证

370KB
219

deevee

一个提供指定验证者签名(DVS)实现的crate。

这是一个实验性的加密软件:自行承担风险使用。

这些签名与普通签名类似,但是签名者还在签名消息时指定了一个特殊的验证者。这会改变结果签名的两个方面

  1. 只有那个验证者可以验证签名。其他验证者会看到签名无效,实际上即使他们知道验证者是谁(只要他们不知道验证者的私钥或签名人),也无法判断签名是否有效。
  2. 验证者可以伪造指定自己的签名。这阻止了验证者说服其他人签名是有效的,因为验证者可能伪造了那个签名。

这在需要签名一些数据以说服某人但希望这种交互具有一定的否认性的情况下很有用。

这些实际上是Schnorr签名的一个变体,使用Ristretto曲线

示例

以下是一个示例,说明了crate的主要API

use deevee::*;
use rand_core::OsRng;

let (privA, pubA) = generate_keypair(&mut OsRng);
let (privB, pubB) = generate_keypair(&mut OsRng);
let (privC, pubC) = generate_keypair(&mut OsRng);

let sig = privA.sign(&mut OsRng, &pubB, b"I like cats");
// The signature verifies, because the designee matches
assert!(privB.verify(&pubA, b"I like cats", &sig));
// If we change the message, verification fails
assert!(!privB.verify(&pubA, b"I don't like cats", &sig));
// The signer won't verify with a different signer either
assert!(!privB.verify(&pubC, b"I like cats", &sig));
// The wrong verifier can't validate the signature either
assert!(!privC.verify(&pubA, b"I like cats", &sig));
// Finally, the verifier can forge a valid signature for themselves
let forged = privB.forge(&mut OsRng, &pubA, b"I don't like cats");
assert!(privB.verify(&pubA, b"I don't like cats", &forged));

详情

有关数学的更多详情请参见math.md

依赖项

~2MB
~39K SLoC