2 个不稳定版本

0.2.0 2023 年 2 月 21 日
0.1.0 2022 年 9 月 15 日

#1114算法

Download history 250/week @ 2024-04-12 232/week @ 2024-04-19 253/week @ 2024-04-26 478/week @ 2024-05-03 358/week @ 2024-05-10 363/week @ 2024-05-17 241/week @ 2024-05-24 152/week @ 2024-05-31 277/week @ 2024-06-07 510/week @ 2024-06-14 473/week @ 2024-06-21 219/week @ 2024-06-28 334/week @ 2024-07-05 171/week @ 2024-07-12 51/week @ 2024-07-19 36/week @ 2024-07-26

625 次每月下载
用于 cait-sith

MIT 许可证

305KB
157

Magikitten

使用 Meow 使公共币协议非交互式。

这个库也深受 Merlin 的启发,提供类似的构建方法,尽管有一些差异。

使用方法

使用库的本质是初始化一个 Transcript 对象,然后交替输入数据和提取随机数。

use rand_core::RngCore;
use magikitten::Transcript;

let mut transcript = Transcript::new(b"my cool protocol");
transcript.message(b"message0", b"hello world!");
let c0 = transcript.challenge(b"challenge0").next_u64();
transcript.message(b"message1", b"hello world again!");
let c1 = transcript.challenge(b"challenge1").next_u64();

challenge 函数更新转录本的状态,然后提供一个实现 RngCore 的对象,允许提取任意随机数。这个随机数(不可预测地)依赖于到目前为止的转录本状态,但其他方面是确定的。你用来创建挑战 RNG 的标签也会影响转录本,但 RNG 的状态是独立的,并且使用 RNG 的方式不会影响转录本。实现 RngCore 允许你使用挑战 RNG 生成任意复杂的对象。例如,可以进行拒绝采样或其他复杂技术。

顺序组合

在大多数情况下,你应该编写接受 Transcript 作为参数的方案,而不是自己创建它。

这允许方案按顺序组合,通过一个方案使用另一个方案交互的运行转录本。

与 Merlin 的差异

这个库深受 Merlin 的启发,基本上服务于相同的用例。尽管有一些差异。

Magikitten 使用减少轮次排列

我们使用 KitTen(Keccak 只用 10 轮),而不是使用 24 轮的 Keccak。这使得协议更快,但显然更易受 Keccak 密码分析潜在进步的影响。

有关使用 KitTen 的更多理由,请参阅 Meow

挑战是一串字节

Merlin要求您指定挑战的长度,然后它将生成相应长度的挑战。另一方面,Magikitten提供给您一个任意的RNG对象。我认为这使得库更容易使用,因为许多函数可以轻松地编写以接受实现RngCore特质的对象。一些采样算法,如拒绝采样,如果需要提前知道要采样的位数长度,则效果不佳。

此外,RNG对象是从transcript中播种的,然后变得独立。具有独立状态,您查询RNG位的方式不会影响transcript的其余部分。这更直观,因为看似等效的行为不会改变结果。例如,如果您使用字节数组缓冲区进行拒绝采样,增加此缓冲区大小不会影响您使用Magikitten获得的结果,因为RNG可以被视为一个简单的无限字节流。

在Merlin中,记录了每个RNG查询的长度,因此不同的RNG查询模式会改变结果。

不支持私有RNG

目前,Magikitten不支持私有随机性。但这可能是未来可能会添加的功能。

依赖项

~0.6–1.1MB
~19K SLoC